From 8d523c0604d799ca88f02b0921191e14a21c1052 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 3 Apr 2023 17:21:11 -0600 Subject: [PATCH 001/417] enable fix rigid to support 2d enforcement internally --- src/RIGID/fix_rigid.cpp | 314 +++++++++++++++-------------- src/RIGID/fix_rigid.h | 2 +- src/RIGID/fix_rigid_small.cpp | 368 ++++++++++++++++++---------------- src/RIGID/fix_rigid_small.h | 3 +- src/fix.cpp | 1 - src/fix.h | 2 - src/fix_enforce2d.cpp | 36 +--- src/fix_enforce2d.h | 4 - 8 files changed, 361 insertions(+), 369 deletions(-) diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index df49d84439..0d6cbe86ee 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -68,7 +68,6 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : thermo_virial = 1; create_attribute = 1; dof_flag = 1; - enforce2d_flag = 1; centroidstressflag = CENTROID_NOTAVAIL; MPI_Comm_rank(world,&me); @@ -77,6 +76,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class + dimension = domain->dimension; extended = orientflag = dorientflag = 0; body = nullptr; xcmimage = nullptr; @@ -301,7 +301,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nbody; i++) { fflag[i][0] = fflag[i][1] = fflag[i][2] = 1.0; tflag[i][0] = tflag[i][1] = tflag[i][2] = 1.0; - if (domain->dimension == 2) fflag[i][2] = tflag[i][0] = tflag[i][1] = 0.0; + if (dimension == 2) fflag[i][2] = tflag[i][0] = tflag[i][1] = 0.0; } // number of linear rigid bodies is counted later @@ -328,7 +328,6 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : pcouple = NONE; pstyle = ANISO; - dimension = domain->dimension; for (i = 0; i < 3; i++) { p_start[i] = p_stop[i] = p_period[i] = 0.0; @@ -353,7 +352,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg+4],"on") == 0) zflag = 1.0; else error->all(FLERR,"Illegal fix rigid command"); - if (domain->dimension == 2 && zflag == 1.0) + if (dimension == 2 && zflag == 1.0) error->all(FLERR,"Fix rigid z force cannot be on for 2d simulation"); int count = 0; @@ -384,7 +383,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg+4],"on") == 0) zflag = 1.0; else error->all(FLERR,"Illegal fix rigid command"); - if (domain->dimension == 2 && (xflag == 1.0 || yflag == 1.0)) + if (dimension == 2 && (xflag == 1.0 || yflag == 1.0)) error->all(FLERR,"Fix rigid xy torque cannot be on for 2d simulation"); int count = 0; @@ -434,7 +433,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { - p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; @@ -450,7 +449,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; - p_flag[2] = 0; + p_flag[2] = 0; } iarg += 4; @@ -856,6 +855,10 @@ void FixRigid::setup(int vflag) torque[ibody][2] = all[ibody][2]; } + // enforce 2d body forces and torques + + if (dimension == 2) enforce2d(); + // zero langextra in case Langevin thermostat not used // no point to calling post_force() here since langextra // is only added to fcm/torque in final_integrate() @@ -936,6 +939,131 @@ void FixRigid::initial_integrate(int vflag) set_xv(); } +/* ---------------------------------------------------------------------- + remap xcm of each rigid body back into periodic simulation box + done during pre_neighbor so will be after call to pbc() + and after fix_deform::pre_exchange() may have flipped box + use domain->remap() in case xcm is far away from box + due to first-time definition of rigid body in setup_bodies_static() + or due to box flip + also adjust imagebody = rigid body image flags, due to xcm remap + also reset body xcmimage flags of all atoms in bodies + xcmimage flags are relative to xcm so that body can be unwrapped + if don't do this, would need xcm to move with true image flags + then a body could end up very far away from box + set_xv() will then compute huge displacements every step to + reset coords of all body atoms to be back inside the box, + ditto for triclinic box flip, which causes numeric problems +------------------------------------------------------------------------- */ + +void FixRigid::pre_neighbor() +{ + for (int ibody = 0; ibody < nbody; ibody++) + domain->remap(xcm[ibody],imagebody[ibody]); + image_shift(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigid::post_force(int /*vflag*/) +{ + if (langflag) apply_langevin_thermostat(); + if (earlyflag) compute_forces_and_torques(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigid::final_integrate() +{ + int ibody; + double dtfm; + + // compute forces and torques (after all post_force contributions) + // if 2d model, enforce2d() on body forces/torques + + if (!earlyflag) compute_forces_and_torques(); + if (dimension == 2) enforce2d(); + + // update vcm and angmom + // fflag,tflag = 0 for some dimensions in 2d + + for (ibody = 0; ibody < nbody; ibody++) { + + // update vcm by 1/2 step + + dtfm = dtf / masstotal[ibody]; + vcm[ibody][0] += dtfm * fcm[ibody][0] * fflag[ibody][0]; + vcm[ibody][1] += dtfm * fcm[ibody][1] * fflag[ibody][1]; + vcm[ibody][2] += dtfm * fcm[ibody][2] * fflag[ibody][2]; + + // update angular momentum by 1/2 step + + angmom[ibody][0] += dtf * torque[ibody][0] * tflag[ibody][0]; + angmom[ibody][1] += dtf * torque[ibody][1] * tflag[ibody][1]; + angmom[ibody][2] += dtf * torque[ibody][2] * tflag[ibody][2]; + + MathExtra::angmom_to_omega(angmom[ibody],ex_space[ibody],ey_space[ibody], + ez_space[ibody],inertia[ibody],omega[ibody]); + } + + // set velocity/rotation of atoms in rigid bodies + // virial is already setup from initial_integrate + + set_v(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigid::initial_integrate_respa(int vflag, int ilevel, int /*iloop*/) +{ + dtv = step_respa[ilevel]; + dtf = 0.5 * step_respa[ilevel] * force->ftm2v; + dtq = 0.5 * step_respa[ilevel]; + + if (ilevel == 0) initial_integrate(vflag); + else final_integrate(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigid::final_integrate_respa(int ilevel, int /*iloop*/) +{ + dtf = 0.5 * step_respa[ilevel] * force->ftm2v; + final_integrate(); +} + +/* ---------------------------------------------------------------------- + reset body xcmimage flags of atoms in bodies + xcmimage flags are relative to xcm so that body can be unwrapped + xcmimage = true image flag - imagebody flag +------------------------------------------------------------------------- */ + +void FixRigid::image_shift() +{ + int ibody; + imageint tdim,bdim,xdim[3]; + + imageint *image = atom->image; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (body[i] < 0) continue; + ibody = body[i]; + + tdim = image[i] & IMGMASK; + bdim = imagebody[ibody] & IMGMASK; + xdim[0] = IMGMAX + tdim - bdim; + tdim = (image[i] >> IMGBITS) & IMGMASK; + bdim = (imagebody[ibody] >> IMGBITS) & IMGMASK; + xdim[1] = IMGMAX + tdim - bdim; + tdim = image[i] >> IMG2BITS; + bdim = imagebody[ibody] >> IMG2BITS; + xdim[2] = IMGMAX + tdim - bdim; + + xcmimage[i] = (xdim[2] << IMG2BITS) | (xdim[1] << IMGBITS) | xdim[0]; + } +} + /* ---------------------------------------------------------------------- apply Langevin thermostat to all 6 DOF of rigid bodies computed by proc 0, broadcast to other procs @@ -991,31 +1119,6 @@ void FixRigid::apply_langevin_thermostat() MPI_Bcast(&langextra[0][0],6*nbody,MPI_DOUBLE,0,world); } -/* ---------------------------------------------------------------------- - called from FixEnforce2d post_force() for 2d problems - zero all body values that should be zero for 2d model -------------------------------------------------------------------------- */ - -void FixRigid::enforce2d() -{ - for (int ibody = 0; ibody < nbody; ibody++) { - xcm[ibody][2] = 0.0; - vcm[ibody][2] = 0.0; - fcm[ibody][2] = 0.0; - torque[ibody][0] = 0.0; - torque[ibody][1] = 0.0; - angmom[ibody][0] = 0.0; - angmom[ibody][1] = 0.0; - omega[ibody][0] = 0.0; - omega[ibody][1] = 0.0; - if (langflag && langextra) { - langextra[ibody][2] = 0.0; - langextra[ibody][3] = 0.0; - langextra[ibody][4] = 0.0; - } - } -} - /* ---------------------------------------------------------------------- */ void FixRigid::compute_forces_and_torques() @@ -1093,124 +1196,28 @@ void FixRigid::compute_forces_and_torques() } } -/* ---------------------------------------------------------------------- */ - -void FixRigid::post_force(int /*vflag*/) -{ - if (langflag) apply_langevin_thermostat(); - if (earlyflag) compute_forces_and_torques(); -} - -/* ---------------------------------------------------------------------- */ - -void FixRigid::final_integrate() -{ - int ibody; - double dtfm; - - if (!earlyflag) compute_forces_and_torques(); - - // update vcm and angmom - // fflag,tflag = 0 for some dimensions in 2d - - for (ibody = 0; ibody < nbody; ibody++) { - - // update vcm by 1/2 step - - dtfm = dtf / masstotal[ibody]; - vcm[ibody][0] += dtfm * fcm[ibody][0] * fflag[ibody][0]; - vcm[ibody][1] += dtfm * fcm[ibody][1] * fflag[ibody][1]; - vcm[ibody][2] += dtfm * fcm[ibody][2] * fflag[ibody][2]; - - // update angular momentum by 1/2 step - - angmom[ibody][0] += dtf * torque[ibody][0] * tflag[ibody][0]; - angmom[ibody][1] += dtf * torque[ibody][1] * tflag[ibody][1]; - angmom[ibody][2] += dtf * torque[ibody][2] * tflag[ibody][2]; - - MathExtra::angmom_to_omega(angmom[ibody],ex_space[ibody],ey_space[ibody], - ez_space[ibody],inertia[ibody],omega[ibody]); - } - - // set velocity/rotation of atoms in rigid bodies - // virial is already setup from initial_integrate - - set_v(); -} - -/* ---------------------------------------------------------------------- */ - -void FixRigid::initial_integrate_respa(int vflag, int ilevel, int /*iloop*/) -{ - dtv = step_respa[ilevel]; - dtf = 0.5 * step_respa[ilevel] * force->ftm2v; - dtq = 0.5 * step_respa[ilevel]; - - if (ilevel == 0) initial_integrate(vflag); - else final_integrate(); -} - -/* ---------------------------------------------------------------------- */ - -void FixRigid::final_integrate_respa(int ilevel, int /*iloop*/) -{ - dtf = 0.5 * step_respa[ilevel] * force->ftm2v; - final_integrate(); -} - /* ---------------------------------------------------------------------- - remap xcm of each rigid body back into periodic simulation box - done during pre_neighbor so will be after call to pbc() - and after fix_deform::pre_exchange() may have flipped box - use domain->remap() in case xcm is far away from box - due to first-time definition of rigid body in setup_bodies_static() - or due to box flip - also adjust imagebody = rigid body image flags, due to xcm remap - also reset body xcmimage flags of all atoms in bodies - xcmimage flags are relative to xcm so that body can be unwrapped - if don't do this, would need xcm to move with true image flags - then a body could end up very far away from box - set_xv() will then compute huge displacements every step to - reset coords of all body atoms to be back inside the box, - ditto for triclinic box flip, which causes numeric problems + called from FixEnforce2d post_force() for 2d problems + zero all body values that should be zero for 2d model ------------------------------------------------------------------------- */ -void FixRigid::pre_neighbor() +void FixRigid::enforce2d() { - for (int ibody = 0; ibody < nbody; ibody++) - domain->remap(xcm[ibody],imagebody[ibody]); - image_shift(); -} - -/* ---------------------------------------------------------------------- - reset body xcmimage flags of atoms in bodies - xcmimage flags are relative to xcm so that body can be unwrapped - xcmimage = true image flag - imagebody flag -------------------------------------------------------------------------- */ - -void FixRigid::image_shift() -{ - int ibody; - imageint tdim,bdim,xdim[3]; - - imageint *image = atom->image; - int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; i++) { - if (body[i] < 0) continue; - ibody = body[i]; - - tdim = image[i] & IMGMASK; - bdim = imagebody[ibody] & IMGMASK; - xdim[0] = IMGMAX + tdim - bdim; - tdim = (image[i] >> IMGBITS) & IMGMASK; - bdim = (imagebody[ibody] >> IMGBITS) & IMGMASK; - xdim[1] = IMGMAX + tdim - bdim; - tdim = image[i] >> IMG2BITS; - bdim = imagebody[ibody] >> IMG2BITS; - xdim[2] = IMGMAX + tdim - bdim; - - xcmimage[i] = (xdim[2] << IMG2BITS) | (xdim[1] << IMGBITS) | xdim[0]; + for (int ibody = 0; ibody < nbody; ibody++) { + xcm[ibody][2] = 0.0; + vcm[ibody][2] = 0.0; + fcm[ibody][2] = 0.0; + torque[ibody][0] = 0.0; + torque[ibody][1] = 0.0; + angmom[ibody][0] = 0.0; + angmom[ibody][1] = 0.0; + omega[ibody][0] = 0.0; + omega[ibody][1] = 0.0; + if (langflag && langextra) { + langextra[ibody][2] = 0.0; + langextra[ibody][3] = 0.0; + langextra[ibody][4] = 0.0; + } } } @@ -1280,7 +1287,7 @@ int FixRigid::dof(int tgroup) int n = 0; nlinear = 0; - if (domain->dimension == 3) { + if (dimension == 3) { for (int ibody = 0; ibody < nbody; ibody++) if (nall[ibody]+mall[ibody] == nrigid[ibody]) { n += 3*nall[ibody] + 6*mall[ibody] - 6; @@ -1290,7 +1297,7 @@ int FixRigid::dof(int tgroup) nlinear++; } } - } else if (domain->dimension == 2) { + } else if (dimension == 2) { for (int ibody = 0; ibody < nbody; ibody++) if (nall[ibody]+mall[ibody] == nrigid[ibody]) n += 2*nall[ibody] + 3*mall[ibody] - 3; @@ -1382,6 +1389,7 @@ void FixRigid::set_xv() // x = displacement from center-of-mass, based on body orientation // v = vcm + omega around center-of-mass + // enforce 2d x and v MathExtra::matvec(ex_space[ibody],ey_space[ibody], ez_space[ibody],displace[i],x[i]); @@ -1390,6 +1398,11 @@ void FixRigid::set_xv() v[i][1] = omega[ibody][2]*x[i][0] - omega[ibody][0]*x[i][2] + vcm[ibody][1]; v[i][2] = omega[ibody][0]*x[i][1] - omega[ibody][1]*x[i][0] + vcm[ibody][2]; + if (dimension == 2) { + x[i][2] = 0.0; + v[i][2] = 0.0; + } + // add center of mass to displacement // map back into periodic box via xbox,ybox,zbox // for triclinic, add in box tilt factors as well @@ -1541,10 +1554,15 @@ void FixRigid::set_v() v2 = v[i][2]; } + // compute new v + // enforce 2d v + v[i][0] = omega[ibody][1]*delta[2] - omega[ibody][2]*delta[1] + vcm[ibody][0]; v[i][1] = omega[ibody][2]*delta[0] - omega[ibody][0]*delta[2] + vcm[ibody][1]; v[i][2] = omega[ibody][0]*delta[1] - omega[ibody][1]*delta[0] + vcm[ibody][2]; + if (dimension == 2) v[i][2] = 0.0; + // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external // assume f does not include forces internal to body diff --git a/src/RIGID/fix_rigid.h b/src/RIGID/fix_rigid.h index 1e94adec09..df0bcbda0c 100644 --- a/src/RIGID/fix_rigid.h +++ b/src/RIGID/fix_rigid.h @@ -50,7 +50,6 @@ class FixRigid : public Fix { void pre_neighbor() override; int dof(int) override; void deform(int) override; - void enforce2d() override; void reset_dt() override; void zero_momentum() override; void zero_rotation() override; @@ -147,6 +146,7 @@ class FixRigid : public Fix { void setup_bodies_dynamic(); void apply_langevin_thermostat(); void compute_forces_and_torques(); + void enforce2d(); void readfile(int, double *, double **, double **, double **, imageint *, int *); }; diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 089c644f1e..4f678cb14c 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -72,7 +72,6 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : thermo_virial = 1; create_attribute = 1; dof_flag = 1; - enforce2d_flag = 1; stores_ids = 1; centroidstressflag = CENTROID_AVAIL; @@ -82,6 +81,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class + dimension = domain->dimension; extended = orientflag = dorientflag = customflag = 0; bodyown = nullptr; bodytag = nullptr; @@ -258,8 +258,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; - if (domain->dimension == 2) { - p_start[2] = p_stop[2] = p_period[2] = 0.0; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; @@ -273,9 +273,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; - if (domain->dimension == 2) { + if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; - p_flag[2] = 0; + p_flag[2] = 0; } iarg += 4; @@ -383,7 +383,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < 3; i++) if (p_flag[i]) pstat_flag = 1; - if (pcouple == XYZ || (domain->dimension == 2 && pcouple == XY)) pstyle = ISO; + if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; // create rigid bodies based on molecule or custom ID @@ -690,6 +690,10 @@ void FixRigidSmall::setup(int vflag) } } + // enforce 2d body forces and torques + + if (dimension == 2) enforce2d(); + // reverse communicate fcm, torque of all bodies commflag = FORCE_TORQUE; @@ -780,6 +784,151 @@ void FixRigidSmall::initial_integrate(int vflag) set_xv(); } +/* ---------------------------------------------------------------------- + remap xcm of each rigid body back into periodic simulation box + done during pre_neighbor so will be after call to pbc() + and after fix_deform::pre_exchange() may have flipped box + use domain->remap() in case xcm is far away from box + due to first-time definition of rigid body in setup_bodies_static() + or due to box flip + also adjust imagebody = rigid body image flags, due to xcm remap + then communicate bodies so other procs will know of changes to body xcm + then adjust xcmimage flags of all atoms in bodies via image_shift() + for two effects + (1) change in true image flags due to pbc() call during exchange + (2) change in imagebody due to xcm remap + xcmimage flags are always -1,0,-1 so that body can be unwrapped + around in-box xcm and stay close to simulation box + if just inferred unwrapped from atom image flags, + then a body could end up very far away + when unwrapped by true image flags + then set_xv() will compute huge displacements every step to reset coords of + all the body atoms to be back inside the box, ditto for triclinic box flip + note: so just want to avoid that numeric problem? +------------------------------------------------------------------------- */ + +void FixRigidSmall::pre_neighbor() +{ + for (int ibody = 0; ibody < nlocal_body; ibody++) { + Body *b = &body[ibody]; + domain->remap(b->xcm,b->image); + } + + nghost_body = 0; + commflag = FULL_BODY; + comm->forward_comm(this); + reset_atom2body(); + //check(4); + + image_shift(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigidSmall::post_force(int /*vflag*/) +{ + if (langflag) apply_langevin_thermostat(); + if (earlyflag) compute_forces_and_torques(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigidSmall::final_integrate() +{ + double dtfm; + + //check(3); + + // compute forces and torques (after all post_force contributions) + // if 2d model, enforce2d() on body forces/torques + + if (!earlyflag) compute_forces_and_torques(); + if (dimension == 2) enforce2d(); + + // update vcm and angmom, recompute omega + + for (int ibody = 0; ibody < nlocal_body; ibody++) { + Body *b = &body[ibody]; + + // update vcm by 1/2 step + + dtfm = dtf / b->mass; + b->vcm[0] += dtfm * b->fcm[0]; + b->vcm[1] += dtfm * b->fcm[1]; + b->vcm[2] += dtfm * b->fcm[2]; + + // update angular momentum by 1/2 step + + b->angmom[0] += dtf * b->torque[0]; + b->angmom[1] += dtf * b->torque[1]; + b->angmom[2] += dtf * b->torque[2]; + + MathExtra::angmom_to_omega(b->angmom,b->ex_space,b->ey_space, + b->ez_space,b->inertia,b->omega); + } + + // forward communicate updated info of all bodies + + commflag = FINAL; + comm->forward_comm(this,10); + + // set velocity/rotation of atoms in rigid bodies + // virial is already setup from initial_integrate + + set_v(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigidSmall::initial_integrate_respa(int vflag, int ilevel, int /*iloop*/) +{ + dtv = step_respa[ilevel]; + dtf = 0.5 * step_respa[ilevel] * force->ftm2v; + dtq = 0.5 * step_respa[ilevel]; + + if (ilevel == 0) initial_integrate(vflag); + else final_integrate(); +} + +/* ---------------------------------------------------------------------- */ + +void FixRigidSmall::final_integrate_respa(int ilevel, int /*iloop*/) +{ + dtf = 0.5 * step_respa[ilevel] * force->ftm2v; + final_integrate(); +} + +/* ---------------------------------------------------------------------- + reset body xcmimage flags of atoms in bodies + xcmimage flags are relative to xcm so that body can be unwrapped + xcmimage = true image flag - imagebody flag +------------------------------------------------------------------------- */ + +void FixRigidSmall::image_shift() +{ + imageint tdim,bdim,xdim[3]; + + imageint *image = atom->image; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (atom2body[i] < 0) continue; + Body *b = &body[atom2body[i]]; + + tdim = image[i] & IMGMASK; + bdim = b->image & IMGMASK; + xdim[0] = IMGMAX + tdim - bdim; + tdim = (image[i] >> IMGBITS) & IMGMASK; + bdim = (b->image >> IMGBITS) & IMGMASK; + xdim[1] = IMGMAX + tdim - bdim; + tdim = image[i] >> IMG2BITS; + bdim = b->image >> IMG2BITS; + xdim[2] = IMGMAX + tdim - bdim; + + xcmimage[i] = (xdim[2] << IMG2BITS) | (xdim[1] << IMGBITS) | xdim[0]; + } +} + /* ---------------------------------------------------------------------- apply Langevin thermostat to all 6 DOF of rigid bodies I own unlike fix langevin, this stores extra force in extra arrays, @@ -845,52 +994,9 @@ void FixRigidSmall::apply_langevin_thermostat() // convert langevin torques from body frame back to space frame MathExtra::matvec(ex_space,ey_space,ez_space,tbody,&langextra[ibody][3]); - - // enforce 2d motion - - if (domain->dimension == 2) - langextra[ibody][2] = langextra[ibody][3] = langextra[ibody][4] = 0.0; } } -/* ---------------------------------------------------------------------- - called from FixEnforce post_force() for 2d problems - zero all body values that should be zero for 2d model -------------------------------------------------------------------------- */ - -void FixRigidSmall::enforce2d() -{ - Body *b; - - for (int ibody = 0; ibody < nlocal_body; ibody++) { - b = &body[ibody]; - b->xcm[2] = 0.0; - b->vcm[2] = 0.0; - b->fcm[2] = 0.0; - b->xgc[2] = 0.0; - b->torque[0] = 0.0; - b->torque[1] = 0.0; - b->angmom[0] = 0.0; - b->angmom[1] = 0.0; - b->omega[0] = 0.0; - b->omega[1] = 0.0; - if (langflag && langextra) { - langextra[ibody][2] = 0.0; - langextra[ibody][3] = 0.0; - langextra[ibody][4] = 0.0; - } - } -} - -/* ---------------------------------------------------------------------- */ - -void FixRigidSmall::post_force(int /*vflag*/) -{ - if (langflag) apply_langevin_thermostat(); - if (earlyflag) compute_forces_and_torques(); -} - - /* ---------------------------------------------------------------------- */ void FixRigidSmall::compute_forces_and_torques() @@ -988,136 +1094,32 @@ void FixRigidSmall::compute_forces_and_torques() } } -/* ---------------------------------------------------------------------- */ - -void FixRigidSmall::final_integrate() -{ - double dtfm; - - //check(3); - - if (!earlyflag) compute_forces_and_torques(); - - // update vcm and angmom, recompute omega - - for (int ibody = 0; ibody < nlocal_body; ibody++) { - Body *b = &body[ibody]; - - // update vcm by 1/2 step - - dtfm = dtf / b->mass; - b->vcm[0] += dtfm * b->fcm[0]; - b->vcm[1] += dtfm * b->fcm[1]; - b->vcm[2] += dtfm * b->fcm[2]; - - // update angular momentum by 1/2 step - - b->angmom[0] += dtf * b->torque[0]; - b->angmom[1] += dtf * b->torque[1]; - b->angmom[2] += dtf * b->torque[2]; - - MathExtra::angmom_to_omega(b->angmom,b->ex_space,b->ey_space, - b->ez_space,b->inertia,b->omega); - } - - // forward communicate updated info of all bodies - - commflag = FINAL; - comm->forward_comm(this,10); - - // set velocity/rotation of atoms in rigid bodies - // virial is already setup from initial_integrate - - set_v(); -} - -/* ---------------------------------------------------------------------- */ - -void FixRigidSmall::initial_integrate_respa(int vflag, int ilevel, int /*iloop*/) -{ - dtv = step_respa[ilevel]; - dtf = 0.5 * step_respa[ilevel] * force->ftm2v; - dtq = 0.5 * step_respa[ilevel]; - - if (ilevel == 0) initial_integrate(vflag); - else final_integrate(); -} - -/* ---------------------------------------------------------------------- */ - -void FixRigidSmall::final_integrate_respa(int ilevel, int /*iloop*/) -{ - dtf = 0.5 * step_respa[ilevel] * force->ftm2v; - final_integrate(); -} - /* ---------------------------------------------------------------------- - remap xcm of each rigid body back into periodic simulation box - done during pre_neighbor so will be after call to pbc() - and after fix_deform::pre_exchange() may have flipped box - use domain->remap() in case xcm is far away from box - due to first-time definition of rigid body in setup_bodies_static() - or due to box flip - also adjust imagebody = rigid body image flags, due to xcm remap - then communicate bodies so other procs will know of changes to body xcm - then adjust xcmimage flags of all atoms in bodies via image_shift() - for two effects - (1) change in true image flags due to pbc() call during exchange - (2) change in imagebody due to xcm remap - xcmimage flags are always -1,0,-1 so that body can be unwrapped - around in-box xcm and stay close to simulation box - if just inferred unwrapped from atom image flags, - then a body could end up very far away - when unwrapped by true image flags - then set_xv() will compute huge displacements every step to reset coords of - all the body atoms to be back inside the box, ditto for triclinic box flip - note: so just want to avoid that numeric problem? + called from FixEnforce post_force() for 2d problems + zero all body values that should be zero for 2d model ------------------------------------------------------------------------- */ -void FixRigidSmall::pre_neighbor() +void FixRigidSmall::enforce2d() { + Body *b; + for (int ibody = 0; ibody < nlocal_body; ibody++) { - Body *b = &body[ibody]; - domain->remap(b->xcm,b->image); - } - - nghost_body = 0; - commflag = FULL_BODY; - comm->forward_comm(this); - reset_atom2body(); - //check(4); - - image_shift(); -} - -/* ---------------------------------------------------------------------- - reset body xcmimage flags of atoms in bodies - xcmimage flags are relative to xcm so that body can be unwrapped - xcmimage = true image flag - imagebody flag -------------------------------------------------------------------------- */ - -void FixRigidSmall::image_shift() -{ - imageint tdim,bdim,xdim[3]; - - imageint *image = atom->image; - int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; i++) { - if (atom2body[i] < 0) continue; - Body *b = &body[atom2body[i]]; - - tdim = image[i] & IMGMASK; - bdim = b->image & IMGMASK; - xdim[0] = IMGMAX + tdim - bdim; - tdim = (image[i] >> IMGBITS) & IMGMASK; - bdim = (b->image >> IMGBITS) & IMGMASK; - xdim[1] = IMGMAX + tdim - bdim; - tdim = image[i] >> IMG2BITS; - bdim = b->image >> IMG2BITS; - xdim[2] = IMGMAX + tdim - bdim; - - xcmimage[i] = (xdim[2] << IMG2BITS) | (xdim[1] << IMGBITS) | xdim[0]; + b = &body[ibody]; + b->xcm[2] = 0.0; + b->vcm[2] = 0.0; + b->fcm[2] = 0.0; + b->xgc[2] = 0.0; + b->torque[0] = 0.0; + b->torque[1] = 0.0; + b->angmom[0] = 0.0; + b->angmom[1] = 0.0; + b->omega[0] = 0.0; + b->omega[1] = 0.0; + if (langflag && langextra) { + langextra[ibody][2] = 0.0; + langextra[ibody][3] = 0.0; + langextra[ibody][4] = 0.0; + } } } @@ -1200,7 +1202,7 @@ int FixRigidSmall::dof(int tgroup) int n = 0; nlinear = 0; - if (domain->dimension == 3) { + if (dimension == 3) { for (int ibody = 0; ibody < nlocal_body; ibody++) { if (counts[ibody][0]+counts[ibody][1] == counts[ibody][2]) { n += 3*counts[ibody][0] + 6*counts[ibody][1] - 6; @@ -1211,7 +1213,7 @@ int FixRigidSmall::dof(int tgroup) } } } - } else if (domain->dimension == 2) { + } else if (dimension == 2) { for (int ibody = 0; ibody < nlocal_body; ibody++) if (counts[ibody][0]+counts[ibody][1] == counts[ibody][2]) n += 2*counts[ibody][0] + 3*counts[ibody][1] - 3; @@ -1297,13 +1299,19 @@ void FixRigidSmall::set_xv() // x = displacement from center-of-mass, based on body orientation // v = vcm + omega around center-of-mass - + // enforce 2d x and v + MathExtra::matvec(b->ex_space,b->ey_space,b->ez_space,displace[i],x[i]); v[i][0] = b->omega[1]*x[i][2] - b->omega[2]*x[i][1] + b->vcm[0]; v[i][1] = b->omega[2]*x[i][0] - b->omega[0]*x[i][2] + b->vcm[1]; v[i][2] = b->omega[0]*x[i][1] - b->omega[1]*x[i][0] + b->vcm[2]; + if (dimension == 2) { + x[i][2] = 0.0; + v[i][2] = 0.0; + } + // add center of mass to displacement // map back into periodic box via xbox,ybox,zbox // for triclinic, add in box tilt factors as well @@ -1345,6 +1353,7 @@ void FixRigidSmall::set_xv() } // update the position of geometric center + for (int ibody = 0; ibody < nlocal_body + nghost_body; ibody++) { Body *b = &body[ibody]; MathExtra::matvec(b->ex_space,b->ey_space,b->ez_space, @@ -1462,10 +1471,15 @@ void FixRigidSmall::set_v() v2 = v[i][2]; } + // compute new v + // enforce 2d v + v[i][0] = b->omega[1]*delta[2] - b->omega[2]*delta[1] + b->vcm[0]; v[i][1] = b->omega[2]*delta[0] - b->omega[0]*delta[2] + b->vcm[1]; v[i][2] = b->omega[0]*delta[1] - b->omega[1]*delta[0] + b->vcm[2]; + if (dimension == 2) v[i][2] = 0.0; + // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external // assume f does not include forces internal to body diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index b473026fdb..144b2aad70 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -56,7 +56,6 @@ class FixRigidSmall : public Fix { void pre_neighbor() override; int dof(int) override; void deform(int) override; - void enforce2d() override; void reset_dt() override; void zero_momentum() override; void zero_rotation() override; @@ -72,6 +71,7 @@ class FixRigidSmall : public Fix { double dtv, dtf, dtq; double *step_respa; int triclinic; + int dimension; char *inpfile; // file to read rigid body attributes from int setupflag; // 1 if body properties are setup, else 0 @@ -203,6 +203,7 @@ class FixRigidSmall : public Fix { void setup_bodies_dynamic(); void apply_langevin_thermostat(); void compute_forces_and_torques(); + void enforce2d(); void readfile(int, double **, int *); void grow_body(); void reset_atom2body(); diff --git a/src/fix.cpp b/src/fix.cpp index 9b50d872ea..372134f8eb 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -72,7 +72,6 @@ Fix::Fix(LAMMPS *lmp, int /*narg*/, char **arg) : dynamic = 0; dof_flag = 0; special_alter_flag = 0; - enforce2d_flag = 0; respa_level_support = 0; respa_level = -1; maxexchange = 0; diff --git a/src/fix.h b/src/fix.h index ea82c1677b..958ae05d95 100644 --- a/src/fix.h +++ b/src/fix.h @@ -72,7 +72,6 @@ class Fix : protected Pointers { int dynamic_group_allow; // 1 if can be used with dynamic group, else 0 int dof_flag; // 1 if has dof() method (not min_dof()) int special_alter_flag; // 1 if has special_alter() meth for spec lists - int enforce2d_flag; // 1 if has enforce2d method int respa_level_support; // 1 if fix supports fix_modify respa int respa_level; // which respa level to apply fix (1-Nrespa) int maxexchange; // max # of per-atom values for Comm::exchange() @@ -236,7 +235,6 @@ class Fix : protected Pointers { virtual void deform(int) {} virtual void reset_target(double) {} virtual void reset_dt() {} - virtual void enforce2d() {} virtual void read_data_header(char *) {} virtual void read_data_section(char *, int, char *, tagint) {} diff --git a/src/fix_enforce2d.cpp b/src/fix_enforce2d.cpp index c6816c2355..c13e2147a3 100644 --- a/src/fix_enforce2d.cpp +++ b/src/fix_enforce2d.cpp @@ -27,12 +27,9 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixEnforce2D::FixEnforce2D(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - flist(nullptr) + Fix(lmp, narg, arg) { if (narg != 3) error->all(FLERR,"Illegal fix enforce2d command"); - - nfixlist = 0; } /* ---------------------------------------------------------------------- */ @@ -40,8 +37,6 @@ FixEnforce2D::FixEnforce2D(LAMMPS *lmp, int narg, char **arg) : FixEnforce2D::~FixEnforce2D() { if (copymode) return; - - delete [] flist; } /* ---------------------------------------------------------------------- */ @@ -61,29 +56,6 @@ void FixEnforce2D::init() { if (domain->dimension == 3) error->all(FLERR,"Cannot use fix enforce2d with 3d simulation"); - - // list of fixes with enforce2d methods - - nfixlist = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->enforce2d_flag) nfixlist++; - - if (nfixlist) { - int myindex = -1; - delete [] flist; - flist = new Fix*[nfixlist]; - nfixlist = 0; - for (int i = 0; i < modify->nfix; i++) { - if (modify->fix[i]->enforce2d_flag) { - if (myindex < 0) - flist[nfixlist++] = modify->fix[i]; - else - error->all(FLERR,"Fix enforce2d must be defined after fix {}", - modify->fix[i]->style); - } - if (modify->fix[i] == this) myindex = i; - } - } } /* ---------------------------------------------------------------------- */ @@ -153,12 +125,6 @@ void FixEnforce2D::post_force(int /*vflag*/) torque[i][1] = 0.0; } } - - // invoke other fixes that enforce 2d - // fix rigid variants - - for (int m = 0; m < nfixlist; m++) - flist[m]->enforce2d(); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_enforce2d.h b/src/fix_enforce2d.h index 4572785158..95429ba7dc 100644 --- a/src/fix_enforce2d.h +++ b/src/fix_enforce2d.h @@ -35,10 +35,6 @@ class FixEnforce2D : public Fix { void post_force(int) override; void post_force_respa(int, int, int) override; void min_post_force(int) override; - - protected: - int nfixlist; - class Fix **flist; }; } // namespace LAMMPS_NS From ac465baf80b388c8ad6837e89128857e542bbf94 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Apr 2023 22:29:50 -0400 Subject: [PATCH 002/417] fix compilation issue with KOKKOS --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index 11402e4568..24cf307827 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -17,15 +17,14 @@ ------------------------------------------------------------------------- */ #include "fix_enforce2d_kokkos.h" + #include "atom_masks.h" #include "atom_kokkos.h" #include "comm.h" #include "error.h" - using namespace LAMMPS_NS; - template FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char **arg) : FixEnforce2D(lmp, narg, arg) @@ -34,21 +33,16 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; - datamask_read = V_MASK | F_MASK | OMEGA_MASK | MASK_MASK - | TORQUE_MASK | ANGMOM_MASK; - - datamask_modify = V_MASK | F_MASK | OMEGA_MASK - | TORQUE_MASK | ANGMOM_MASK; + datamask_read = V_MASK | F_MASK | OMEGA_MASK | MASK_MASK | TORQUE_MASK | ANGMOM_MASK; + datamask_modify = V_MASK | F_MASK | OMEGA_MASK | TORQUE_MASK | ANGMOM_MASK; } - template void FixEnforce2DKokkos::setup(int vflag) { post_force(vflag); } - template void FixEnforce2DKokkos::post_force(int /*vflag*/) { @@ -66,7 +60,6 @@ void FixEnforce2DKokkos::post_force(int /*vflag*/) if (atomKK->torque_flag) torque = atomKK->k_torque.view(); - mask = atomKK->k_mask.view(); int nlocal = atomKK->nlocal; @@ -125,13 +118,6 @@ void FixEnforce2DKokkos::post_force(int /*vflag*/) copymode = 0; atomKK->modified(execution_space,datamask_modify); - - for (int m = 0; m < nfixlist; m++) { - atomKK->sync(flist[m]->execution_space,flist[m]->datamask_read); - flist[m]->enforce2d(); - atomKK->modified(flist[m]->execution_space,flist[m]->datamask_modify); - } - } From d2565bb1e2fcc2b210c09a0ff55a742dd6e2b635 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Apr 2023 22:30:30 -0400 Subject: [PATCH 003/417] port changes to OPENMP --- src/OPENMP/fix_rigid_nh_omp.cpp | 65 ++++++++++++++------ src/OPENMP/fix_rigid_nh_omp.h | 4 +- src/OPENMP/fix_rigid_omp.cpp | 80 ++++++++++++++++-------- src/OPENMP/fix_rigid_omp.h | 4 +- src/OPENMP/fix_rigid_small_omp.cpp | 98 ++++++++++++++++++++---------- src/OPENMP/fix_rigid_small_omp.h | 4 +- 6 files changed, 175 insertions(+), 80 deletions(-) diff --git a/src/OPENMP/fix_rigid_nh_omp.cpp b/src/OPENMP/fix_rigid_nh_omp.cpp index 2f1b81fd5b..78dcd96f22 100644 --- a/src/OPENMP/fix_rigid_nh_omp.cpp +++ b/src/OPENMP/fix_rigid_nh_omp.cpp @@ -211,16 +211,31 @@ void FixRigidNHOMP::initial_integrate(int vflag) // set coords/orient and velocity/rotation of atoms in rigid bodies // from quarternion and omega - if (triclinic) - if (evflag) - set_xv_thr<1,1>(); - else - set_xv_thr<1,0>(); - else - if (evflag) - set_xv_thr<0,1>(); - else - set_xv_thr<0,0>(); + if (dimension == 2) { + if (triclinic) { + if (evflag) + set_xv_thr<1,1,2>(); + else + set_xv_thr<1,0,2>(); + } else { + if (evflag) + set_xv_thr<0,1,2>(); + else + set_xv_thr<0,0,2>(); + } + } else { + if (triclinic) { + if (evflag) + set_xv_thr<1,1,3>(); + else + set_xv_thr<1,0,3>(); + } else { + if (evflag) + set_xv_thr<0,1,3>(); + else + set_xv_thr<0,0,3>(); + } + } // remap simulation box by full step // redo KSpace coeffs since volume has changed @@ -503,13 +518,23 @@ void FixRigidNHOMP::final_integrate() // virial is already setup from initial_integrate // triclinic only matters for virial calculation. - if (evflag) - if (triclinic) - set_v_thr<1,1>(); + if (dimension == 2) { + if (evflag) + if (triclinic) + set_v_thr<1,1,2>(); + else + set_v_thr<0,1,2>(); else - set_v_thr<0,1>(); - else - set_v_thr<0,0>(); + set_v_thr<0,0,2>(); + } else { + if (evflag) + if (triclinic) + set_v_thr<1,1,3>(); + else + set_v_thr<0,1,3>(); + else + set_v_thr<0,0,3>(); + } // compute current temperature if (tcomputeflag) t_current = temperature->compute_scalar(); @@ -603,7 +628,7 @@ void FixRigidNHOMP::remap() NOTE: this needs to be kept in sync with FixRigidOMP ------------------------------------------------------------------------- */ -template +template void FixRigidNHOMP::set_xv_thr() { auto * _noalias const x = (dbl3_t *) atom->x[0]; @@ -665,6 +690,8 @@ void FixRigidNHOMP::set_xv_thr() v[i].y = omegai.z*x[i].x - omegai.x*x[i].z + vcmi.y; v[i].z = omegai.x*x[i].y - omegai.y*x[i].x + vcmi.z; + if (DIMENSION == 2) x[i].z = v[i].z = 0.0; + // add center of mass to displacement // map back into periodic box via xbox,ybox,zbox // for triclinic, add in box tilt factors as well @@ -803,7 +830,7 @@ void FixRigidNHOMP::set_xv_thr() NOTE: this needs to be kept in sync with FixRigidOMP ------------------------------------------------------------------------- */ -template +template void FixRigidNHOMP::set_v_thr() { auto * _noalias const x = (dbl3_t *) atom->x[0]; @@ -852,6 +879,8 @@ void FixRigidNHOMP::set_v_thr() v[i].y = omegai.z*delta[0] - omegai.x*delta[2] + vcmi.y; v[i].z = omegai.x*delta[1] - omegai.y*delta[0] + vcmi.z; + if (DIMENSION == 2) v[i].z = 0.0; + // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external // assume f does not include forces internal to body diff --git a/src/OPENMP/fix_rigid_nh_omp.h b/src/OPENMP/fix_rigid_nh_omp.h index 6b70841058..dcd893b161 100644 --- a/src/OPENMP/fix_rigid_nh_omp.h +++ b/src/OPENMP/fix_rigid_nh_omp.h @@ -30,8 +30,8 @@ class FixRigidNHOMP : public FixRigidNH { virtual void compute_forces_and_torques(); private: // copied from FixRigidOMP - template void set_xv_thr(); - template void set_v_thr(); + template void set_xv_thr(); + template void set_v_thr(); }; } // namespace LAMMPS_NS diff --git a/src/OPENMP/fix_rigid_omp.cpp b/src/OPENMP/fix_rigid_omp.cpp index de381415a0..e2c6e653bc 100644 --- a/src/OPENMP/fix_rigid_omp.cpp +++ b/src/OPENMP/fix_rigid_omp.cpp @@ -16,33 +16,35 @@ Contributing author: Axel Kohlmeyer (Temple U) ------------------------------------------------------------------------- */ -#include "omp_compat.h" #include "fix_rigid_omp.h" -#include -#include #include "atom.h" #include "atom_vec_ellipsoid.h" #include "atom_vec_line.h" #include "atom_vec_tri.h" #include "comm.h" -#include "error.h" #include "domain.h" +#include "error.h" +#include "math_const.h" +#include "math_extra.h" +#include "rigid_const.h" + +#include +#include #if defined(_OPENMP) #include #endif - -#include "math_extra.h" -#include "math_const.h" -#include "rigid_const.h" +#include "omp_compat.h" using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; using namespace RigidConst; -typedef struct { double x,y,z; } dbl3_t; +typedef struct { + double x, y, z; +} dbl3_t; /* ---------------------------------------------------------------------- */ @@ -92,16 +94,32 @@ void FixRigidOMP::initial_integrate(int vflag) // set coords/orient and velocity/rotation of atoms in rigid bodies // from quarternion and omega - if (triclinic) - if (evflag) - set_xv_thr<1,1>(); - else - set_xv_thr<1,0>(); - else - if (evflag) - set_xv_thr<0,1>(); - else - set_xv_thr<0,0>(); + if (dimension == 2) { + if (triclinic) { + if (evflag) + set_xv_thr<1,1,2>(); + else + set_xv_thr<1,0,2>(); + } else { + if (evflag) + set_xv_thr<0,1,2>(); + else + set_xv_thr<0,0,2>(); + } + } else { + + if (triclinic) { + if (evflag) + set_xv_thr<1,1,3>(); + else + set_xv_thr<1,0,3>(); + } else { + if (evflag) + set_xv_thr<0,1,3>(); + else + set_xv_thr<0,0,3>(); + } + } } /* ---------------------------------------------------------------------- */ @@ -306,13 +324,23 @@ void FixRigidOMP::final_integrate() // virial is already setup from initial_integrate // triclinic only matters for virial calculation. + if (dimension == 2) { if (evflag) if (triclinic) - set_v_thr<1,1>(); + set_v_thr<1,1,2>(); else - set_v_thr<0,1>(); + set_v_thr<0,1,2>(); else - set_v_thr<0,0>(); + set_v_thr<0,0,2>(); + } else { + if (evflag) + if (triclinic) + set_v_thr<1,1,3>(); + else + set_v_thr<0,1,3>(); + else + set_v_thr<0,0,3>(); + } } /* ---------------------------------------------------------------------- @@ -323,7 +351,7 @@ void FixRigidOMP::final_integrate() NOTE: this needs to be kept in sync with FixRigidNHOMP ------------------------------------------------------------------------- */ -template +template void FixRigidOMP::set_xv_thr() { auto * _noalias const x = (dbl3_t *) atom->x[0]; @@ -385,6 +413,8 @@ void FixRigidOMP::set_xv_thr() v[i].y = omegai.z*x[i].x - omegai.x*x[i].z + vcmi.y; v[i].z = omegai.x*x[i].y - omegai.y*x[i].x + vcmi.z; + if (DIMENSION == 2) x[i].z = v[i].z = 0.0; + // add center of mass to displacement // map back into periodic box via xbox,ybox,zbox // for triclinic, add in box tilt factors as well @@ -523,7 +553,7 @@ void FixRigidOMP::set_xv_thr() NOTE: this needs to be kept in sync with FixRigidNHOMP ------------------------------------------------------------------------- */ -template +template void FixRigidOMP::set_v_thr() { auto * _noalias const x = (dbl3_t *) atom->x[0]; @@ -572,6 +602,8 @@ void FixRigidOMP::set_v_thr() v[i].y = omegai.z*delta[0] - omegai.x*delta[2] + vcmi.y; v[i].z = omegai.x*delta[1] - omegai.y*delta[0] + vcmi.z; + if (DIMENSION == 2) v[i].z = 0.0; + // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external // assume f does not include forces internal to body diff --git a/src/OPENMP/fix_rigid_omp.h b/src/OPENMP/fix_rigid_omp.h index 679dff7508..618ce5ddf7 100644 --- a/src/OPENMP/fix_rigid_omp.h +++ b/src/OPENMP/fix_rigid_omp.h @@ -35,8 +35,8 @@ class FixRigidOMP : public FixRigid { virtual void compute_forces_and_torques(); private: - template void set_xv_thr(); - template void set_v_thr(); + template void set_xv_thr(); + template void set_v_thr(); }; } // namespace LAMMPS_NS diff --git a/src/OPENMP/fix_rigid_small_omp.cpp b/src/OPENMP/fix_rigid_small_omp.cpp index e11b98b7e1..0eda964368 100644 --- a/src/OPENMP/fix_rigid_small_omp.cpp +++ b/src/OPENMP/fix_rigid_small_omp.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -16,31 +15,36 @@ Contributing author: Axel Kohlmeyer (Temple U) ------------------------------------------------------------------------- */ -#include "omp_compat.h" #include "fix_rigid_small_omp.h" -#include + #include "atom.h" #include "atom_vec_ellipsoid.h" #include "atom_vec_line.h" #include "atom_vec_tri.h" #include "comm.h" #include "domain.h" +#include "math_const.h" +#include "math_extra.h" +#include "rigid_const.h" + +#include + +#include "omp_compat.h" #if defined(_OPENMP) #include #endif -#include "math_extra.h" -#include "math_const.h" -#include "rigid_const.h" - using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; using namespace RigidConst; -typedef struct { double x,y,z; } dbl3_t; +typedef struct { + double x, y, z; +} dbl3_t; +// clang-format off /* ---------------------------------------------------------------------- */ void FixRigidSmallOMP::initial_integrate(int vflag) @@ -94,16 +98,32 @@ void FixRigidSmallOMP::initial_integrate(int vflag) // set coords/orient and velocity/rotation of atoms in rigid bodies - if (triclinic) - if (evflag) - set_xv_thr<1,1>(); - else - set_xv_thr<1,0>(); - else - if (evflag) - set_xv_thr<0,1>(); - else - set_xv_thr<0,0>(); + if (dimension == 2) { + if (triclinic) { + if (evflag) + set_xv_thr<1,1,2>(); + else + set_xv_thr<1,0,2>(); + } else { + + if (evflag) + set_xv_thr<0,1,2>(); + else + set_xv_thr<0,0,2>(); + } + } else { + if (triclinic) { + if (evflag) + set_xv_thr<1,1,3>(); + else + set_xv_thr<1,0,3>(); + } else { + if (evflag) + set_xv_thr<0,1,3>(); + else + set_xv_thr<0,0,3>(); + } + } } /* ---------------------------------------------------------------------- */ @@ -218,6 +238,7 @@ void FixRigidSmallOMP::compute_forces_and_torques() void FixRigidSmallOMP::final_integrate() { if (!earlyflag) compute_forces_and_torques(); + if (dimension == 2) enforce2d(); // update vcm and angmom, recompute omega @@ -253,24 +274,34 @@ void FixRigidSmallOMP::final_integrate() // virial is already setup from initial_integrate // triclinic only matters for virial calculation. - if (evflag) - if (triclinic) - set_v_thr<1,1>(); + if (dimension == 2) { + if (evflag) { + if (triclinic) + set_v_thr<1,1,2>(); + else + set_v_thr<0,1,2>(); + } else { + set_v_thr<0,0,2>(); + } + } else { + if (evflag) + if (triclinic) + set_v_thr<1,1,3>(); + else + set_v_thr<0,1,3>(); else - set_v_thr<0,1>(); - else - set_v_thr<0,0>(); + set_v_thr<0,0,3>(); + } } - /* ---------------------------------------------------------------------- set space-frame coords and velocity of each atom in each rigid body set orientation and rotation of extended particles x = Q displace + Xcm, mapped back to periodic box v = Vcm + (W cross (x - Xcm)) -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ -template +template void FixRigidSmallOMP::set_xv_thr() { auto * _noalias const x = (dbl3_t *) atom->x[0]; @@ -329,6 +360,8 @@ void FixRigidSmallOMP::set_xv_thr() v[i].y = b.omega[2]*x[i].x - b.omega[0]*x[i].z + b.vcm[1]; v[i].z = b.omega[0]*x[i].y - b.omega[1]*x[i].x + b.vcm[2]; + if (DIMENSION == 2) x[i].z = v[i].z = 0.0; + // add center of mass to displacement // map back into periodic box via xbox,ybox,zbox // for triclinic, add in box tilt factors as well @@ -463,9 +496,9 @@ void FixRigidSmallOMP::set_xv_thr() set space-frame velocity of each atom in a rigid body set omega and angmom of extended particles v = Vcm + (W cross (x - Xcm)) -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ -template +template void FixRigidSmallOMP::set_v_thr() { auto * _noalias const x = (dbl3_t *) atom->x[0]; @@ -512,6 +545,8 @@ void FixRigidSmallOMP::set_v_thr() v[i].y = b.omega[2]*delta[0] - b.omega[0]*delta[2] + b.vcm[1]; v[i].z = b.omega[0]*delta[1] - b.omega[1]*delta[0] + b.vcm[2]; + if (DIMENSION == 2) v[i].z = 0.0; + // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external // assume f does not include forces internal to body @@ -564,8 +599,8 @@ void FixRigidSmallOMP::set_v_thr() } } // end of parallel for - // second part of thread safe virial accumulation - // add global virial component after it was reduced across all threads + // second part of thread safe virial accumulation + // add global virial component after it was reduced across all threads if (EVFLAG) { if (vflag_global) { virial[0] += v0; @@ -624,4 +659,3 @@ void FixRigidSmallOMP::set_v_thr() } } } - diff --git a/src/OPENMP/fix_rigid_small_omp.h b/src/OPENMP/fix_rigid_small_omp.h index 3d8bca1a6d..1accb8a470 100644 --- a/src/OPENMP/fix_rigid_small_omp.h +++ b/src/OPENMP/fix_rigid_small_omp.h @@ -39,8 +39,8 @@ class FixRigidSmallOMP : public FixRigidSmall { virtual void compute_forces_and_torques(); private: - template void set_xv_thr(); - template void set_v_thr(); + template void set_xv_thr(); + template void set_v_thr(); }; } // namespace LAMMPS_NS From 56f760d0d8f7e4d41af2bc83b10314b37e3e7f36 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Apr 2023 22:30:39 -0400 Subject: [PATCH 004/417] whitespace --- src/RIGID/fix_rigid.cpp | 6 +++--- src/RIGID/fix_rigid_small.cpp | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index 0d6cbe86ee..11e5b5acf6 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -856,7 +856,7 @@ void FixRigid::setup(int vflag) } // enforce 2d body forces and torques - + if (dimension == 2) enforce2d(); // zero langextra in case Langevin thermostat not used @@ -980,10 +980,10 @@ void FixRigid::final_integrate() // compute forces and torques (after all post_force contributions) // if 2d model, enforce2d() on body forces/torques - + if (!earlyflag) compute_forces_and_torques(); if (dimension == 2) enforce2d(); - + // update vcm and angmom // fflag,tflag = 0 for some dimensions in 2d diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 4f678cb14c..ccaae258fe 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -691,7 +691,7 @@ void FixRigidSmall::setup(int vflag) } // enforce 2d body forces and torques - + if (dimension == 2) enforce2d(); // reverse communicate fcm, torque of all bodies @@ -841,7 +841,7 @@ void FixRigidSmall::final_integrate() // compute forces and torques (after all post_force contributions) // if 2d model, enforce2d() on body forces/torques - + if (!earlyflag) compute_forces_and_torques(); if (dimension == 2) enforce2d(); @@ -1300,7 +1300,7 @@ void FixRigidSmall::set_xv() // x = displacement from center-of-mass, based on body orientation // v = vcm + omega around center-of-mass // enforce 2d x and v - + MathExtra::matvec(b->ex_space,b->ey_space,b->ez_space,displace[i],x[i]); v[i][0] = b->omega[1]*x[i][2] - b->omega[2]*x[i][1] + b->vcm[0]; @@ -1311,7 +1311,7 @@ void FixRigidSmall::set_xv() x[i][2] = 0.0; v[i][2] = 0.0; } - + // add center of mass to displacement // map back into periodic box via xbox,ybox,zbox // for triclinic, add in box tilt factors as well @@ -1353,7 +1353,7 @@ void FixRigidSmall::set_xv() } // update the position of geometric center - + for (int ibody = 0; ibody < nlocal_body + nghost_body; ibody++) { Body *b = &body[ibody]; MathExtra::matvec(b->ex_space,b->ey_space,b->ez_space, @@ -1473,13 +1473,13 @@ void FixRigidSmall::set_v() // compute new v // enforce 2d v - + v[i][0] = b->omega[1]*delta[2] - b->omega[2]*delta[1] + b->vcm[0]; v[i][1] = b->omega[2]*delta[0] - b->omega[0]*delta[2] + b->vcm[1]; v[i][2] = b->omega[0]*delta[1] - b->omega[1]*delta[0] + b->vcm[2]; if (dimension == 2) v[i][2] = 0.0; - + // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external // assume f does not include forces internal to body From 6e09037aa38ba8f27bbc1f82e43bf73193367bde Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Apr 2023 05:20:53 -0400 Subject: [PATCH 005/417] incremental improvements --- src/OPENMP/fix_rigid_omp.cpp | 15 ++++++++------- src/RIGID/fix_rigid.cpp | 3 +-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/OPENMP/fix_rigid_omp.cpp b/src/OPENMP/fix_rigid_omp.cpp index e2c6e653bc..0e27578b81 100644 --- a/src/OPENMP/fix_rigid_omp.cpp +++ b/src/OPENMP/fix_rigid_omp.cpp @@ -170,7 +170,7 @@ void FixRigidOMP::compute_forces_and_torques() } else if (rstyle == GROUP) { - // we likely have only a rather number of groups so we loops + // we likely have only a rather number of groups so we loop // over bodies and thread over all atoms for each of them. for (int ib = 0; ib < nbody; ++ib) { @@ -268,12 +268,12 @@ void FixRigidOMP::compute_forces_and_torques() #pragma omp parallel for LMP_DEFAULT_NONE schedule(static) #endif for (int ibody = 0; ibody < nbody; ibody++) { - fcm[ibody][0] = all[ibody][0] + langextra[ibody][0]; - fcm[ibody][1] = all[ibody][1] + langextra[ibody][1]; - fcm[ibody][2] = all[ibody][2] + langextra[ibody][2]; - torque[ibody][0] = all[ibody][3] + langextra[ibody][3]; - torque[ibody][1] = all[ibody][4] + langextra[ibody][4]; - torque[ibody][2] = all[ibody][5] + langextra[ibody][5]; + fcm[ibody][0] = all[ibody][0] + fflag[ibody][0]*langextra[ibody][0]; + fcm[ibody][1] = all[ibody][1] + fflag[ibody][1]*langextra[ibody][1]; + fcm[ibody][2] = all[ibody][2] + fflag[ibody][2]*langextra[ibody][2]; + torque[ibody][0] = all[ibody][3] + tflag[ibody][0]*langextra[ibody][3]; + torque[ibody][1] = all[ibody][4] + tflag[ibody][1]*langextra[ibody][4]; + torque[ibody][2] = all[ibody][5] + tflag[ibody][2]*langextra[ibody][5]; } // add gravity force to COM of each body @@ -295,6 +295,7 @@ void FixRigidOMP::compute_forces_and_torques() void FixRigidOMP::final_integrate() { if (!earlyflag) compute_forces_and_torques(); + if (dimension == 2) enforce2d(); // update vcm and angmom diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index 11e5b5acf6..fe15946ca8 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -503,8 +503,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : id_dilate = utils::strdup(arg[iarg+1]); int idilate = group->find(id_dilate); if (idilate == -1) - error->all(FLERR, - "Fix rigid npt/nph dilate group ID does not exist"); + error->all(FLERR, "Fix rigid npt/nph dilate group ID {} does not exist", id_dilate); } iarg += 2; From 777ba98764ea99527b54069e8c7d3a9584017615 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Apr 2023 08:56:07 -0400 Subject: [PATCH 006/417] cosmetic --- src/OPENMP/fix_rigid_omp.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/OPENMP/fix_rigid_omp.cpp b/src/OPENMP/fix_rigid_omp.cpp index 0e27578b81..3287d569e2 100644 --- a/src/OPENMP/fix_rigid_omp.cpp +++ b/src/OPENMP/fix_rigid_omp.cpp @@ -79,13 +79,11 @@ void FixRigidOMP::initial_integrate(int vflag) // returns new normalized quaternion, also updated omega at 1/2 step // update ex,ey,ez to reflect new quaternion - MathExtra::angmom_to_omega(angmom[ibody],ex_space[ibody],ey_space[ibody], - ez_space[ibody],inertia[ibody],omega[ibody]); - MathExtra::richardson(quat[ibody],angmom[ibody],omega[ibody], - inertia[ibody],dtq); - MathExtra::q_to_exyz(quat[ibody], - ex_space[ibody],ey_space[ibody],ez_space[ibody]); - } // end of omp parallel for + MathExtra::angmom_to_omega(angmom[ibody], ex_space[ibody], ey_space[ibody], ez_space[ibody], + inertia[ibody], omega[ibody]); + MathExtra::richardson(quat[ibody], angmom[ibody], omega[ibody], inertia[ibody], dtq); + MathExtra::q_to_exyz(quat[ibody], ex_space[ibody], ey_space[ibody], ez_space[ibody]); + } // end of omp parallel for // virial setup before call to set_xv From fed3c02d0191078c5c75923973415f3f36454d08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Apr 2023 08:56:30 -0400 Subject: [PATCH 007/417] improve error messages and partially apply clang-format --- src/RIGID/fix_rigid.cpp | 467 +++++++++++++++++++++------------------- 1 file changed, 246 insertions(+), 221 deletions(-) diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index fe15946ca8..9264b0f3fb 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -47,18 +46,16 @@ using namespace RigidConst; /* ---------------------------------------------------------------------- */ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), step_respa(nullptr), - inpfile(nullptr), nrigid(nullptr), mol2body(nullptr), body2mol(nullptr), - body(nullptr), displace(nullptr), masstotal(nullptr), xcm(nullptr), - vcm(nullptr), fcm(nullptr), inertia(nullptr), ex_space(nullptr), - ey_space(nullptr), ez_space(nullptr), angmom(nullptr), omega(nullptr), - torque(nullptr), quat(nullptr), imagebody(nullptr), fflag(nullptr), - tflag(nullptr), langextra(nullptr), sum(nullptr), all(nullptr), - remapflag(nullptr), xcmimage(nullptr), eflags(nullptr), orient(nullptr), - dorient(nullptr), id_dilate(nullptr), id_gravity(nullptr), random(nullptr), - avec_ellipsoid(nullptr), avec_line(nullptr), avec_tri(nullptr) + Fix(lmp, narg, arg), step_respa(nullptr), inpfile(nullptr), nrigid(nullptr), mol2body(nullptr), + body2mol(nullptr), body(nullptr), displace(nullptr), masstotal(nullptr), xcm(nullptr), + vcm(nullptr), fcm(nullptr), inertia(nullptr), ex_space(nullptr), ey_space(nullptr), + ez_space(nullptr), angmom(nullptr), omega(nullptr), torque(nullptr), quat(nullptr), + imagebody(nullptr), fflag(nullptr), tflag(nullptr), langextra(nullptr), sum(nullptr), + all(nullptr), remapflag(nullptr), xcmimage(nullptr), eflags(nullptr), orient(nullptr), + dorient(nullptr), id_dilate(nullptr), id_gravity(nullptr), random(nullptr), + avec_ellipsoid(nullptr), avec_line(nullptr), avec_tri(nullptr) { - int i,ibody; + int i, ibody; scalar_flag = 1; extscalar = 0; @@ -70,8 +67,8 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : dof_flag = 1; centroidstressflag = CENTROID_NOTAVAIL; - MPI_Comm_rank(world,&me); - MPI_Comm_size(world,&nprocs); + MPI_Comm_rank(world, &me); + MPI_Comm_size(world, &nprocs); // perform initial allocation of atom-based arrays // register with Atom class @@ -90,7 +87,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : // parse args for rigid body specification // set nbody and body[i] for each atom - if (narg < 4) error->all(FLERR,"Illegal fix rigid command"); + if (narg < 4) utils::missing_cmd_args(FLERR, std::string("fix ") + style, error); int iarg; mol2body = nullptr; @@ -100,7 +97,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : // nbody = 1 // all atoms in fix group are part of body - if (strcmp(arg[3],"single") == 0) { + if (strcmp(arg[3], "single") == 0) { rstyle = SINGLE; iarg = 4; nbody = 1; @@ -113,67 +110,68 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : if (mask[i] & groupbit) body[i] = 0; } - // each molecule in fix group is a rigid body - // maxmol = largest molecule ID - // ncount = # of atoms in each molecule (have to sum across procs) - // nbody = # of non-zero ncount values - // use nall as incremented ptr to set body[] values for each atom + // each molecule in fix group is a rigid body + // maxmol = largest molecule ID + // ncount = # of atoms in each molecule (have to sum across procs) + // nbody = # of non-zero ncount values + // use nall as incremented ptr to set body[] values for each atom - } else if (strcmp(arg[3],"molecule") == 0 || strcmp(arg[3],"custom") == 0) { + } else if ((strcmp(arg[3], "molecule") == 0) || (strcmp(arg[3], "custom") == 0)) { rstyle = MOLECULE; tagint *molecule; int *mask = atom->mask; int nlocal = atom->nlocal; - int custom_flag = strcmp(arg[3],"custom") == 0; + int custom_flag = strcmp(arg[3], "custom") == 0; if (custom_flag) { - if (narg < 5) error->all(FLERR,"Illegal fix rigid command"); + if (narg < 5) utils::missing_cmd_args(FLERR, fmt::format("fix {} custom"), error); // determine whether atom-style variable or atom property is used - if (utils::strmatch(arg[4],"^i_")) { - int is_double,cols; - int custom_index = atom->find_custom(arg[4]+2,is_double,cols); + if (utils::strmatch(arg[4], "^i_")) { + int is_double, cols; + int custom_index = atom->find_custom(arg[4] + 2, is_double, cols); if (custom_index == -1) - error->all(FLERR,"Fix rigid custom requires previously defined property/atom"); + error->all(FLERR, "Fix {} custom requires previously defined property/atom", style); else if (is_double) - error->all(FLERR,"Fix rigid custom requires integer-valued property/atom vector"); + error->all(FLERR, "Fix {} custom requires integer-valued property/atom vector", style); int minval = INT_MAX; int *value = atom->ivector[custom_index]; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) minval = MIN(minval,value[i]); + if (mask[i] & groupbit) minval = MIN(minval, value[i]); int vmin = minval; - MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world); + MPI_Allreduce(&vmin, &minval, 1, MPI_INT, MPI_MIN, world); molecule = new tagint[nlocal]; for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) - molecule[i] = (tagint)(value[i] - minval + 1); + molecule[i] = (tagint) (value[i] - minval + 1); else molecule[i] = 0; - } else if (utils::strmatch(arg[4],"^v_")) { - int ivariable = input->variable->find(arg[4]+2); + } else if (utils::strmatch(arg[4], "^v_")) { + int ivariable = input->variable->find(arg[4] + 2); if (ivariable < 0) - error->all(FLERR,"Variable {} for fix rigid/small custom does not exist", arg[4]+2); + error->all(FLERR, "Variable {} for fix {} custom does not exist", arg[4] + 2, style); if (input->variable->atomstyle(ivariable) == 0) - error->all(FLERR,"Fix rigid custom variable {} is not atom-style variable", arg[4]+2); + error->all(FLERR, "Fix {} custom variable {} is not atom-style variable", style, + arg[4] + 2); auto value = new double[nlocal]; - input->variable->compute_atom(ivariable,0,value,1,0); + input->variable->compute_atom(ivariable, 0, value, 1, 0); int minval = INT_MAX; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) minval = MIN(minval,(int)value[i]); + if (mask[i] & groupbit) minval = MIN(minval, (int) value[i]); int vmin = minval; - MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world); + MPI_Allreduce(&vmin, &minval, 1, MPI_INT, MPI_MIN, world); molecule = new tagint[nlocal]; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - molecule[i] = (tagint)((tagint)value[i] - minval + 1); + if (mask[i] & groupbit) molecule[i] = (tagint) ((tagint) value[i] - minval + 1); delete[] value; - } else error->all(FLERR,"Unsupported fix rigid custom property"); + } else + error->all(FLERR, "Unsupported fix {} custom property: {}", style, arg[4]); } else { if (atom->molecule_flag == 0) - error->all(FLERR,"Fix rigid molecule requires atom attribute molecule"); + error->all(FLERR, "Fix {} molecule requires atom attribute molecule", style); molecule = atom->molecule; } @@ -181,30 +179,31 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : tagint maxmol_tag = -1; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) maxmol_tag = MAX(maxmol_tag,molecule[i]); + if (mask[i] & groupbit) maxmol_tag = MAX(maxmol_tag, molecule[i]); tagint itmp; - MPI_Allreduce(&maxmol_tag,&itmp,1,MPI_LMP_TAGINT,MPI_MAX,world); - if (itmp+1 > MAXSMALLINT) - error->all(FLERR,"Too many molecules for fix rigid"); + MPI_Allreduce(&maxmol_tag, &itmp, 1, MPI_LMP_TAGINT, MPI_MAX, world); + if (itmp + 1 > MAXSMALLINT) error->all(FLERR, "Too many molecules for fix {}", style); maxmol = (int) itmp; int *ncount; - memory->create(ncount,maxmol+1,"rigid:ncount"); + memory->create(ncount, maxmol + 1, "rigid:ncount"); for (i = 0; i <= maxmol; i++) ncount[i] = 0; for (i = 0; i < nlocal; i++) if (mask[i] & groupbit) ncount[molecule[i]]++; - memory->create(mol2body,maxmol+1,"rigid:mol2body"); - MPI_Allreduce(ncount,mol2body,maxmol+1,MPI_INT,MPI_SUM,world); + memory->create(mol2body, maxmol + 1, "rigid:mol2body"); + MPI_Allreduce(ncount, mol2body, maxmol + 1, MPI_INT, MPI_SUM, world); nbody = 0; for (i = 0; i <= maxmol; i++) - if (mol2body[i]) mol2body[i] = nbody++; - else mol2body[i] = -1; + if (mol2body[i]) + mol2body[i] = nbody++; + else + mol2body[i] = -1; - memory->create(body2mol,nbody,"rigid:body2mol"); + memory->create(body2mol, nbody, "rigid:body2mol"); nbody = 0; for (i = 0; i <= maxmol; i++) @@ -218,24 +217,24 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : memory->destroy(ncount); if (custom_flag) delete[] molecule; - // each listed group is a rigid body - // check if all listed groups exist - // an atom must belong to fix group and listed group to be in rigid body - // error if atom belongs to more than 1 rigid body + // each listed group is a rigid body + // check if all listed groups exist + // an atom must belong to fix group and listed group to be in rigid body + // error if atom belongs to more than 1 rigid body - } else if (strcmp(arg[3],"group") == 0) { - if (narg < 5) error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[3], "group") == 0) { + if (narg < 5) utils::missing_cmd_args(FLERR, fmt::format("fix {} group"), error); rstyle = GROUP; - nbody = utils::inumeric(FLERR,arg[4],false,lmp); - if (nbody <= 0) error->all(FLERR,"Illegal fix rigid command"); - if (narg < 5+nbody) error->all(FLERR,"Illegal fix rigid command"); - iarg = 5+nbody; + nbody = utils::inumeric(FLERR, arg[4], false, lmp); + if (nbody <= 0) error->all(FLERR, "Illegal fix {} number of groups {}", style, nbody); + if (narg < 5 + nbody) utils::missing_cmd_args(FLERR, fmt::format("fix {} group"), error); + iarg = 5 + nbody; int *igroups = new int[nbody]; for (ibody = 0; ibody < nbody; ibody++) { - igroups[ibody] = group->find(arg[5+ibody]); + igroups[ibody] = group->find(arg[5 + ibody]); if (igroups[ibody] == -1) - error->all(FLERR,"Could not find fix rigid group ID"); + error->all(FLERR, "Could not find fix {} group ID {}", style, arg[5 + ibody]); } int *mask = atom->mask; @@ -253,41 +252,41 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : } int flagall; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); - if (flagall) - error->all(FLERR,"One or more atoms belong to multiple rigid bodies"); + MPI_Allreduce(&flag, &flagall, 1, MPI_INT, MPI_SUM, world); + if (flagall) error->all(FLERR, "One or more atoms belong to multiple rigid bodies"); delete[] igroups; - } else error->all(FLERR,"Illegal fix rigid command"); + } else + error->all(FLERR, "Unknown fix {} mode {}", style, arg[3]); // error check on nbody - if (nbody == 0) error->all(FLERR,"No rigid bodies defined"); + if (nbody == 0) error->all(FLERR, "No rigid bodies defined"); // create all nbody-length arrays - memory->create(nrigid,nbody,"rigid:nrigid"); - memory->create(masstotal,nbody,"rigid:masstotal"); - memory->create(xcm,nbody,3,"rigid:xcm"); - memory->create(vcm,nbody,3,"rigid:vcm"); - memory->create(fcm,nbody,3,"rigid:fcm"); - memory->create(inertia,nbody,3,"rigid:inertia"); - memory->create(ex_space,nbody,3,"rigid:ex_space"); - memory->create(ey_space,nbody,3,"rigid:ey_space"); - memory->create(ez_space,nbody,3,"rigid:ez_space"); - memory->create(angmom,nbody,3,"rigid:angmom"); - memory->create(omega,nbody,3,"rigid:omega"); - memory->create(torque,nbody,3,"rigid:torque"); - memory->create(quat,nbody,4,"rigid:quat"); - memory->create(imagebody,nbody,"rigid:imagebody"); - memory->create(fflag,nbody,3,"rigid:fflag"); - memory->create(tflag,nbody,3,"rigid:tflag"); - memory->create(langextra,nbody,6,"rigid:langextra"); + memory->create(nrigid, nbody, "rigid:nrigid"); + memory->create(masstotal, nbody, "rigid:masstotal"); + memory->create(xcm, nbody, 3, "rigid:xcm"); + memory->create(vcm, nbody, 3, "rigid:vcm"); + memory->create(fcm, nbody, 3, "rigid:fcm"); + memory->create(inertia, nbody, 3, "rigid:inertia"); + memory->create(ex_space, nbody, 3, "rigid:ex_space"); + memory->create(ey_space, nbody, 3, "rigid:ey_space"); + memory->create(ez_space, nbody, 3, "rigid:ez_space"); + memory->create(angmom, nbody, 3, "rigid:angmom"); + memory->create(omega, nbody, 3, "rigid:omega"); + memory->create(torque, nbody, 3, "rigid:torque"); + memory->create(quat, nbody, 4, "rigid:quat"); + memory->create(imagebody, nbody, "rigid:imagebody"); + memory->create(fflag, nbody, 3, "rigid:fflag"); + memory->create(tflag, nbody, 3, "rigid:tflag"); + memory->create(langextra, nbody, 6, "rigid:langextra"); - memory->create(sum,nbody,6,"rigid:sum"); - memory->create(all,nbody,6,"rigid:all"); - memory->create(remapflag,nbody,4,"rigid:remapflag"); + memory->create(sum, nbody, 6, "rigid:sum"); + memory->create(all, nbody, 6, "rigid:all"); + memory->create(remapflag, nbody, 4, "rigid:remapflag"); // initialize force/torque flags to default = 1.0 // for 2d: fz, tx, ty = 0.0 @@ -335,102 +334,117 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : } while (iarg < narg) { - if (strcmp(arg[iarg],"force") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid command"); + if (strcmp(arg[iarg], "force") == 0) { + if (iarg + 5 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} force", style), error); - int mlo,mhi; - utils::bounds(FLERR,arg[iarg+1],1,nbody,mlo,mhi,error); + int mlo, mhi; + utils::bounds(FLERR, arg[iarg + 1], 1, nbody, mlo, mhi, error); - double xflag,yflag,zflag; - if (strcmp(arg[iarg+2],"off") == 0) xflag = 0.0; - else if (strcmp(arg[iarg+2],"on") == 0) xflag = 1.0; - else error->all(FLERR,"Illegal fix rigid command"); - if (strcmp(arg[iarg+3],"off") == 0) yflag = 0.0; - else if (strcmp(arg[iarg+3],"on") == 0) yflag = 1.0; - else error->all(FLERR,"Illegal fix rigid command"); - if (strcmp(arg[iarg+4],"off") == 0) zflag = 0.0; - else if (strcmp(arg[iarg+4],"on") == 0) zflag = 1.0; - else error->all(FLERR,"Illegal fix rigid command"); + double xflag, yflag, zflag; + if (strcmp(arg[iarg + 2], "off") == 0) + xflag = 0.0; + else if (strcmp(arg[iarg + 2], "on") == 0) + xflag = 1.0; + else + error->all(FLERR, "Illegal fix {} command", style); + if (strcmp(arg[iarg + 3], "off") == 0) + yflag = 0.0; + else if (strcmp(arg[iarg + 3], "on") == 0) + yflag = 1.0; + else + error->all(FLERR, "Illegal fix {} command", style); + if (strcmp(arg[iarg + 4], "off") == 0) + zflag = 0.0; + else if (strcmp(arg[iarg + 4], "on") == 0) + zflag = 1.0; + else + error->all(FLERR, "Illegal fix {} command", style); - if (dimension == 2 && zflag == 1.0) - error->all(FLERR,"Fix rigid z force cannot be on for 2d simulation"); + if ((dimension == 2) && (zflag == 1.0)) + error->all(FLERR, "Fix rigid z force cannot be on for 2d simulation"); int count = 0; for (int m = mlo; m <= mhi; m++) { - fflag[m-1][0] = xflag; - fflag[m-1][1] = yflag; - fflag[m-1][2] = zflag; + fflag[m - 1][0] = xflag; + fflag[m - 1][1] = yflag; + fflag[m - 1][2] = zflag; count++; } - if (count == 0) error->all(FLERR,"Illegal fix rigid command"); + if (count == 0) error->all(FLERR, "Illegal fix {} command", style); iarg += 5; - } else if (strcmp(arg[iarg],"torque") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "torque") == 0) { + if (iarg + 5 > narg) error->all(FLERR, "Illegal fix {} command", style); - int mlo,mhi; - utils::bounds(FLERR,arg[iarg+1],1,nbody,mlo,mhi,error); + int mlo, mhi; + utils::bounds(FLERR, arg[iarg + 1], 1, nbody, mlo, mhi, error); - double xflag,yflag,zflag; - if (strcmp(arg[iarg+2],"off") == 0) xflag = 0.0; - else if (strcmp(arg[iarg+2],"on") == 0) xflag = 1.0; - else error->all(FLERR,"Illegal fix rigid command"); - if (strcmp(arg[iarg+3],"off") == 0) yflag = 0.0; - else if (strcmp(arg[iarg+3],"on") == 0) yflag = 1.0; - else error->all(FLERR,"Illegal fix rigid command"); - if (strcmp(arg[iarg+4],"off") == 0) zflag = 0.0; - else if (strcmp(arg[iarg+4],"on") == 0) zflag = 1.0; - else error->all(FLERR,"Illegal fix rigid command"); + double xflag, yflag, zflag; + if (strcmp(arg[iarg + 2], "off") == 0) + xflag = 0.0; + else if (strcmp(arg[iarg + 2], "on") == 0) + xflag = 1.0; + else + error->all(FLERR, "Illegal fix {} command", style); + if (strcmp(arg[iarg + 3], "off") == 0) + yflag = 0.0; + else if (strcmp(arg[iarg + 3], "on") == 0) + yflag = 1.0; + else + error->all(FLERR, "Illegal fix {} command", style); + if (strcmp(arg[iarg + 4], "off") == 0) + zflag = 0.0; + else if (strcmp(arg[iarg + 4], "on") == 0) + zflag = 1.0; + else + error->all(FLERR, "Illegal fix {} command", style); if (dimension == 2 && (xflag == 1.0 || yflag == 1.0)) - error->all(FLERR,"Fix rigid xy torque cannot be on for 2d simulation"); + error->all(FLERR, "Fix rigid xy torque cannot be on for 2d simulation"); int count = 0; for (int m = mlo; m <= mhi; m++) { - tflag[m-1][0] = xflag; - tflag[m-1][1] = yflag; - tflag[m-1][2] = zflag; + tflag[m - 1][0] = xflag; + tflag[m - 1][1] = yflag; + tflag[m - 1][2] = zflag; count++; } - if (count == 0) error->all(FLERR,"Illegal fix rigid command"); + if (count == 0) error->all(FLERR, "Illegal fix {} command", style); iarg += 5; - } else if (strcmp(arg[iarg],"langevin") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (strcmp(style,"rigid") != 0 && strcmp(style,"rigid/nve") != 0 && - strcmp(style,"rigid/omp") != 0 && strcmp(style,"rigid/nve/omp") != 0) - error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "langevin") == 0) { + if (iarg + 5 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (strcmp(style, "rigid") != 0 && strcmp(style, "rigid/nve") != 0 && + strcmp(style, "rigid/omp") != 0 && strcmp(style, "rigid/nve/omp") != 0) + error->all(FLERR, "Illegal fix {} command", style); langflag = 1; - t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); - t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); - t_period = utils::numeric(FLERR,arg[iarg+3],false,lmp); - seed = utils::inumeric(FLERR,arg[iarg+4],false,lmp); - if (t_period <= 0.0) - error->all(FLERR,"Fix rigid langevin period must be > 0.0"); - if (seed <= 0) error->all(FLERR,"Illegal fix rigid command"); + t_start = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + t_stop = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + t_period = utils::numeric(FLERR, arg[iarg + 3], false, lmp); + seed = utils::inumeric(FLERR, arg[iarg + 4], false, lmp); + if (t_period <= 0.0) error->all(FLERR, "Fix rigid langevin period must be > 0.0"); + if (seed <= 0) error->all(FLERR, "Illegal fix {} command", style); iarg += 5; - } else if (strcmp(arg[iarg],"temp") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/n.t")) - error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "temp") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (!utils::strmatch(style, "^rigid/n.t")) error->all(FLERR, "Illegal fix {} command", style); tstat_flag = 1; - t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); - t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); - t_period = utils::numeric(FLERR,arg[iarg+3],false,lmp); + t_start = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + t_stop = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + t_period = utils::numeric(FLERR, arg[iarg + 3], false, lmp); iarg += 4; - } else if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/np.")) - error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "iso") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (!utils::strmatch(style, "^rigid/np.")) error->all(FLERR, "Illegal fix {} command", style); pcouple = XYZ; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = - utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; @@ -438,14 +452,12 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; - } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/np.")) - error->all(FLERR,"Illegal fix rigid command"); - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = - utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "aniso") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (!utils::strmatch(style, "^rigid/np.")) error->all(FLERR, "Illegal fix {} command", style); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; @@ -453,98 +465,111 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; - } else if (strcmp(arg[iarg],"x") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/np.")) - error->all(FLERR,"Illegal fix rigid command"); - p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "x") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (!utils::strmatch(style, "^rigid/np.")) error->all(FLERR, "Illegal fix {} command", style); + p_start[0] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/np.")) - error->all(FLERR,"Illegal fix rigid command"); - p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "y") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (!utils::strmatch(style, "^rigid/np.")) error->all(FLERR, "Illegal fix {} command", style); + p_start[1] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[1] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[1] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[1] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/np.")) - error->all(FLERR,"Illegal fix rigid command"); - p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "z") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix {} command", style); + if (!utils::strmatch(style, "^rigid/np.")) error->all(FLERR, "Illegal fix {} command", style); + p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[2] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; - else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; - else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; - else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; - else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "couple") == 0) { + if (iarg + 2 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} couple", style), error); + if (strcmp(arg[iarg + 1], "xyz") == 0) + pcouple = XYZ; + else if (strcmp(arg[iarg + 1], "xy") == 0) + pcouple = XY; + else if (strcmp(arg[iarg + 1], "yz") == 0) + pcouple = YZ; + else if (strcmp(arg[iarg + 1], "xz") == 0) + pcouple = XZ; + else if (strcmp(arg[iarg + 1], "none") == 0) + pcouple = NONE; + else + error->all(FLERR, "Unknown fix {} couple option ", style, arg[iarg + 1]); iarg += 2; - } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix rigid npt/nph command"); - if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; + } else if (strcmp(arg[iarg], "dilate") == 0) { + if (iarg + 2 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} dilate", style), error); + if (strcmp(arg[iarg + 1], "all") == 0) + allremap = 1; else { allremap = 0; delete[] id_dilate; - id_dilate = utils::strdup(arg[iarg+1]); + id_dilate = utils::strdup(arg[iarg + 1]); int idilate = group->find(id_dilate); if (idilate == -1) - error->all(FLERR, "Fix rigid npt/nph dilate group ID {} does not exist", id_dilate); + error->all(FLERR, "Fix {} dilate group ID {} does not exist", style, id_dilate); } iarg += 2; - } else if (strcmp(arg[iarg],"tparam") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/n.t")) - error->all(FLERR,"Illegal fix rigid command"); - t_chain = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - t_iter = utils::inumeric(FLERR,arg[iarg+2],false,lmp); - t_order = utils::inumeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "tparam") == 0) { + if (iarg + 4 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} tparam", style), error); + if (!utils::strmatch(style, "^rigid/n.t")) + error->all(FLERR, "Illegal fix {} command option tparam", style); + t_chain = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + t_iter = utils::inumeric(FLERR, arg[iarg + 2], false, lmp); + t_order = utils::inumeric(FLERR, arg[iarg + 3], false, lmp); iarg += 4; - } else if (strcmp(arg[iarg],"pchain") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command"); - if (!utils::strmatch(style,"^rigid/np.")) - error->all(FLERR,"Illegal fix rigid command"); - p_chain = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "pchain") == 0) { + if (iarg + 2 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} pchain", style), error); + if (!utils::strmatch(style, "^rigid/np.")) + error->all(FLERR, "Illegal fix {} command option pchain", style); + p_chain = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"infile") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "infile") == 0) { + if (iarg + 2 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} infile", style), error); delete[] inpfile; - inpfile = utils::strdup(arg[iarg+1]); + inpfile = utils::strdup(arg[iarg + 1]); restart_file = 1; reinitflag = 0; iarg += 2; - } else if (strcmp(arg[iarg],"reinit") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command"); - reinitflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "reinit") == 0) { + if (iarg + 2 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} reinit", style), error); + reinitflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"gravity") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command"); + } else if (strcmp(arg[iarg], "gravity") == 0) { + if (iarg + 2 > narg) + utils::missing_cmd_args(FLERR, fmt::format("fix {} gravity", style), error); delete[] id_gravity; - id_gravity = utils::strdup(arg[iarg+1]); + id_gravity = utils::strdup(arg[iarg + 1]); iarg += 2; - } else error->all(FLERR,"Illegal fix rigid command"); + } else + error->all(FLERR, "Illegal fix {} command", style); } + // clang-format off + // set pstat_flag pstat_flag = 0; From 3ed6612f0828b795dc8b70e4649b7f4164d5d91b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Apr 2023 23:20:22 -0400 Subject: [PATCH 008/417] correct comment --- src/OPENMP/fix_rigid_omp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OPENMP/fix_rigid_omp.cpp b/src/OPENMP/fix_rigid_omp.cpp index 3287d569e2..c9cfee07c6 100644 --- a/src/OPENMP/fix_rigid_omp.cpp +++ b/src/OPENMP/fix_rigid_omp.cpp @@ -168,7 +168,7 @@ void FixRigidOMP::compute_forces_and_torques() } else if (rstyle == GROUP) { - // we likely have only a rather number of groups so we loop + // we likely have a rather small number of groups so we loop // over bodies and thread over all atoms for each of them. for (int ib = 0; ib < nbody; ++ib) { From bee5afcd0832cba5468696c8a8a5fa5cc7c4ba1f Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Fri, 21 Apr 2023 00:22:36 -0500 Subject: [PATCH 009/417] Added yukawa/colloid/kk --- src/KOKKOS/Install.sh | 2 + src/KOKKOS/pair_yukawa_colloid_kokkos.cpp | 271 ++++++++++++++++++++++ src/KOKKOS/pair_yukawa_colloid_kokkos.h | 121 ++++++++++ 3 files changed, 394 insertions(+) create mode 100644 src/KOKKOS/pair_yukawa_colloid_kokkos.cpp create mode 100644 src/KOKKOS/pair_yukawa_colloid_kokkos.h diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index ede766cbf8..766daaff19 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -361,6 +361,8 @@ action pair_vashishta_kokkos.cpp pair_vashishta.cpp action pair_vashishta_kokkos.h pair_vashishta.h action pair_yukawa_kokkos.cpp action pair_yukawa_kokkos.h +action pair_yukawa_colloid_kokkos.cpp pair_yukawa_colloid.cpp +action pair_yukawa_colloid_kokkos.h pair_yukawa_colloid.h action pair_zbl_kokkos.cpp action pair_zbl_kokkos.h action pppm_kokkos.cpp pppm.cpp diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp new file mode 100644 index 0000000000..ca491a3800 --- /dev/null +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp @@ -0,0 +1,271 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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: Trung Nguyen (U Chicago) +------------------------------------------------------------------------- */ + +#include "pair_yukawa_colloid_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "error.h" +#include "force.h" +#include "kokkos.h" +#include "memory_kokkos.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "respa.h" +#include "update.h" + +#include + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +PairYukawaColloidKokkos::PairYukawaColloidKokkos(LAMMPS *lmp) : PairYukawaColloid(lmp) +{ + respa_enable = 0; + + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK | RADIUS_MASK; + datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +PairYukawaColloidKokkos::~PairYukawaColloidKokkos() +{ + if (copymode) return; + + if (allocated) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_cutsq,cutsq); + } +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairYukawaColloidKokkos::allocate() +{ + PairYukawaColloid::allocate(); + + int n = atom->ntypes; + memory->destroy(cutsq); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + k_params = Kokkos::DualView( + "PairYukawaColloid::params",n+1,n+1); + + params = k_params.template view(); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairYukawaColloidKokkos::init_style() +{ + PairYukawaColloid::init_style(); + + // error if rRESPA with inner levels + + if (update->whichflag == 1 && utils::strmatch(update->integrate_style,"^respa")) { + int respa = 0; + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + if (respa) + error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle"); + } + + // adjust neighbor list request for KOKKOS + + neighflag = lmp->kokkos->neighflag; + auto request = neighbor->find_request(this); + request->set_kokkos_host(std::is_same::value && + !std::is_same::value); + request->set_kokkos_device(std::is_same::value); + if (neighflag == FULL) request->enable_full(); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ +// Rewrite this. +template +double PairYukawaColloidKokkos::init_one(int i, int j) +{ + double cutone = PairYukawaColloid::init_one(i,j); + + k_params.h_view(i,j).a = a[i][j]; + k_params.h_view(i,j).offset = offset[i][j]; + k_params.h_view(i,j).cutsq = cutone*cutone; + k_params.h_view(j,i) = k_params.h_view(i,j); + + if (i(); + k_params.template modify(); + + return cutone; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairYukawaColloidKokkos::compute(int eflag_in, int vflag_in) +{ + eflag = eflag_in; + vflag = vflag_in; + + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + ev_init(eflag,vflag,0); + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"pair:vatom"); + d_vatom = k_vatom.view(); + } + + atomKK->sync(execution_space,datamask_read); + k_cutsq.template sync(); + k_params.template sync(); + if (eflag || vflag) atomKK->modified(execution_space,datamask_modify); + else atomKK->modified(execution_space,F_MASK); + + x = atomKK->k_x.view(); + c_x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + radius = atomKK->k_radius.view(); + nlocal = atom->nlocal; + nall = atom->nlocal + atom->nghost; + newton_pair = force->newton_pair; + special_lj[0] = force->special_lj[0]; + special_lj[1] = force->special_lj[1]; + special_lj[2] = force->special_lj[2]; + special_lj[3] = force->special_lj[3]; + + // loop over neighbors of my atoms + + EV_FLOAT ev = pair_compute,void >( + this,(NeighListKokkos*)list); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } +} + + + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairYukawaColloidKokkos:: +compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT radi = radius[i]; + const F_FLOAT radj = radius[j]; + const F_FLOAT rr = sqrt(rsq); + // Fetch the params either off the stack or from some mapped memory? + const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a + : params(itype,jtype).a; + + // U = a * exp(-kappa*r-(radi+radj)) / kappa + // f = a * exp(-kappa*r) + // f/r = a * exp(-kappa*r) / r + const F_FLOAT rinv = 1.0 / rr; + const F_FLOAT rinv2 = rinv*rinv; + const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); + const F_FLOAT forceyukawa = aa * screening; + const F_FLOAT fpair = forceyukawa * rinv; + + return fpair; +} + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairYukawaColloidKokkos:: +compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT radi = radius[i]; + const F_FLOAT radj = radius[j]; + const F_FLOAT rr = sqrt(rsq); + const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a + : params(itype,jtype).a; + const F_FLOAT offset = STACKPARAMS ? m_params[itype][jtype].offset + : params(itype,jtype).offset; + + // U = a * exp(-kappa*r) / kappa + const F_FLOAT rinv = 1.0 / rr; + const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); + + return aa / kappa * screening - offset; +} + + +namespace LAMMPS_NS { +template class PairYukawaColloidKokkos; +#ifdef LMP_KOKKOS_GPU +template class PairYukawaColloidKokkos; +#endif +} diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.h b/src/KOKKOS/pair_yukawa_colloid_kokkos.h new file mode 100644 index 0000000000..060b621a8a --- /dev/null +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.h @@ -0,0 +1,121 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 +// clang-format off +PairStyle(yukawa/colloid/kk,PairYukawaColloidKokkos); +PairStyle(yukawa/colloid/kk/device,PairYukawaColloidKokkos); +PairStyle(yukawa/colloid/kk/host,PairYukawaColloidKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_PAIR_YUKAWA_COLLOID_KOKKOS_H +#define LMP_PAIR_YUKAWA_COLLOID_KOKKOS_H + +#include "pair_kokkos.h" +#include "pair_yukawa_colloid.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +template +class PairYukawaColloidKokkos : public PairYukawaColloid { + public: + enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; + enum {COUL_FLAG=0}; + typedef DeviceType device_type; + typedef ArrayTypes AT; + + PairYukawaColloidKokkos(class LAMMPS *); + ~PairYukawaColloidKokkos() override; + + void compute(int, int) override; + void init_style() override; + double init_one(int,int) override; + + struct params_yukawa { + KOKKOS_INLINE_FUNCTION + params_yukawa() { cutsq=0, a = 0; offset = 0; } + KOKKOS_INLINE_FUNCTION + params_yukawa(int /*i*/) { cutsq=0, a = 0; offset = 0; } + F_FLOAT cutsq, a, offset; + }; + + + protected: + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_ecoul(const F_FLOAT& /*rsq*/, const int& /*i*/, const int& /*j*/, + const int& /*itype*/, const int& /*jtype*/) const { return 0; } + + + Kokkos::DualView k_params; + typename Kokkos::DualView::t_dev_const_um params; + params_yukawa m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + typename AT::t_x_array_randomread x; + typename AT::t_x_array c_x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + typename AT::t_float_1d_randomread radius; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + int newton_pair; + double special_lj[4]; + + typename AT::tdual_ffloat_2d k_cutsq; + typename AT::t_ffloat_2d d_cutsq; + + + int neighflag; + int nlocal,nall,eflag,vflag; + + void allocate() override; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend EV_FLOAT pair_compute_neighlist( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute( + PairYukawaColloidKokkos*,NeighListKokkos*); + friend void pair_virial_fdotr_compute(PairYukawaColloidKokkos*); + +}; + +} + +#endif +#endif + From 859012b192a4931d2d372dcfbe7799e887b2e0c3 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Wed, 17 May 2023 17:13:07 +0200 Subject: [PATCH 010/417] Initial commit of an early version of anisotropic Langevin barostat. --- src/fix_press_langevin.cpp | 614 +++++++++++++++++++++++++++++++++++++ src/fix_press_langevin.h | 71 +++++ 2 files changed, 685 insertions(+) create mode 100644 src/fix_press_langevin.cpp create mode 100644 src/fix_press_langevin.h diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp new file mode 100644 index 0000000000..246d2f08f1 --- /dev/null +++ b/src/fix_press_langevin.cpp @@ -0,0 +1,614 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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: Germain Clavier (TUe) +------------------------------------------------------------------------- */ + +#include "fix_press_langevin.h" + +#include "atom.h" +#include "comm.h" +#include "compute.h" +#include "domain.h" +#include "error.h" +#include "fix_deform.h" +#include "force.h" +#include "group.h" +#include "kspace.h" +#include "modify.h" +#include "random_mars.h" +#include "update.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum{NONE,XYZ,XY,YZ,XZ}; +enum{ISO,ANISO}; + +/* ---------------------------------------------------------------------- */ + +FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), + id_press(nullptr), pflag(0), random(nullptr) +{ + if (narg < 5) error->all(FLERR,"Illegal fix press/langevin command"); + + // Langevin barostat applied every step + // For details on the equations of motion see: + // Grønbech-Jensen & Farago J. Chem. Phys. 141 194108 (2014) + + nevery = 1; + + // default values + + pcouple = NONE; + allremap = 1; + + // Alpha friction coefficient + p_fric = 1e-4; + // Target temperature + t_start = t_stop = t_target = 0.0; + + for (int i = 0; i < 3; i++) { + // Pressure and pistons mass Q + p_start[i] = p_stop[i] = p_period[i] = 0.0; + p_flag[i] = 0; + + // Pistons coordinates derivative V + p_deriv[i] = 0.0; + + // a and b values for each piston + gjfa[i] = 0.0; + gjfb[i] = 0.0; + + // Random value for each piston + fran[i] = 0.0; + } + + // process keywords + + dimension = domain->dimension; + + int iarg = 3; + + while (iarg < narg) { + if (strcmp(arg[iarg],"iso") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + pcouple = XYZ; + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = p_flag[1] = p_flag[2] = 1; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_flag[2] = 0; + } + iarg += 4; + } else if (strcmp(arg[iarg],"aniso") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + pcouple = NONE; + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = p_flag[1] = p_flag[2] = 1; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_flag[2] = 0; + } + iarg += 4; + + } else if (strcmp(arg[iarg],"x") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = 1; + iarg += 4; + } else if (strcmp(arg[iarg],"y") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[1] = 1; + iarg += 4; + } else if (strcmp(arg[iarg],"z") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[2] = 1; + iarg += 4; + if (dimension == 2) + error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + + } else if (strcmp(arg[iarg],"couple") == 0) { + if (iarg+2 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; + else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; + else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; + else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; + else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; + else error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 2; + + } else if (strcmp(arg[iarg],"friction") == 0) { + if (iarg+3 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + p_fric = utils::numeric(FLERR,arg[iarg+1],false,lmp); + seed = utils::numeric(FLERR,arg[iarg+2],false,lmp); + if (p_fric <= 0.0) + error->all(FLERR,"Illegal fix press/langevin command"); + if (seed <= 0.0) + error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 3; + } else if (strcmp(arg[iarg],"dilate") == 0) { + if (iarg+2 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; + else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; + else error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 2; + } else if (strcmp(arg[iarg], "temp") == 0) { + if (iarg+3 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); + t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); + iarg += 3; + } + + else error->all(FLERR,"Illegal fix press/langevin command"); + } + + if (allremap == 0) restart_pbc = 1; + + random = new RanMars(lmp, seed + comm->me); + + // error checks + + if (dimension == 2 && p_flag[2]) + error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) + error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + + if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + + if (p_flag[0] && domain->xperiodic == 0) + error->all(FLERR, + "Cannot use fix press/langevin on a non-periodic dimension"); + if (p_flag[1] && domain->yperiodic == 0) + error->all(FLERR, + "Cannot use fix press/langevin on a non-periodic dimension"); + if (p_flag[2] && domain->zperiodic == 0) + error->all(FLERR, + "Cannot use fix press/langevin on a non-periodic dimension"); + + if (pcouple == XYZ && dimension == 3 && + (p_start[0] != p_start[1] || p_start[0] != p_start[2] || + p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || + p_period[0] != p_period[1] || p_period[0] != p_period[2])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XYZ && dimension == 2 && + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || + p_period[0] != p_period[1])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XY && + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || + p_period[0] != p_period[1])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == YZ && + (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || + p_period[1] != p_period[2])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + if (pcouple == XZ && + (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || + p_period[0] != p_period[2])) + error->all(FLERR,"Invalid fix press/langevin pressure settings"); + + if (t_start < 0.0) + error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); + if (t_stop < 0.0) + error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); + + if ((p_flag[0] && p_period[0] <= 0.0) || + (p_flag[1] && p_period[1] <= 0.0) || + (p_flag[2] && p_period[2] <= 0.0)) + error->all(FLERR,"Fix press/langevin damping parameters must be > 0.0"); + + if (p_flag[0]) box_change |= BOX_CHANGE_X; + if (p_flag[1]) box_change |= BOX_CHANGE_Y; + if (p_flag[2]) box_change |= BOX_CHANGE_Z; + + // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof + // else pstyle = ANISO -> 3 dof + + if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; + else pstyle = ANISO; + + // C1 + // Langevin GJF dynamics does NOT need a temperature compute + // This is stated explicitely in their paper. + // The temperature used for the pressure is NkT/V on purpose. + + // id = fix-ID + temp + // compute group = all since pressure is always global (group all) + // and thus its KE/temperature contribution should use group all + + // id_temp = utils::strdup(std::string(id) + "_temp"); + // modify->add_compute(fmt::format("{} all temp",id_temp)); + // tflag = 1; + + // C2 + // Following C1, the compute must use the virial pressure + // Kinetic contribution will be added by the fix style + // create a new compute pressure style + // id = fix-ID + press, compute group = all + // pass id_temp as 4th arg to pressure constructor + + id_press = utils::strdup(std::string(id) + "_press"); + modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); + pflag = 1; + + for (int i = 0; i < 3; i++) { + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); + } + + nrigid = 0; + rfix = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +FixPressLangevin::~FixPressLangevin() +{ + delete random; + delete[] rfix; + + // delete temperature and pressure if fix created them + + if (pflag) modify->delete_compute(id_press); + delete[] id_press; +} + +/* ---------------------------------------------------------------------- */ + +int FixPressLangevin::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= POST_FORCE; + mask |= END_OF_STEP; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::init() +{ + if (domain->triclinic) + error->all(FLERR,"Cannot use fix press/langevin with triclinic box"); + + // ensure no conflict with fix deform + + for (const auto &ifix : modify->get_fix_list()) + if (strcmp(ifix->style, "^deform") == 0) { + int *dimflag = static_cast(ifix)->dimflag; + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || + (p_flag[2] && dimflag[2])) + error->all(FLERR,"Cannot use fix press/langevin and " + "fix deform on same component of stress tensor"); + } + + // set pressure ptr + + pressure = modify->get_compute_by_id(id_press); + if (!pressure) + error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); + + // Kspace setting + + if (force->kspace) kspace_flag = 1; + else kspace_flag = 0; + + // detect if any rigid fixes exist so rigid bodies move when box is remapped + // rfix[] = indices to each fix rigid + + delete[] rfix; + nrigid = 0; + rfix = nullptr; + + for (int i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) nrigid++; + if (nrigid > 0) { + rfix = new int[nrigid]; + nrigid = 0; + for (int i = 0; i < modify->nfix; i++) + if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; + } +} + +/* ---------------------------------------------------------------------- + compute T,P before integrator starts +------------------------------------------------------------------------- */ + +void FixPressLangevin::setup(int /*vflag*/) +{ + // trigger virial computation on next timestep + + pressure->addstep(update->ntimestep+1); +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::initial_integrate(int /* vflag */) +{ + // compute new V + + double dt; + double dl; + double displacement; + double delta = update->ntimestep - update->beginstep; + + // Compute new random term on pistons dynamics + if (delta != 0.0) delta /= update->endstep - update->beginstep; + t_target = t_start + delta * (t_stop-t_start); + couple_beta(t_target); + + dt = update->dt; + + for (int i = 0; i < 3; i++) { + if (p_flag[i]) { + // See equation 13 + displacement = dt*p_deriv[i]*gjfb[i]; + displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_period[i]; + displacement += 0.5*dt*fran[i]*gjfb[i]/p_period[i]; + dl = domain->boxhi[i] - domain->boxlo[i]; + dilation[i] = (dl + displacement)/dl; + } + } + + // remap simulation box and atoms + // redo KSpace coeffs since volume has changed + + remap(); + if (kspace_flag) force->kspace->setup(); + +} + +/* ---------------------------------------------------------------------- */ +void FixPressLangevin::post_force(int /*vflag*/) +{ + // compute new forces on pistons after internal virial computation + + double delta = update->ntimestep - update->beginstep; + if (delta != 0.0) delta /= update->endstep - update->beginstep; + + // Compute current pressure tensor and add kinetic term + if (pstyle == ISO) { + pressure->compute_scalar(); + } else { + pressure->compute_vector(); + } + + couple_pressure(); + couple_kinetic(t_target); + + for (int i = 0; i < 3; i++) { + if (p_flag[i]) { + f_old_piston[i] = f_piston[i]; + p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); + f_piston[i] = p_current[i] - p_target[i]; + } + } + + // trigger virial computation on next timestep + + pressure->addstep(update->ntimestep+1); +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::end_of_step() +{ + // compute pistons velocity + + double dt; + dt = update->dt; + + for (int i = 0; i < 3; i++) { + if (p_flag[i]) { + p_deriv[i] *= gjfa[i]; + p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_period[i]; + p_deriv[i] += fran[i]*gjfb[i]/p_period[i]; + } + } + +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::couple_pressure() +{ + double *tensor = pressure->vector; + + if (pstyle == ISO) + p_current[0] = p_current[1] = p_current[2] = pressure->scalar; + else if (pcouple == XYZ) { + double ave = 1.0/3.0 * (tensor[0] + tensor[1] + tensor[2]); + p_current[0] = p_current[1] = p_current[2] = ave; + } else if (pcouple == XY) { + double ave = 0.5 * (tensor[0] + tensor[1]); + p_current[0] = p_current[1] = ave; + p_current[2] = tensor[2]; + } else if (pcouple == YZ) { + double ave = 0.5 * (tensor[1] + tensor[2]); + p_current[1] = p_current[2] = ave; + p_current[0] = tensor[0]; + } else if (pcouple == XZ) { + double ave = 0.5 * (tensor[0] + tensor[2]); + p_current[0] = p_current[2] = ave; + p_current[1] = tensor[1]; + } else { + p_current[0] = tensor[0]; + p_current[1] = tensor[1]; + p_current[2] = tensor[2]; + } +} +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::couple_kinetic(double t_target) +{ + double Pk, volume; + + // Kinetic part + if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; + else volume = domain->xprd * domain->yprd; + + Pk = atom->natoms*force->boltz*t_target/volume; + + p_current[0] += Pk; + p_current[1] += Pk; + if (dimension == 3) p_current[2] += Pk; +} + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::couple_beta(double t_target) +{ + double gamma; + int me = comm->me; + + gamma = sqrt(2.0*force->boltz*update->dt*p_fric*t_target); + + fran[0] = fran[1] = fran[2] = 0.0; + if (me == 0) { + if (pstyle == ISO) + fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + else if (pcouple == XYZ) { + fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + } else if (pcouple == XY) { + fran[0] = fran[1] = gamma*random->gaussian(); + fran[2] = gamma*random->gaussian(); + } else if (pcouple == YZ) { + fran[1] = fran[2] = gamma*random->gaussian(); + fran[0] = gamma*random->gaussian(); + } else if (pcouple == XZ) { + fran[0] = fran[2] = gamma*random->gaussian(); + fran[1] = gamma*random->gaussian(); + } else { + fran[0] = gamma*random->gaussian(); + fran[1] = gamma*random->gaussian(); + fran[2] = gamma*random->gaussian(); + } + } + MPI_Bcast(&fran, 3, MPI_DOUBLE, 0, world); +} + +/* ---------------------------------------------------------------------- + change box size + remap all atoms or fix group atoms depending on allremap flag + if rigid bodies exist, scale rigid body centers-of-mass +------------------------------------------------------------------------- */ + +void FixPressLangevin::remap() +{ + int i; + double oldlo,oldhi,ctr; + + double **x = atom->x; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // convert pertinent atoms and rigid bodies to lamda coords + + if (allremap) domain->x2lamda(nlocal); + else { + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + domain->x2lamda(x[i],x[i]); + } + + if (nrigid) + for (i = 0; i < nrigid; i++) + modify->fix[rfix[i]]->deform(0); + + // reset global and local box to new size/shape + + for (i = 0; i < 3; i++) { + if (p_flag[i]) { + oldlo = domain->boxlo[i]; + oldhi = domain->boxhi[i]; + ctr = 0.5 * (oldlo + oldhi); + domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; + domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + } + } + + domain->set_global_box(); + domain->set_local_box(); + + // convert pertinent atoms and rigid bodies back to box coords + + if (allremap) domain->lamda2x(nlocal); + else { + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + domain->lamda2x(x[i],x[i]); + } + + if (nrigid) + for (i = 0; i < nrigid; i++) + modify->fix[rfix[i]]->deform(1); +} + +/* ---------------------------------------------------------------------- */ + +int FixPressLangevin::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0],"press") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (pflag) { + modify->delete_compute(id_press); + pflag = 0; + } + delete[] id_press; + id_press = utils::strdup(arg[1]); + + pressure = modify->get_compute_by_id(arg[1]); + if (pressure) error->all(FLERR,"Could not find fix_modify pressure compute ID: {}", arg[1]); + if (pressure->pressflag == 0) + error->all(FLERR,"Fix_modify pressure compute {} does not compute pressure", arg[1]); + return 2; + } + return 0; +} diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h new file mode 100644 index 0000000000..a0ea8bbd5a --- /dev/null +++ b/src/fix_press_langevin.h @@ -0,0 +1,71 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 +// clang-format off +FixStyle(press/langevin,FixPressLangevin); +// clang-format on +#else + +#ifndef LMP_FIX_PRESS_LANGEVIN_H +#define LMP_FIX_PRESS_LANGEVIN_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixPressLangevin : public Fix { + public: + FixPressLangevin(class LAMMPS *, int, char **); + ~FixPressLangevin() override; + int setmask() override; + void init() override; + void setup(int) override; + void initial_integrate(int) override; + void post_force(int) override; + void end_of_step() override; + int modify_param(int, char **) override; + + protected: + int dimension, which; + + int pstyle, pcouple, allremap; + int p_flag[3]; // 1 if control P on this dim, 0 if not + double t_start, t_stop, t_target; + double p_fric; + double p_start[3], p_stop[3], p_current[3]; + double p_period[3], p_target[3]; + double p_deriv[3], dilation[3]; + double f_piston[3], f_old_piston[3]; + double gjfa[3], gjfb[3], fran[3]; + int kspace_flag; // 1 if KSpace invoked, 0 if not + int nrigid; // number of rigid fixes + int *rfix; // indices of rigid fixes + + char *id_temp, *id_press; + class Compute *temperature, *pressure; + int pflag; + + class RanMars *random; + int seed; + + void couple_pressure(); + void couple_kinetic(double ); + void couple_beta(double ); + void remap(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif From 1c33aec5dc64d0da59368d42a81b71679ca011cc Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Wed, 17 May 2023 18:28:49 +0200 Subject: [PATCH 011/417] Wrote the documentation for fix_press_langevin --- doc/src/Commands_fix.rst | 1 + doc/src/fix.rst | 1 + doc/src/fix_press_langevin.rst | 230 +++++++++++++++++++++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 doc/src/fix_press_langevin.rst diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index c74b1fd037..f7b85a5d12 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -181,6 +181,7 @@ OPT. * :doc:`pour ` * :doc:`precession/spin ` * :doc:`press/berendsen ` + * :doc:`press/langevin ` * :doc:`print ` * :doc:`propel/self ` * :doc:`property/atom (k) ` diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 8cee9dd687..c4abbd6c21 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -333,6 +333,7 @@ accelerated styles exist. * :doc:`pour ` - pour new atoms/molecules into a granular simulation domain * :doc:`precession/spin ` - apply a precession torque to each magnetic spin * :doc:`press/berendsen ` - pressure control by Berendsen barostat +* :doc:`press/langevin ` - pressure control by Langevin barostat * :doc:`print ` - print text and variables during a simulation * :doc:`propel/self ` - model self-propelled particles * :doc:`property/atom ` - add customized per-atom values diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst new file mode 100644 index 0000000000..cb46d2b7d9 --- /dev/null +++ b/doc/src/fix_press_langevin.rst @@ -0,0 +1,230 @@ +.. index:: fix press/langevin + +fix press/langevin command +=========================== + +Syntax +"""""" + +.. parsed-literal:: + + fix ID group-ID press/langevin keyword value ... + +* ID, group-ID are documented in :doc:`fix ` command +* press/langevin = style name of this fix command + + .. parsed-literal:: + + one or more keyword value pairs may be appended + keyword = *iso* or *aniso* or *x* or *y* or *z* or *couple* or *dilate* or *modulus* or *temp* + *iso* or *aniso* values = Pstart Pstop Pdamp + Pstart,Pstop = scalar external pressure at start/end of run (pressure units) + Pdamp = pressure damping parameter + *x* or *y* or *z* values = Pstart Pstop Pdamp + Pstart,Pstop = external stress tensor component at start/end of run (pressure units) + Pdamp = stress damping parameter + *couple* = *none* or *xyz* or *xy* or *yz* or *xz* + *friction* value = Friction to apply to the barostat + *temp* values = Tstart, Tstop + Tstart, Tstop = target temperature used for the barostat at start/end of run + *dilate* value = *all* or *partial* + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 1 all press/langevin iso 0.0 0.0 1000.0 temp 300 300 + fix 2 all press/langevin aniso 0.0 0.0 1000.0 temp 100 300 dilate partial + +Description +""""""""""" + +Reset the pressure of the system by using a Langevin stochastic barostat +:ref:`(Grønbech) `, which rescales the system volume and +(optionally) the atoms coordinates within the simulation box every +timestep. + +The Langevin barostat couple each direction *L* with a pseudo-particle that obeys +the Langevin equation such as: + +.. math:: + + f_P = & \frac{N k_B T_{target}}{V} + \frac{1}{V d}\sum_{i=1}^{N} \vec r_i \cdot \vec f_i - P_{target} \\ + Q\ddot{L} + \alpha{}\dot{L} = & f_P + \beta(t)\\ + L^{n+1} = & L^{n} + bdt\dot{L}^{n} \frac{bdt^{2}}{2Q} \\ + \dot{L}^{n+1} = & \alpha\dot{L}^{n} + \frac{dt}{2Q}\left(a f^{n}_{P} + f^{n+1}_{P}\right) + \frac{b}{Q}\beta^{n+1} \\ + a = & \frac{1-\frac{\alpha{}dt}{2Q}}{1+\frac{\alpha{}dt}{2Q}} \\ + b = & \frac{1}{1+\frac{\alpha{}dt}{2Q}} \\ + \left< \beta(t)\beta(t') \right> = & 2\alpha k_B Tdt + +Where :math:`dt` is the timestep :math:`\dot{L}` and :math:`\ddot{L}` the first +and second derivatives of the coupled direction with regard to time, +:math:`\alpha` is a friction coefficient, :math:`\beta` is a random gaussian +variable and :math:`Q` the effective mass of the coupled pseudoparticle. The +two first terms on the righthand side of the first equation are the virial +expression of the canonical pressure. It is to be noted that the temperature +used to compute the pressure is not the velocity of the atom but the canonical +target temperature directly. This temperature is specified using the *temp* +keyword parameter and should be close to the current target temperature of the +system. + +Regardless of what atoms are in the fix group, a global pressure is +computed for all atoms. Similarly, when the size of the simulation +box is changed, all atoms are re-scaled to new positions, unless the +keyword *dilate* is specified with a value of *partial*, in which case +only the atoms in the fix group are re-scaled. The latter can be +useful for leaving the coordinates of atoms in a solid substrate +unchanged and controlling the pressure of a surrounding fluid. + +.. note:: + + Unlike the :doc:`fix npt ` or :doc:`fix nph ` commands which + perform Nose/Hoover barostatting AND time integration, this fix does NOT + perform time integration of the atoms but only of the barostat coupled + coordinate. It then only modifies the box size and atom coordinates to + effect barostatting. Thus you must use a separate time integration fix, + like :doc:`fix nve ` or :doc:`fix nvt ` to actually update + the positions and velocities of atoms. This fix can be used in conjunction + with thermostatting fixes to control the temperature, such as :doc:`fix nvt + ` or :doc:`fix langevin ` or :doc:`fix temp/berendsen + `. + +See the :doc:`Howto barostat ` page for a +discussion of different ways to perform barostatting. + +---------- + +The barostat is specified using one or more of the *iso*, *aniso*, +*x*, *y*, *z*, and *couple* keywords. These keywords give you the +ability to specify the 3 diagonal components of an external stress +tensor, and to couple various of these components together so that the +dimensions they represent are varied together during a +constant-pressure simulation. Unlike the :doc:`fix npt ` and +:doc:`fix nph ` commands, this fix cannot be used with triclinic +(non-orthogonal) simulation boxes to control all 6 components of the +general pressure tensor. + +The target pressures for each of the 3 diagonal components of the +stress tensor can be specified independently via the *x*, *y*, *z*, +keywords, which correspond to the 3 simulation box dimensions. For +each component, the external pressure or tensor component at each +timestep is a ramped value during the run from *Pstart* to *Pstop*\ . +If a target pressure is specified for a component, then the +corresponding box dimension will change during a simulation. For +example, if the *y* keyword is used, the y-box length will change. A +box dimension will not change if that component is not specified, +although you have the option to change that dimension via the :doc:`fix deform ` command. + +For all barostat keywords, the *Pdamp* parameter determines the "mass" of the +pseudo particle acting as a barostat. The relation is such that :math:`P_{damp} += \frac{1}{Q}` where Q is the mass. + +---------- + +The *couple* keyword allows two or three of the diagonal components of +the pressure tensor to be "coupled" together. The value specified +with the keyword determines which are coupled. For example, *xz* +means the *Pxx* and *Pzz* components of the stress tensor are coupled. +*Xyz* means all 3 diagonal components are coupled. Coupling means two +things: the instantaneous stress will be computed as an average of the +corresponding diagonal components, and the coupled box dimensions will +be changed together in lockstep, meaning coupled dimensions will be +dilated or contracted by the same percentage every timestep. The +*Pstart*, *Pstop*, *Pdamp* parameters for any coupled dimensions must +be identical. *Couple xyz* can be used for a 2d simulation; the *z* +dimension is simply ignored. + +---------- + +The *iso* and *aniso* keywords are simply shortcuts that are +equivalent to specifying several other keywords together. + +The keyword *iso* means couple all 3 diagonal components together when +pressure is computed (hydrostatic pressure), and dilate/contract the +dimensions together. Using "iso Pstart Pstop Pdamp" is the same as +specifying these 4 keywords: + +.. parsed-literal:: + + x Pstart Pstop Pdamp + y Pstart Pstop Pdamp + z Pstart Pstop Pdamp + couple xyz + +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the +stress tensor as the driving forces, and the specified scalar external +pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying +these 4 keywords: + +.. parsed-literal:: + + x Pstart Pstop Pdamp + y Pstart Pstop Pdamp + z Pstart Pstop Pdamp + couple none + +---------- + +This fix computes pressure each timestep. To do +this, the fix creates its own computes of style "pressure", +as if this command had been issued: + +.. code-block:: LAMMPS + + compute fix-ID_press group-ID pressure fix-ID_NULL virial + +See the :doc:`compute pressure ` command for details. Note +that the IDs of the new compute is the fix-ID + underscore + "press" and the +group for the new computes is the same as the fix group. + +Note that this is NOT the compute used by thermodynamic output (see +the :doc:`thermo_style ` command) with ID = *thermo_press*. +This means you can change the attributes of this fix's pressure via the +:doc:`compute_modify ` command or print this temperature +or pressure during thermodynamic output via the :doc:`thermo_style custom ` command using the appropriate compute-ID. +It also means that changing attributes of *thermo_temp* or +*thermo_press* will have no effect on this fix. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +No information about this fix is written to :doc:`binary restart files `. + +The :doc:`fix_modify ` *press* option is +supported by this fix. You can use it to assign a +:doc:`compute ` you have defined to this fix which will be used +in its pressure calculations. + +No global or per-atom quantities are stored by this fix for access by +various :doc:`output commands `. + +This fix can ramp its target pressure over multiple runs, using the +*start* and *stop* keywords of the :doc:`run ` command. See the +:doc:`run ` command for details of how to do this. + +This fix is not invoked during :doc:`energy minimization `. + +Restrictions +"""""""""""" + +Any dimension being adjusted by this fix must be periodic. + +Related commands +"""""""""""""""" + +:doc:`fix nve `, :doc:`fix nph `, :doc:`fix npt `, :doc:`fix langevin `, +:doc:`fix_modify ` + +Default +""""""" + +The keyword defaults are dilate = all, friction = 0.0001 in units of +pressure for whatever :doc:`units ` are defined. + +---------- + +.. _Grønbech: + +**(Grønbech)** Grønbech-Jensen, Farago, J Chem Phys, 141, 194108 (2014). From ab925000fe4a0da5dffcd14b1be897c20a039c75 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Fri, 19 May 2023 16:34:42 +0200 Subject: [PATCH 012/417] Added triclinic and relative remap functions to press/langevin files --- src/fix_press_langevin.cpp | 235 +++++++++++++++++++++++++++++++++---- src/fix_press_langevin.h | 18 ++- 2 files changed, 224 insertions(+), 29 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 246d2f08f1..0848cc9ab6 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -26,6 +26,7 @@ #include "fix_deform.h" #include "force.h" #include "group.h" +#include "irregular.h" #include "kspace.h" #include "modify.h" #include "random_mars.h" @@ -37,14 +38,17 @@ using namespace LAMMPS_NS; using namespace FixConst; +#define DELTAFLIP 0.1 +#define TILTMAX 1.5 + enum{NONE,XYZ,XY,YZ,XZ}; -enum{ISO,ANISO}; +enum{ISO,ANISO,TRICLINIC}; /* ---------------------------------------------------------------------- */ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - id_press(nullptr), pflag(0), random(nullptr) + id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) { if (narg < 5) error->all(FLERR,"Illegal fix press/langevin command"); @@ -58,13 +62,15 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pcouple = NONE; allremap = 1; + pre_exchange_flag = 0; + flipflag = 1; // Alpha friction coefficient p_fric = 1e-4; // Target temperature t_start = t_stop = t_target = 0.0; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { // Pressure and pistons mass Q p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; @@ -113,7 +119,28 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_flag[2] = 0; } iarg += 4; - + } else if (strcmp(arg[iarg],"tri") == 0) { + if (iarg+4 > narg) + error->all(FLERR,"Illegal fix press/langevin command"); + pcouple = NONE; + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[0] = p_flag[1] = p_flag[2] = 1; + p_start[3] = p_start[4] = p_start[5] = 0.0; + p_stop[3] = p_stop[4] = p_stop[5] = 0.0; + p_period[3] = p_period[4] = p_period[5] = + utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[3] = p_flag[4] = p_flag[5] = 1; + if (dimension == 2) { + p_start[2] = p_stop[2] = p_period[2] = 0.0; + p_flag[2] = 0; + p_start[3] = p_stop[3] = p_period[3] = 0.0; + p_flag[3] = 0; + p_start[4] = p_stop[4] = p_period[4] = 0.0; + p_flag[4] = 0; + } + iarg += 4; } else if (strcmp(arg[iarg],"x") == 0) { if (iarg+4 > narg) error->all(FLERR,"Illegal fix press/langevin command"); @@ -140,6 +167,37 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : iarg += 4; if (dimension == 2) error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + } else if (strcmp(arg[iarg],"xy") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} yz", style), error); + p_start[3] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[3] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[3] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[3] = 1; + iarg += 4; + if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + + } else if (strcmp(arg[iarg],"xz") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xz", style), error); + p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[4] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[4] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[4] = 1; + iarg += 4; + if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + + } else if (strcmp(arg[iarg],"yz") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xy", style), error); + p_start[5] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + p_stop[5] = utils::numeric(FLERR,arg[iarg+2],false,lmp); + p_period[5] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_flag[5] = 1; + iarg += 4; + if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + + } else if (strcmp(arg[iarg],"flip") == 0) { + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} flip", style), error); + flipflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; } else if (strcmp(arg[iarg],"couple") == 0) { if (iarg+2 > narg) @@ -212,6 +270,17 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); + // require periodicity in 2nd dim of off-diagonal tilt component + + if (p_flag[3] && domain->zperiodic == 0) + error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); + if (p_flag[4] && domain->zperiodic == 0) + error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); + if (p_flag[5] && domain->yperiodic == 0) + error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); + if (!domain->triclinic && (p_flag[3] || p_flag[4] || p_flag[5])) + error->all(FLERR,"Can not specify Pxy/Pxz/Pyz in fix {} with non-triclinic box", style); + if (pcouple == XYZ && dimension == 3 && (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || @@ -234,26 +303,35 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_period[0] != p_period[2])) error->all(FLERR,"Invalid fix press/langevin pressure settings"); - if (t_start < 0.0) - error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); - if (t_stop < 0.0) + if (t_start < 0.0 || t_stop < 0.0) error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); if ((p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || - (p_flag[2] && p_period[2] <= 0.0)) + (p_flag[2] && p_period[2] <= 0.0) || + (p_flag[3] && p_period[3] <= 0.0) || + (p_flag[4] && p_period[4] <= 0.0) || + (p_flag[5] && p_period[5] <= 0.0)) error->all(FLERR,"Fix press/langevin damping parameters must be > 0.0"); - if (p_flag[0]) box_change |= BOX_CHANGE_X; - if (p_flag[1]) box_change |= BOX_CHANGE_Y; - if (p_flag[2]) box_change |= BOX_CHANGE_Z; - // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof - if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; + if (p_flag[3] || p_flag[4] || p_flag[5]) pstyle = TRICLINIC; + else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; + // pre_exchange only required if flips can occur due to shape changes + + if (flipflag && (p_flag[3] || p_flag[4] || p_flag[5])) + pre_exchange_flag = pre_exchange_migrate = 1; + if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || + domain->xy != 0.0)) + pre_exchange_flag = pre_exchange_migrate = 1; + + if (pre_exchange_flag) irregular = new Irregular(lmp); + else irregular = nullptr; + // C1 // Langevin GJF dynamics does NOT need a temperature compute // This is stated explicitely in their paper. @@ -278,7 +356,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); pflag = 1; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); } @@ -293,6 +371,8 @@ FixPressLangevin::~FixPressLangevin() { delete random; delete[] rfix; + delete irregular; + // delete temperature and pressure if fix created them @@ -308,6 +388,7 @@ int FixPressLangevin::setmask() mask |= INITIAL_INTEGRATE; mask |= POST_FORCE; mask |= END_OF_STEP; + if (pre_exchange_flag) mask |= PRE_EXCHANGE; return mask; } @@ -315,16 +396,14 @@ int FixPressLangevin::setmask() void FixPressLangevin::init() { - if (domain->triclinic) - error->all(FLERR,"Cannot use fix press/langevin with triclinic box"); - // ensure no conflict with fix deform for (const auto &ifix : modify->get_fix_list()) if (strcmp(ifix->style, "^deform") == 0) { int *dimflag = static_cast(ifix)->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2])) + (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || + (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) error->all(FLERR,"Cannot use fix press/langevin and " "fix deform on same component of stress tensor"); } @@ -386,14 +465,15 @@ void FixPressLangevin::initial_integrate(int /* vflag */) dt = update->dt; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { if (p_flag[i]) { // See equation 13 displacement = dt*p_deriv[i]*gjfb[i]; displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_period[i]; displacement += 0.5*dt*fran[i]*gjfb[i]/p_period[i]; dl = domain->boxhi[i] - domain->boxlo[i]; - dilation[i] = (dl + displacement)/dl; + if (i < 3) dilation[i] = (dl + displacement)/dl; + else dilation[i] = displacement; } } @@ -423,7 +503,7 @@ void FixPressLangevin::post_force(int /*vflag*/) couple_pressure(); couple_kinetic(t_target); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { if (p_flag[i]) { f_old_piston[i] = f_piston[i]; p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); @@ -445,7 +525,7 @@ void FixPressLangevin::end_of_step() double dt; dt = update->dt; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_period[i]; @@ -483,6 +563,9 @@ void FixPressLangevin::couple_pressure() p_current[1] = tensor[1]; p_current[2] = tensor[2]; } + p_current[3] = tensor[3]; + p_current[4] = tensor[4]; + p_current[5] = tensor[5]; } /* ---------------------------------------------------------------------- */ @@ -511,6 +594,7 @@ void FixPressLangevin::couple_beta(double t_target) gamma = sqrt(2.0*force->boltz*update->dt*p_fric*t_target); fran[0] = fran[1] = fran[2] = 0.0; + fran[3] = fran[4] = fran[5] = 0.0; if (me == 0) { if (pstyle == ISO) fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); @@ -530,8 +614,11 @@ void FixPressLangevin::couple_beta(double t_target) fran[1] = gamma*random->gaussian(); fran[2] = gamma*random->gaussian(); } + fran[3] = gamma*random->gaussian(); + fran[4] = gamma*random->gaussian(); + fran[5] = gamma*random->gaussian(); } - MPI_Bcast(&fran, 3, MPI_DOUBLE, 0, world); + MPI_Bcast(&fran, 6, MPI_DOUBLE, 0, world); } /* ---------------------------------------------------------------------- @@ -574,6 +661,19 @@ void FixPressLangevin::remap() } } + if (p_flag[3]) domain->xy += dilation[3]; + if (p_flag[4]) domain->xz += dilation[4]; + if (p_flag[5]) domain->yz += dilation[5]; + + if (domain->yz < -TILTMAX*domain->yprd || + domain->yz > TILTMAX*domain->yprd || + domain->xz < -TILTMAX*domain->xprd || + domain->xz > TILTMAX*domain->xprd || + domain->xy < -TILTMAX*domain->xprd || + domain->xy > TILTMAX*domain->xprd) + error->all(FLERR,"Fix {} has tilted box too far in one step - " + "periodic cell is too far from equilibrium state", style); + domain->set_global_box(); domain->set_local_box(); @@ -591,6 +691,85 @@ void FixPressLangevin::remap() modify->fix[rfix[i]]->deform(1); } +/* ---------------------------------------------------------------------- + if any tilt ratios exceed limits, set flip = 1 and compute new tilt values + do not flip in x or y if non-periodic (can tilt but not flip) + this is b/c the box length would be changed (dramatically) by flip + if yz tilt exceeded, adjust C vector by one B vector + if xz tilt exceeded, adjust C vector by one A vector + if xy tilt exceeded, adjust B vector by one A vector + check yz first since it may change xz, then xz check comes after + if any flip occurs, create new box in domain + image_flip() adjusts image flags due to box shape change induced by flip + remap() puts atoms outside the new box back into the new box + perform irregular on atoms in lamda coords to migrate atoms to new procs + important that image_flip comes before remap, since remap may change + image flags to new values, making eqs in doc of Domain:image_flip incorrect +------------------------------------------------------------------------- */ + +void FixPressLangevin::pre_exchange() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + + // flip is only triggered when tilt exceeds 0.5 by DELTAFLIP + // this avoids immediate re-flipping due to tilt oscillations + + double xtiltmax = (0.5+DELTAFLIP)*xprd; + double ytiltmax = (0.5+DELTAFLIP)*yprd; + + int flipxy,flipxz,flipyz; + flipxy = flipxz = flipyz = 0; + + if (domain->yperiodic) { + if (domain->yz < -ytiltmax) { + domain->yz += yprd; + domain->xz += domain->xy; + flipyz = 1; + } else if (domain->yz >= ytiltmax) { + domain->yz -= yprd; + domain->xz -= domain->xy; + flipyz = -1; + } + } + + if (domain->xperiodic) { + if (domain->xz < -xtiltmax) { + domain->xz += xprd; + flipxz = 1; + } else if (domain->xz >= xtiltmax) { + domain->xz -= xprd; + flipxz = -1; + } + if (domain->xy < -xtiltmax) { + domain->xy += xprd; + flipxy = 1; + } else if (domain->xy >= xtiltmax) { + domain->xy -= xprd; + flipxy = -1; + } + } + + int flip = 0; + if (flipxy || flipxz || flipyz) flip = 1; + + if (flip) { + domain->set_global_box(); + domain->set_local_box(); + + domain->image_flip(flipxy,flipxz,flipyz); + + double **x = atom->x; + imageint *image = atom->image; + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); + + domain->x2lamda(atom->nlocal); + irregular->migrate_atoms(); + domain->lamda2x(atom->nlocal); + } +} + /* ---------------------------------------------------------------------- */ int FixPressLangevin::modify_param(int narg, char **arg) @@ -612,3 +791,13 @@ int FixPressLangevin::modify_param(int narg, char **arg) } return 0; } + +/* ---------------------------------------------------------------------- */ + +void FixPressLangevin::reset_dt() +{ + for (int i=0; i<6; i++) { + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); + } +} diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index a0ea8bbd5a..b5a62d2646 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -31,23 +31,25 @@ class FixPressLangevin : public Fix { int setmask() override; void init() override; void setup(int) override; + void pre_exchange() override; void initial_integrate(int) override; void post_force(int) override; void end_of_step() override; + void reset_dt() override; int modify_param(int, char **) override; protected: int dimension, which; int pstyle, pcouple, allremap; - int p_flag[3]; // 1 if control P on this dim, 0 if not + int p_flag[6]; // 1 if control P on this dim, 0 if not double t_start, t_stop, t_target; double p_fric; - double p_start[3], p_stop[3], p_current[3]; - double p_period[3], p_target[3]; - double p_deriv[3], dilation[3]; - double f_piston[3], f_old_piston[3]; - double gjfa[3], gjfb[3], fran[3]; + double p_start[6], p_stop[6], p_current[6]; + double p_period[6], p_target[6]; + double p_deriv[6], dilation[6]; + double f_piston[6], f_old_piston[6]; + double gjfa[6], gjfb[6], fran[6]; int kspace_flag; // 1 if KSpace invoked, 0 if not int nrigid; // number of rigid fixes int *rfix; // indices of rigid fixes @@ -56,6 +58,10 @@ class FixPressLangevin : public Fix { class Compute *temperature, *pressure; int pflag; + int flipflag; + int pre_exchange_flag; // set if pre_exchange needed for box flips + class Irregular *irregular; // for migrating atoms after box flips + class RanMars *random; int seed; From 93402f61d82f99453317464491b5a3e058bcd30c Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Sat, 20 May 2023 08:58:52 +0200 Subject: [PATCH 013/417] Updated the documentation to include triclinic commands and other info. --- doc/src/fix_press_langevin.rst | 77 +++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index cb46d2b7d9..9401e035a3 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -16,15 +16,15 @@ Syntax .. parsed-literal:: one or more keyword value pairs may be appended - keyword = *iso* or *aniso* or *x* or *y* or *z* or *couple* or *dilate* or *modulus* or *temp* - *iso* or *aniso* values = Pstart Pstop Pdamp + keyword = *iso* or *aniso* or *tri* *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* + *iso* or *aniso* or *tri* values = Pstart Pstop Pdamp Pstart,Pstop = scalar external pressure at start/end of run (pressure units) Pdamp = pressure damping parameter - *x* or *y* or *z* values = Pstart Pstop Pdamp + *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) Pdamp = stress damping parameter *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *friction* value = Friction to apply to the barostat + *friction* value = Alpha friction value to apply to the barostat *temp* values = Tstart, Tstop Tstart, Tstop = target temperature used for the barostat at start/end of run *dilate* value = *all* or *partial* @@ -95,26 +95,23 @@ discussion of different ways to perform barostatting. ---------- -The barostat is specified using one or more of the *iso*, *aniso*, -*x*, *y*, *z*, and *couple* keywords. These keywords give you the -ability to specify the 3 diagonal components of an external stress -tensor, and to couple various of these components together so that the -dimensions they represent are varied together during a -constant-pressure simulation. Unlike the :doc:`fix npt ` and -:doc:`fix nph ` commands, this fix cannot be used with triclinic -(non-orthogonal) simulation boxes to control all 6 components of the -general pressure tensor. +The barostat is specified using one or more of the *iso*, *aniso*, *tri* *x*, +*y*, *z*, *xy*, *xz*, *yz*, and *couple* keywords. These keywords give you the +ability to specify the 3 diagonal components of an external stress tensor, and +to couple various of these components together so that the dimensions they +represent are varied together during a constant-pressure simulation. -The target pressures for each of the 3 diagonal components of the -stress tensor can be specified independently via the *x*, *y*, *z*, -keywords, which correspond to the 3 simulation box dimensions. For -each component, the external pressure or tensor component at each -timestep is a ramped value during the run from *Pstart* to *Pstop*\ . -If a target pressure is specified for a component, then the -corresponding box dimension will change during a simulation. For -example, if the *y* keyword is used, the y-box length will change. A -box dimension will not change if that component is not specified, -although you have the option to change that dimension via the :doc:`fix deform ` command. +The target pressures for each of the 6 diagonal components of the stress tensor +can be specified independently via the *x*, *y*, *z*, keywords, which +correspond to the 3 simulation box dimensions, and the *xy*, *xz and *yz* +keywords which corresponds to the 3 simulqtion box tilt factors. For each +component, the external pressure or tensor component at each timestep is a +ramped value during the run from *Pstart* to *Pstop*\ . If a target pressure is +specified for a component, then the corresponding box dimension will change +during a simulation. For example, if the *y* keyword is used, the y-box length +will change. A box dimension will not change if that component is not +specified, although you have the option to change that dimension via the +:doc:`fix deform ` command. For all barostat keywords, the *Pdamp* parameter determines the "mass" of the pseudo particle acting as a barostat. The relation is such that :math:`P_{damp} @@ -137,7 +134,7 @@ dimension is simply ignored. ---------- -The *iso* and *aniso* keywords are simply shortcuts that are +The *iso*, *aniso* and *tri* keywords are simply shortcuts that are equivalent to specifying several other keywords together. The keyword *iso* means couple all 3 diagonal components together when @@ -165,6 +162,24 @@ these 4 keywords: z Pstart Pstop Pdamp couple none +The keyword *tri* is the same as *aniso* but also adds the control on the +shear pressure coupled with the tilt factors. + +.. parsed-literal:: + + x Pstart Pstop Pdamp + y Pstart Pstop Pdamp + z Pstart Pstop Pdamp + xy Pstart Pstop Pdamp + xz Pstart Pstop Pdamp + yz Pstart Pstop Pdamp + couple none + +---------- + +The *friction* keyword sets the friction parameter :math:`\alpha` in the +equations of movement of the barostat. All the barostat use the same value. + ---------- This fix computes pressure each timestep. To do @@ -173,7 +188,10 @@ as if this command had been issued: .. code-block:: LAMMPS - compute fix-ID_press group-ID pressure fix-ID_NULL virial + compute fix-ID_press group-ID pressure NULL virial + +The kinetic contribution to the pressure is taken as the ensemble value +:math:`\frac{Nk_bT}{V}` and computed by the fix itself. See the :doc:`compute pressure ` command for details. Note that the IDs of the new compute is the fix-ID + underscore + "press" and the @@ -200,9 +218,12 @@ in its pressure calculations. No global or per-atom quantities are stored by this fix for access by various :doc:`output commands `. -This fix can ramp its target pressure over multiple runs, using the -*start* and *stop* keywords of the :doc:`run ` command. See the -:doc:`run ` command for details of how to do this. +This fix can ramp its target pressure and temperature over multiple runs, using +the *start* and *stop* keywords of the :doc:`run ` command. See the +:doc:`run ` command for details of how to do this. It is recommended that +the ramped temperature is the same as the effective temperature of the +thermalised system. That is, if the system's temperature is ramped by other +commands, it is recommended to do the same with this pressure control. This fix is not invoked during :doc:`energy minimization `. From 68ec36b0068015f037ef9fcd0fcf1649bae1e31c Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Sat, 20 May 2023 09:16:30 +0200 Subject: [PATCH 014/417] Added the flip keyword to the documentation of fix_press_langevin. --- doc/src/fix_press_langevin.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 9401e035a3..01d66d08c6 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -16,13 +16,14 @@ Syntax .. parsed-literal:: one or more keyword value pairs may be appended - keyword = *iso* or *aniso* or *tri* *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* + keyword = *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* or *flip* *iso* or *aniso* or *tri* values = Pstart Pstop Pdamp Pstart,Pstop = scalar external pressure at start/end of run (pressure units) Pdamp = pressure damping parameter *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) Pdamp = stress damping parameter + *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* *friction* value = Alpha friction value to apply to the barostat *temp* values = Tstart, Tstop @@ -177,6 +178,20 @@ shear pressure coupled with the tilt factors. ---------- +The *flip* keyword allows the tilt factors for a triclinic box to +exceed half the distance of the parallel box length, as discussed +below. If the *flip* value is set to *yes*, the bound is enforced by +flipping the box when it is exceeded. If the *flip* value is set to +*no*, the tilt will continue to change without flipping. Note that if +applied stress induces large deformations (e.g. in a liquid), this +means the box shape can tilt dramatically and LAMMPS will run less +efficiently, due to the large volume of communication needed to +acquire ghost atoms around a processor's irregular-shaped subdomain. +For extreme values of tilt, LAMMPS may also lose atoms and generate an +error. + +---------- + The *friction* keyword sets the friction parameter :math:`\alpha` in the equations of movement of the barostat. All the barostat use the same value. From a0a0812ebfb996c7f71ec34c5b3e6b6fd384f3b5 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Wed, 24 May 2023 14:33:34 -0600 Subject: [PATCH 015/417] Added link to fix press/berendsen and fixed minor typos --- doc/src/fix_press_langevin.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 01d66d08c6..f7f0f04e9f 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -104,8 +104,8 @@ represent are varied together during a constant-pressure simulation. The target pressures for each of the 6 diagonal components of the stress tensor can be specified independently via the *x*, *y*, *z*, keywords, which -correspond to the 3 simulation box dimensions, and the *xy*, *xz and *yz* -keywords which corresponds to the 3 simulqtion box tilt factors. For each +correspond to the 3 simulation box dimensions, and the *xy*, *xz* and *yz* +keywords which corresponds to the 3 simulation box tilt factors. For each component, the external pressure or tensor component at each timestep is a ramped value during the run from *Pstart* to *Pstop*\ . If a target pressure is specified for a component, then the corresponding box dimension will change @@ -250,6 +250,7 @@ Any dimension being adjusted by this fix must be periodic. Related commands """""""""""""""" +:doc:`fix press/berendsen `, :doc:`fix nve `, :doc:`fix nph `, :doc:`fix npt `, :doc:`fix langevin `, :doc:`fix_modify ` From a4e7966da5021e2e6f9ef79b17a2c1c88f8e747e Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Tue, 6 Jun 2023 09:11:27 +0200 Subject: [PATCH 016/417] Fixed some error messages for consistency. Seed did not need comm->me addition. --- src/fix_press_langevin.cpp | 84 +++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 0848cc9ab6..cfec66f8d3 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -65,16 +65,19 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pre_exchange_flag = 0; flipflag = 1; - // Alpha friction coefficient - p_fric = 1e-4; + // Piston mass + p_mass = 1e-3; + // Target temperature t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - // Pressure and pistons mass Q + // Pressure and pistons period tau_p p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; + p_fric[i] = 0.; + // Pistons coordinates derivative V p_deriv[i] = 0.0; @@ -210,16 +213,13 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; - } else if (strcmp(arg[iarg],"friction") == 0) { - if (iarg+3 > narg) + } else if (strcmp(arg[iarg],"mass") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); - p_fric = utils::numeric(FLERR,arg[iarg+1],false,lmp); - seed = utils::numeric(FLERR,arg[iarg+2],false,lmp); - if (p_fric <= 0.0) + p_mass = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (p_mass <= 0.0) error->all(FLERR,"Illegal fix press/langevin command"); - if (seed <= 0.0) - error->all(FLERR,"Illegal fix press/langevin command"); - iarg += 3; + iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); @@ -228,11 +228,14 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; } else if (strcmp(arg[iarg], "temp") == 0) { - if (iarg+3 > narg) + if (iarg+4 > narg) error->all(FLERR,"Illegal fix press/langevin command"); t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); - iarg += 3; + seed = utils::numeric(FLERR,arg[iarg+3],false,lmp); + if (seed <= 0.0) + error->all(FLERR,"Illegal fix press/langevin command"); + iarg += 4; } else error->all(FLERR,"Illegal fix press/langevin command"); @@ -240,7 +243,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (allremap == 0) restart_pbc = 1; - random = new RanMars(lmp, seed + comm->me); + random = new RanMars(lmp, seed); // error checks @@ -356,9 +359,13 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); pflag = 1; + // p_fric is alpha coeff from GJF + // with alpha = Q/p_period + // similar to fix_langevin formalism for (int i = 0; i < 6; i++) { - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); + p_fric[i] = p_mass/p_period[i]; + gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + gjfb[i] = 1./(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); } nrigid = 0; @@ -469,8 +476,8 @@ void FixPressLangevin::initial_integrate(int /* vflag */) if (p_flag[i]) { // See equation 13 displacement = dt*p_deriv[i]*gjfb[i]; - displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_period[i]; - displacement += 0.5*dt*fran[i]*gjfb[i]/p_period[i]; + displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass; + displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass; dl = domain->boxhi[i] - domain->boxlo[i]; if (i < 3) dilation[i] = (dl + displacement)/dl; else dilation[i] = displacement; @@ -528,8 +535,8 @@ void FixPressLangevin::end_of_step() for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; - p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_period[i]; - p_deriv[i] += fran[i]*gjfb[i]/p_period[i]; + p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass; + p_deriv[i] += fran[i]*gjfb[i]/p_mass; } } @@ -588,35 +595,36 @@ void FixPressLangevin::couple_kinetic(double t_target) void FixPressLangevin::couple_beta(double t_target) { - double gamma; + double gamma[6]; int me = comm->me; - gamma = sqrt(2.0*force->boltz*update->dt*p_fric*t_target); + for (int i=0; i<6; i++) + gamma[i] = sqrt(2.0*force->boltz*update->dt*p_fric[i]*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; if (me == 0) { if (pstyle == ISO) - fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); else if (pcouple == XYZ) { - fran[0] = fran[1] = fran[2] = gamma*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); } else if (pcouple == XY) { - fran[0] = fran[1] = gamma*random->gaussian(); - fran[2] = gamma*random->gaussian(); + fran[0] = fran[1] = gamma[0]*random->gaussian(); + fran[2] = gamma[2]*random->gaussian(); } else if (pcouple == YZ) { - fran[1] = fran[2] = gamma*random->gaussian(); - fran[0] = gamma*random->gaussian(); + fran[1] = fran[2] = gamma[1]*random->gaussian(); + fran[0] = gamma[0]*random->gaussian(); } else if (pcouple == XZ) { - fran[0] = fran[2] = gamma*random->gaussian(); - fran[1] = gamma*random->gaussian(); + fran[0] = fran[2] = gamma[0]*random->gaussian(); + fran[1] = gamma[1]*random->gaussian(); } else { - fran[0] = gamma*random->gaussian(); - fran[1] = gamma*random->gaussian(); - fran[2] = gamma*random->gaussian(); + fran[0] = gamma[0]*random->gaussian(); + fran[1] = gamma[1]*random->gaussian(); + fran[2] = gamma[2]*random->gaussian(); } - fran[3] = gamma*random->gaussian(); - fran[4] = gamma*random->gaussian(); - fran[5] = gamma*random->gaussian(); + fran[3] = gamma[3]*random->gaussian(); + fran[4] = gamma[4]*random->gaussian(); + fran[5] = gamma[5]*random->gaussian(); } MPI_Bcast(&fran, 6, MPI_DOUBLE, 0, world); } @@ -797,7 +805,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); + gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + gjfb[i] = sqrt(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); } } From 9a585f820488f5724ebe28ce4e53331293026076 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Tue, 6 Jun 2023 09:14:23 +0200 Subject: [PATCH 017/417] Change variables names in header for consistency with GJF paper. --- src/fix_press_langevin.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index b5a62d2646..d6ea9df714 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -44,9 +44,9 @@ class FixPressLangevin : public Fix { int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not double t_start, t_stop, t_target; - double p_fric; - double p_start[6], p_stop[6], p_current[6]; - double p_period[6], p_target[6]; + double p_mass; + double p_start[6], p_stop[6], p_period[6]; + double p_fric[6], p_target[6], p_current[6]; double p_deriv[6], dilation[6]; double f_piston[6], f_old_piston[6]; double gjfa[6], gjfb[6], fran[6]; From 0c2cd80028a309e34dfbd26debd8e2386a6e6330 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Tue, 6 Jun 2023 09:37:34 +0200 Subject: [PATCH 018/417] Edited the documentation of fix_press_langevin to take changes into account. --- doc/src/fix_press_langevin.rst | 67 ++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 01d66d08c6..550decdf8b 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -22,12 +22,13 @@ Syntax Pdamp = pressure damping parameter *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) - Pdamp = stress damping parameter + Pdamp = pressure damping parameter *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *friction* value = Alpha friction value to apply to the barostat - *temp* values = Tstart, Tstop + *mass* value = Mass of the barostat fictious particle + *temp* values = Tstart, Tstop, seed Tstart, Tstop = target temperature used for the barostat at start/end of run + seed = seed of the random number generator *dilate* value = *all* or *partial* Examples @@ -35,8 +36,8 @@ Examples .. code-block:: LAMMPS - fix 1 all press/langevin iso 0.0 0.0 1000.0 temp 300 300 - fix 2 all press/langevin aniso 0.0 0.0 1000.0 temp 100 300 dilate partial + fix 1 all press/langevin iso 0.0 0.0 1000.0 temp 300 300 487374 + fix 2 all press/langevin aniso 0.0 0.0 1000.0 temp 100 300 238 dilate partial Description """"""""""" @@ -114,9 +115,28 @@ will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -For all barostat keywords, the *Pdamp* parameter determines the "mass" of the -pseudo particle acting as a barostat. The relation is such that :math:`P_{damp} -= \frac{1}{Q}` where Q is the mass. +For all barostat keywords, the *Pdamp* parameter determines the "friction +parameter" :math:`\alpha` of the pseudo particle acting as a barostat. The +relation is such that :math:`\alpha = \frac{Q}{P_{damp}}` where Q is the mass. + +.. note:: + + As for Berendsen barostat, a Langevin barostat will not work well for + arbitrary values of *Pdamp*\ . If *Pdamp* is too small, the pressure and + volume can fluctuate wildly; if it is too large, the pressure will take a + very long time to equilibrate. A good choice for many models is a *Pdamp* + of around 1000 timesteps. However, note that *Pdamp* is specified in time + units, and that timesteps are NOT the same as time units for most + :doc:`units ` settings. + +---------- + +The *temp* keyword sets the temperature to use in the equation of motion of the +barostat. This value is used to compute the value of the force :math:`f_P` in +the equation of motion. It is important to note that this value is not the +instantaneous temperature but a target temperature that ramps from *Tstart* to +*Tstop*. Also the required argument *seed* also sets the seed for the random +number generator used in the generation of the random forces. ---------- @@ -192,12 +212,20 @@ error. ---------- -The *friction* keyword sets the friction parameter :math:`\alpha` in the +The *mass* keyword sets the mass parameter :math:`Q` in the equations of movement of the barostat. All the barostat use the same value. +.. note:: + + The same recommandation with regard to the bulk modulus of a berendsen + barostat applies to a Langevin barostat mass. It is however important to + note that not only the absolute value used for the mass is important, but + also its ratio with Pdamp values which defines the friction coeffiction + value. + ---------- -This fix computes pressure each timestep. To do +This fix computes pressure each timestep. To do this, the fix creates its own computes of style "pressure", as if this command had been issued: @@ -212,13 +240,14 @@ See the :doc:`compute pressure ` command for details. Note that the IDs of the new compute is the fix-ID + underscore + "press" and the group for the new computes is the same as the fix group. -Note that this is NOT the compute used by thermodynamic output (see -the :doc:`thermo_style ` command) with ID = *thermo_press*. -This means you can change the attributes of this fix's pressure via the -:doc:`compute_modify ` command or print this temperature -or pressure during thermodynamic output via the :doc:`thermo_style custom ` command using the appropriate compute-ID. -It also means that changing attributes of *thermo_temp* or -*thermo_press* will have no effect on this fix. +Note that this is NOT the compute used by thermodynamic output (see the +:doc:`thermo_style ` command) with ID = *thermo_press*. This +means you can change the attributes of this fix's pressure via the +:doc:`compute_modify ` command or print this temperature or +pressure during thermodynamic output via the :doc:`thermo_style custom +` command using the appropriate compute-ID. It also means that +changing attributes of *thermo_temp* or *thermo_press* will have no effect on +this fix. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -256,8 +285,8 @@ Related commands Default """"""" -The keyword defaults are dilate = all, friction = 0.0001 in units of -pressure for whatever :doc:`units ` are defined. +The keyword defaults are dilate = all and mass = 0.001 in units of mass for +whatever :doc:`units ` defined. ---------- From bb1ff49af62dbebd74802a77fe170411032ff978 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Wed, 7 Jun 2023 14:03:40 +0200 Subject: [PATCH 019/417] Corrected bug from f_piston not initialised. Removed superfluous temp compute id variable name --- src/fix_press_langevin.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index cfec66f8d3..ec8f034181 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -87,6 +87,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Random value for each piston fran[i] = 0.0; + f_piston[i] = 0.0; } // process keywords @@ -356,7 +357,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure NULL virial",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); pflag = 1; // p_fric is alpha coeff from GJF From af76ffdfdacf2faaf4b6740c1e57993e28ad54e7 Mon Sep 17 00:00:00 2001 From: Vladislav Galigerov Date: Sun, 18 Jun 2023 17:08:49 +0300 Subject: [PATCH 020/417] ROCM aware OpenMPI support --- src/KOKKOS/kokkos.cpp | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 91ea6d37ac..7f3f9f0d10 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -43,8 +43,7 @@ #define GPU_AWARE_UNKNOWN static int have_gpu_aware = -1; -// TODO HIP: implement HIP-aware MPI support (UCX) detection -#if defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET) +#if defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET) GPU_AWARE_UNKNOWN #elif defined(KOKKOS_ENABLE_CUDA) @@ -71,7 +70,28 @@ GPU_AWARE_UNKNOWN GPU_AWARE_UNKNOWN #endif // OPEN_MPI -#endif // KOKKOS_ENABLE_CUDA +#elif defined(KOKKOS_ENABLE_HIP) + +// OpenMPI supports detecting HIP-aware MPI as of version 5.0.0 +#if (OPEN_MPI) +#if (OMPI_MAJOR_VERSION >= 5) +#include +#if defined(OMPI_HAVE_MPI_EXT_ROCM) && OMPI_HAVE_MPI_EXT_ROCM +// May have rocm enabled: below we will check dynamically with MPIX_Query_rocm_support() +static int have_gpu_aware = 1; +#elif defined(OMPI_HAVE_MPI_EXT_ROCM) && !OMPI_HAVE_MPI_EXT_ROCM +static int have_gpu_aware = 0; +#else +GPU_AWARE_UNKNOWN +#endif // defined(OMPI_HAVE_MPI_EXT_ROCM) +#else // old OpenMPI +GPU_AWARE_UNKNOWN +#endif // (OMPI_MAJOR_VERSION >=5) +#else // unknown MPI library +GPU_AWARE_UNKNOWN +#endif // OPEN_MPI + +#endif // KOKKOS_ENABLE_CUDA & KOKKOS_ENABLE_HIP #endif // LMP_ENABLE_DEVICE @@ -236,8 +256,20 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) binsize = 0.0; #ifdef KOKKOS_ENABLE_CUDA - // TODO HIP: implement HIP-aware MPI testing gpu_aware_flag = 1; +#elif defined(KOKKOS_ENABLE_HIP) && defined(OMPI_HAVE_MPI_EXT_ROCM) && OMPI_HAVE_MPI_EXT_ROCM + if(have_gpu_aware == 1) + { + gpu_aware_flag = MPIX_Query_rocm_support(); + if(gpu_aware_flag && me == 0) + { + error->warning(FLERR,"ROCm-aware OpenMPI is supported and enabled (debug msg, remove it later)"); + } + } + else + { + gpu_aware_flag = 0; + } #else gpu_aware_flag = 0; #endif From 108c5fc41675e1a5fb92d8c38df350807a9a4f60 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 5 Jul 2023 14:59:35 -0400 Subject: [PATCH 021/417] improve error messages --- src/RIGID/fix_rigid_nh_small.cpp | 90 +++++++------------- src/RIGID/fix_rigid_small.cpp | 140 +++++++++++++++---------------- 2 files changed, 100 insertions(+), 130 deletions(-) diff --git a/src/RIGID/fix_rigid_nh_small.cpp b/src/RIGID/fix_rigid_nh_small.cpp index 95f4c8d693..7780a15011 100644 --- a/src/RIGID/fix_rigid_nh_small.cpp +++ b/src/RIGID/fix_rigid_nh_small.cpp @@ -57,71 +57,52 @@ FixRigidNHSmall::FixRigidNHSmall(LAMMPS *lmp, int narg, char **arg) : // error checks - if ((p_flag[0] == 1 && p_period[0] <= 0.0) || - (p_flag[1] == 1 && p_period[1] <= 0.0) || - (p_flag[2] == 1 && p_period[2] <= 0.0)) - error->all(FLERR,"Fix rigid/small npt/nph period must be > 0.0"); - - if (dimension == 2 && p_flag[2]) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "for a 2d simulation"); + error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "for a 2d simulation"); + error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix rigid/small npt/nph command " - "pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); // require periodicity in tensile dimension if (p_flag[0] && domain->xperiodic == 0) - error->all(FLERR, - "Cannot use fix rigid/small npt/nph on a " - "non-periodic dimension"); + error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); if (p_flag[1] && domain->yperiodic == 0) - error->all(FLERR, - "Cannot use fix rigid/small npt/nph on a " - "non-periodic dimension"); + error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); if (p_flag[2] && domain->zperiodic == 0) - error->all(FLERR, - "Cannot use fix rigid/small npt/nph on a " - "non-periodic dimension"); + error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); if (pcouple == XYZ && dimension == 3 && (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix rigid/small npt/nph command pressure settings"); + error->all(FLERR, "Invalid fix {} command pressure settings", style); if (pcouple == XYZ && dimension == 2 && (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix rigid/small npt/nph command pressure settings"); + error->all(FLERR, "Invalid fix {} command pressure settings", style); if (pcouple == XY && (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix rigid/small npt/nph command pressure settings"); + error->all(FLERR, "Invalid fix {} command pressure settings", style); if (pcouple == YZ && (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || p_period[1] != p_period[2])) - error->all(FLERR,"Invalid fix rigid/small npt/nph command pressure settings"); + error->all(FLERR, "Invalid fix {} command pressure settings", style); if (pcouple == XZ && (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix rigid/small npt/nph command pressure settings"); + error->all(FLERR, "Invalid fix {} command pressure settings", style); if (p_flag[0]) box_change |= BOX_CHANGE_X; if (p_flag[1]) box_change |= BOX_CHANGE_Y; @@ -131,8 +112,7 @@ FixRigidNHSmall::FixRigidNHSmall(LAMMPS *lmp, int narg, char **arg) : (p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || (p_flag[2] && p_period[2] <= 0.0)) - error->all(FLERR,"Fix rigid/small nvt/npt/nph damping parameters " - "must be > 0.0"); + error->all(FLERR,"Fix {} damping parameters must be > 0.0", style); // memory allocation and initialization @@ -215,8 +195,7 @@ void FixRigidNHSmall::init() if (allremap == 0) { int idilate = group->find(id_dilate); - if (idilate == -1) - error->all(FLERR,"Fix rigid npt/nph dilate group ID does not exist"); + if (idilate == -1) error->all(FLERR,"Fix {} dilate group ID does not exist", style); dilate_group_bit = group->bitmask[idilate]; } @@ -255,7 +234,7 @@ void FixRigidNHSmall::init() if (tcomputeflag) { icompute = modify->find_compute(id_temp); if (icompute < 0) - error->all(FLERR,"Temperature ID for fix rigid nvt/npt/nph does not exist"); + error->all(FLERR,"Temperature ID {} for fix {} does not exist", id_temp, style); temperature = modify->compute[icompute]; } @@ -270,8 +249,8 @@ void FixRigidNHSmall::init() int *dimflag = (dynamic_cast(modify->fix[i]))->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix rigid npt/nph and fix deform on " - "same component of stress tensor"); + error->all(FLERR, "Cannot use fix {} and fix deform on the same stress tensor component", + style); } // set frequency @@ -293,7 +272,7 @@ void FixRigidNHSmall::init() icompute = modify->find_compute(id_press); if (icompute < 0) - error->all(FLERR,"Pressure ID for fix rigid npt/nph does not exist"); + error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); pressure = modify->compute[icompute]; // detect if any rigid fixes exist so rigid bodies move on remap @@ -1315,27 +1294,23 @@ int FixRigidNHSmall::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tcomputeflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR, - "Fix_modify temperature ID does not compute temperature"); + error->all(FLERR, "Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != 0 && comm->me == 0) error->warning(FLERR,"Temperature for fix modify is not for group all"); // reset id_temp of pressure to new temperature ID if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix modify does not exist"); - modify->compute[icompute]->reset_extra_compute_fix(id_temp); + auto icompute = modify->get_compute_by_id(id_press); + if (!icompute) error->all(FLERR,"Pressure ID {} for fix modify does not exist", id_press); + icompute->reset_extra_compute_fix(id_temp); } return 2; @@ -1347,15 +1322,14 @@ int FixRigidNHSmall::modify_param(int narg, char **arg) modify->delete_compute(id_press); pcomputeflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Could not find fix_modify pressure ID {}", id_press); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR,"Fix_modify pressure ID {} does not compute pressure", id_press); return 2; } diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index bf2eb69355..d8e6358ddb 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -100,10 +100,10 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : tagint *bodyID = nullptr; int nlocal = atom->nlocal; - if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command"); + if (narg < 4) utils::missing_cmd_args(FLERR, fmt::format("fix {}", style), error); if (strcmp(arg[3],"molecule") == 0) { if (atom->molecule_flag == 0) - error->all(FLERR,"Fix rigid/small requires atom attribute molecule"); + error->all(FLERR,"Fix {} requires atom attribute molecule", style); bodyID = atom->molecule; } else if (strcmp(arg[3],"custom") == 0) { @@ -117,9 +117,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : int is_double,cols; int custom_index = atom->find_custom(arg[4]+2,is_double,cols); if (custom_index == -1) - error->all(FLERR,"Fix rigid/small custom requires previously defined property/atom"); + error->all(FLERR,"Fix {} custom requires previously defined property/atom", style); else if (is_double || cols) - error->all(FLERR,"Fix rigid/small custom requires integer-valued property/atom vector"); + error->all(FLERR,"Fix {} custom requires integer-valued property/atom vector", style); int minval = INT_MAX; int *value = atom->ivector[custom_index]; for (i = 0; i < nlocal; i++) @@ -135,10 +135,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : } else if (utils::strmatch(arg[4],"^v_")) { int ivariable = input->variable->find(arg[4]+2); if (ivariable < 0) - error->all(FLERR,"Variable {} for fix rigid/small custom does not exist", arg[4]+2); + error->all(FLERR,"Variable {} for fix {} custom does not exist", arg[4]+2, style); if (input->variable->atomstyle(ivariable) == 0) - error->all(FLERR,"Fix rigid/small custom variable {} is not atom-style variable", - arg[4]+2); + error->all(FLERR,"Fix {} custom variable {} is not atom-style variable", style, arg[4]+2); auto value = new double[nlocal]; input->variable->compute_atom(ivariable,0,value,1,0); int minval = INT_MAX; @@ -152,11 +151,11 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : 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"); + } else error->all(FLERR,"Unsupported fix {} custom property", style, arg[4]); + } else error->all(FLERR,"Unknown fix {} keyword {}", style, arg[3]); if (atom->map_style == Atom::MAP_NONE) - error->all(FLERR,"Fix rigid/small requires an atom map, see atom_modify"); + error->all(FLERR,"Fix {} requires an atom map, see atom_modify", style); // maxmol = largest bodyID # @@ -201,23 +200,21 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg],"langevin") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid/small command"); - if ((strcmp(style,"rigid/small") != 0) && - (strcmp(style,"rigid/nve/small") != 0) && - (strcmp(style,"rigid/nph/small") != 0)) - error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+5 > narg) error->all(FLERR,"Illegal fix {} command", style); + if (utils::strmatch(style, "^rigid/n.t/small")) + error->all(FLERR,"Illegal fix {} command", style); langflag = 1; t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); t_period = utils::numeric(FLERR,arg[iarg+3],false,lmp); seed = utils::inumeric(FLERR,arg[iarg+4],false,lmp); if (t_period <= 0.0) - error->all(FLERR,"Fix rigid/small langevin period must be > 0.0"); - if (seed <= 0) error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Fix {} langevin period must be > 0.0", style); + if (seed <= 0) error->all(FLERR,"Illegal fix {} command", style); iarg += 5; } else if (strcmp(arg[iarg],"infile") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal fix {} infile command", style); delete[] inpfile; inpfile = utils::strdup(arg[iarg+1]); restart_file = 1; @@ -225,23 +222,24 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"reinit") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal fix {} reinit command", style); reinitflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"mol") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal fix {} mol command", style); int imol = atom->find_molecule(arg[iarg+1]); - if (imol == -1) error->all(FLERR,"Molecule template ID for fix rigid/small does not exist"); + if (imol == -1) + error->all(FLERR,"Molecule template ID {} for fix {} does not exist", arg[iarg+1], style); onemols = &atom->molecules[imol]; nmol = onemols[0]->nset; restart_file = 1; iarg += 2; } else if (strcmp(arg[iarg],"temp") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR, "Illegal fix {} temp command", style); if (!utils::strmatch(style,"^rigid/n.t/small")) - error->all(FLERR,"Illegal fix rigid command"); + error->all(FLERR, "Illegal fix {} temp", style); tstat_flag = 1; t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -249,9 +247,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR, "Illegal fix {} iso command", style); if (!utils::strmatch(style,"^rigid/np./small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} iso command", style); pcouple = XYZ; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -266,9 +264,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR,"Illegal fix {} ansio command", style); if (!utils::strmatch(style,"^rigid/np./small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} aniso command", style); p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[0] = p_period[1] = p_period[2] = @@ -281,9 +279,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"x") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR,"Illegal fix {} x command", style); if (!utils::strmatch(style,"^rigid/np./small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} x command", style); p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); @@ -291,9 +289,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR,"Illegal fix {} y command", style); if (!utils::strmatch(style,"^rigid/np./small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} y command", style); p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); @@ -301,9 +299,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR,"Illegal fix {} z command", style); if (!utils::strmatch(style,"^rigid/np./small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} z command", style); p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); @@ -311,18 +309,18 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal fix {} couple command", style); if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Illegal fix rigid/small command"); + else error->all(FLERR,"Illegal fix {} couple command", style); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { if (iarg+2 > narg) - error->all(FLERR,"Illegal fix rigid/small nvt/npt/nph command"); + error->all(FLERR,"Illegal fix {} dilate command", style); if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; else { allremap = 0; @@ -330,34 +328,33 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : id_dilate = utils::strdup(arg[iarg+1]); int idilate = group->find(id_dilate); if (idilate == -1) - error->all(FLERR,"Fix rigid/small nvt/npt/nph dilate group ID " - "does not exist"); + error->all(FLERR,"Fix {} dilate group ID {} does not exist", style, id_dilate); } iarg += 2; } else if (strcmp(arg[iarg],"tparam") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+4 > narg) error->all(FLERR,"Illegal fix {} tparam command", style); if (!utils::strmatch(style,"^rigid/n.t/small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} tparam command", style); t_chain = utils::inumeric(FLERR,arg[iarg+1],false,lmp); t_iter = utils::inumeric(FLERR,arg[iarg+2],false,lmp); t_order = utils::inumeric(FLERR,arg[iarg+3],false,lmp); iarg += 4; } else if (strcmp(arg[iarg],"pchain") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal fix {} pchain command", style); if (!utils::strmatch(style,"^rigid/np./small")) - error->all(FLERR,"Illegal fix rigid/small command"); + error->all(FLERR,"Illegal fix {} pchain command", style); p_chain = utils::inumeric(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"gravity") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal fix {} gravity command", style); delete[] id_gravity; id_gravity = utils::strdup(arg[iarg+1]); iarg += 2; - } else error->all(FLERR,"Illegal fix rigid/small command"); + } else error->all(FLERR,"Unknown fix {} keyword {}", style, arg[iarg]); } // error check and further setup for Molecule template @@ -365,9 +362,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (onemols) { for (i = 0; i < nmol; i++) { if (onemols[i]->xflag == 0) - error->all(FLERR,"Fix rigid/small molecule must have coordinates"); + error->all(FLERR,"Fix {} molecule must have coordinates", style); if (onemols[i]->typeflag == 0) - error->all(FLERR,"Fix rigid/small molecule must have atom types"); + error->all(FLERR,"Fix {} molecule must have atom types", style); // fix rigid/small uses center, masstotal, COM, inertia of molecule @@ -532,15 +529,15 @@ void FixRigidSmall::init() int count = 0; for (auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) count++; - if (count > 1 && me == 0) error->warning(FLERR,"More than one fix rigid"); + if (count > 1 && me == 0) error->warning(FLERR, "More than one fix rigid command"); if (earlyflag) { bool rflag = false; for (auto &ifix : modify->get_fix_list()) { if (ifix->rigid_flag) rflag = true; if ((comm->me == 0) && rflag && (ifix->setmask() & POST_FORCE) && !ifix->rigid_flag) - error->warning(FLERR,"Fix {} with ID {} alters forces after fix rigid/small", - ifix->style, ifix->id); + error->warning(FLERR,"Fix {} with ID {} alters forces after fix {}", + ifix->style, ifix->id, style); } } @@ -569,9 +566,9 @@ void FixRigidSmall::init() if (id_gravity) { auto ifix = modify->get_fix_by_id(id_gravity); - if (!ifix) error->all(FLERR,"Fix rigid/small cannot find fix gravity ID {}", id_gravity); + if (!ifix) error->all(FLERR,"Fix {} cannot find fix gravity ID {}", style, id_gravity); if (!utils::strmatch(ifix->style,"^gravity")) - error->all(FLERR,"Fix rigid/small gravity fix ID {} is not a gravity fix style", id_gravity); + error->all(FLERR,"Fix {} gravity fix ID {} is not a gravity fix style", style, id_gravity); int tmp; gvec = (double *) ifix->extract("gvec", tmp); } @@ -630,7 +627,7 @@ void FixRigidSmall::setup(int vflag) double cutghost = MAX(neighbor->cutneighmax,comm->cutghostuser); if (maxextent > cutghost) - error->all(FLERR,"Rigid body extent > ghost cutoff - use comm_modify cutoff"); + error->all(FLERR,"Rigid body extent {} > ghost atom cutoff - use comm_modify cutoff", maxextent); //check(1); @@ -2123,8 +2120,7 @@ void FixRigidSmall::setup_bodies_static() inertia = body[ibody].inertia; ierror = MathEigen::jacobi3(tensor,inertia,evectors); - if (ierror) error->all(FLERR, - "Insufficient Jacobi rotations for rigid body"); + if (ierror) error->all(FLERR, "Insufficient Jacobi rotations for rigid body"); ex = body[ibody].ex_space; ex[0] = evectors[0][0]; @@ -2320,30 +2316,30 @@ void FixRigidSmall::setup_bodies_static() if (inertia[0] == 0.0) { if (fabs(itensor[ibody][0]) > TOLERANCE) - error->all(FLERR,"Fix rigid: Bad principal moments"); + error->all(FLERR,"Fix {}: Bad principal moments", style); } else { if (fabs((itensor[ibody][0]-inertia[0])/inertia[0]) > - TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments"); + TOLERANCE) error->all(FLERR,"Fix {}: Bad principal moments", style); } if (inertia[1] == 0.0) { if (fabs(itensor[ibody][1]) > TOLERANCE) - error->all(FLERR,"Fix rigid: Bad principal moments"); + error->all(FLERR,"Fix {}: Bad principal moments", style); } else { if (fabs((itensor[ibody][1]-inertia[1])/inertia[1]) > - TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments"); + TOLERANCE) error->all(FLERR,"Fix {}: Bad principal moments", style); } if (inertia[2] == 0.0) { if (fabs(itensor[ibody][2]) > TOLERANCE) - error->all(FLERR,"Fix rigid: Bad principal moments"); + error->all(FLERR,"Fix {}: Bad principal moments", style); } else { if (fabs((itensor[ibody][2]-inertia[2])/inertia[2]) > - TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments"); + TOLERANCE) error->all(FLERR,"Fix {}: Bad principal moments", style); } norm = (inertia[0] + inertia[1] + inertia[2]) / 3.0; if (fabs(itensor[ibody][3]/norm) > TOLERANCE || fabs(itensor[ibody][4]/norm) > TOLERANCE || fabs(itensor[ibody][5]/norm) > TOLERANCE) - error->all(FLERR,"Fix rigid: Bad principal moments"); + error->all(FLERR,"Fix {}: Bad principal moments", style); } // clean up @@ -2492,10 +2488,10 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) if (me == 0) { fp = fopen(inpfile,"r"); if (fp == nullptr) - error->one(FLERR,"Cannot open fix rigid/small file {}: {}", inpfile, utils::getsyserror()); + error->one(FLERR,"Cannot open fix {} file {}: {}", style, inpfile, utils::getsyserror()); while (true) { eof = fgets(line,MAXLINE,fp); - if (eof == nullptr) error->one(FLERR,"Unexpected end of fix rigid/small file"); + if (eof == nullptr) error->one(FLERR,"Unexpected end of fix {} file", style); start = &line[strspn(line," \t\n\v\f\r")]; if (*start != '\0' && *start != '#') break; } @@ -2510,14 +2506,14 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) // generation when no infile was previously used. if (nlines == 0) return; - else if (nlines < 0) error->all(FLERR,"Fix rigid infile has incorrect format"); + else if (nlines < 0) error->all(FLERR,"Fix {} infile has incorrect format", style); auto buffer = new char[CHUNK*MAXLINE]; int nread = 0; while (nread < nlines) { nchunk = MIN(nlines-nread,CHUNK); eofflag = utils::read_lines_from_file(fp,nchunk,MAXLINE,buffer,me,world); - if (eofflag) error->all(FLERR,"Unexpected end of fix rigid/small file"); + if (eofflag) error->all(FLERR,"Unexpected end of fix {} file", style); buf = buffer; next = strchr(buf,'\n'); @@ -2526,7 +2522,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) *next = '\n'; if (nwords != ATTRIBUTE_PERBODY) - error->all(FLERR,"Incorrect rigid body format in fix rigid/small file"); + error->all(FLERR,"Incorrect rigid body format in fix {} file", style); // loop over lines of rigid body attributes // tokenize the line into values @@ -2543,7 +2539,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) tagint id = values.next_tagint(); if (id <= 0 || id > maxmol) - error->all(FLERR,"Invalid rigid body molecude ID {} in fix rigid/small file", id); + error->all(FLERR,"Invalid rigid body molecude ID {} in fix {} file", id, style); if (hash.find(id) == hash.end()) { buf = next + 1; @@ -2580,7 +2576,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) array[m][3] = values.next_double(); } } catch (TokenizerException &e) { - error->all(FLERR, "Invalid fix rigid/small infile: {}", e.what()); + error->all(FLERR, "Invalid fix {} infile: {}", style, e.what()); } buf = next + 1; } @@ -2611,7 +2607,8 @@ void FixRigidSmall::write_restart_file(const char *file) auto outfile = std::string(file) + ".rigid"; fp = fopen(outfile.c_str(),"w"); if (fp == nullptr) - error->one(FLERR,"Cannot open fix rigid restart file {}: {}",outfile,utils::getsyserror()); + error->one(FLERR, "Cannot open fix {} restart file {}: {}", + style, outfile, utils::getsyserror()); fmt::print(fp,"# fix rigid mass, COM, inertia tensor info for " "{} bodies on timestep {}\n\n",nbody,update->ntimestep); @@ -3382,9 +3379,8 @@ void FixRigidSmall::reset_atom2body() if (bodytag[i]) { iowner = atom->map(bodytag[i]); if (iowner == -1) - error->one(FLERR,"Rigid body atoms {} {} missing on " - "proc {} at step {}",atom->tag[i], - bodytag[i],comm->me,update->ntimestep); + error->one(FLERR, "Rigid body atoms {} {} missing on proc {} at step {}", + atom->tag[i], bodytag[i], comm->me, update->ntimestep); atom2body[i] = bodyown[iowner]; } From bacfcd205093c626a30f43e157704118d001f945 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Jul 2023 07:36:05 -0700 Subject: [PATCH 022/417] change triclinic logic to not depend on exact I,J atom coords --- src/npair_half_bin_newton_tri.cpp | 39 ++++++++++++++++++++++++++++--- src/npair_half_nsq_newton.cpp | 14 ++++++++++- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 88ef993a41..227a25c321 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -16,6 +16,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "force.h" #include "molecule.h" #include "domain.h" #include "my_page.h" @@ -36,10 +37,12 @@ NPairHalfBinNewtonTri::NPairHalfBinNewtonTri(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfBinNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,ibin,which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - + + double angstrom = force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -68,6 +71,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -87,6 +91,34 @@ void NPairHalfBinNewtonTri::build(NeighList *list) ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + + if (fabs(x[j][2]-ztmp) > angstrom) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > angstrom) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + + /* + if (x[j][2] < ztmp) continue; + if (x[j][2] == ztmp) { + if (x[j][1] < ytmp) continue; + if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + */ + } + } + + /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -95,7 +127,8 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } - + */ + jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index e5f3138f0a..20ffbf6977 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -16,6 +16,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "force.h" #include "group.h" #include "molecule.h" #include "domain.h" @@ -41,6 +42,9 @@ void NPairHalfNsqNewton::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; + double angstrom = force->angstrom; + int triclinic = domain->triclinic; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -96,7 +100,15 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else { + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > angstrom) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > angstrom) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; From 129264aa148bb2b10ce0d6dbfda866443f58d749 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Jul 2023 08:42:46 -0700 Subject: [PATCH 023/417] debugging --- src/npair_half_bin_newton_tri.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 227a25c321..00b5722673 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -92,6 +92,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + /* if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { @@ -108,17 +109,15 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] < xtmp) continue; } - /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; if (x[j][1] == ytmp && x[j][0] < xtmp) continue; } - */ } } - - /* + */ + if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -127,7 +126,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } - */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; From 42f2a4b5b0e8021b01b1655b2c555cd392539c18 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 7 Jul 2023 08:58:14 -0700 Subject: [PATCH 024/417] exclude self interactions and double counting of own/own --- src/npair_half_bin_newton_tri.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 00b5722673..4cd12b2e7c 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -92,7 +92,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - /* + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { @@ -109,15 +109,15 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] < xtmp) continue; } - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - } + //if (x[j][2] < ztmp) continue; + //if (x[j][2] == ztmp) { + // if (x[j][1] < ytmp) continue; + // if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + // } } } - */ - + + /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -126,6 +126,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } + */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; @@ -136,6 +137,8 @@ void NPairHalfBinNewtonTri::build(NeighList *list) rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { + //printf("NEIGH i,j %d %d ijtag %d %d dist %g\n", + // i,j,tag[i],tag[j],sqrt(rsq)); if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); From abadf9412afb695eabeb996d507e6533ec686d07 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Sat, 8 Jul 2023 10:26:34 -0700 Subject: [PATCH 025/417] check old results --- src/npair_half_bin_newton_tri.cpp | 7 ++++--- src/npair_half_nsq_newton.cpp | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 4cd12b2e7c..61d67fed2a 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -92,6 +92,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + /* if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; @@ -116,8 +117,9 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // } } } - - /* + */ + + if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -126,7 +128,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } - */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index 20ffbf6977..995c9cfbed 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -100,7 +100,8 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { + /* + } else if (triclinic) { if (fabs(x[j][2]-ztmp) > angstrom) { if (x[j][2] < ztmp) continue; } else if (fabs(x[j][1]-ytmp) > angstrom) { @@ -108,6 +109,7 @@ void NPairHalfNsqNewton::build(NeighList *list) } else { if (x[j][0] < xtmp) continue; } + */ } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { From ce1a084a0efba244310fd4d8448b726210030f8d Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Sat, 8 Jul 2023 18:31:55 -0700 Subject: [PATCH 026/417] expand stencil for triclinic neighbor build --- src/npair_half_bin_newton_tri.cpp | 15 ++++++--------- src/npair_half_nsq_newton.cpp | 10 ++++------ src/npair_halffull_newton.cpp | 15 +++++++++++++++ src/nstencil_half_bin_3d_tri.cpp | 3 ++- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 61d67fed2a..17504ac3af 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -41,7 +41,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - double angstrom = force->angstrom; + double delta = 0.01 * force->angstrom; double **x = atom->x; int *type = atom->type; @@ -92,7 +92,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - /* if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; @@ -101,15 +100,13 @@ void NPairHalfBinNewtonTri::build(NeighList *list) } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; } else { - - if (fabs(x[j][2]-ztmp) > angstrom) { + if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > angstrom) { + } else if (fabs(x[j][1]-ytmp) > delta) { if (x[j][1] < ytmp) continue; } else { if (x[j][0] < xtmp) continue; } - //if (x[j][2] < ztmp) continue; //if (x[j][2] == ztmp) { // if (x[j][1] < ytmp) continue; @@ -117,9 +114,8 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // } } } - */ - - + + /* if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; @@ -128,6 +124,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) if (x[j][0] == xtmp && j <= i) continue; } } + */ jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index 995c9cfbed..be06393f58 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -42,7 +42,7 @@ void NPairHalfNsqNewton::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - double angstrom = force->angstrom; + double delta = 0.01 * force->angstrom; int triclinic = domain->triclinic; double **x = atom->x; @@ -100,16 +100,14 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - /* - } else if (triclinic) { - if (fabs(x[j][2]-ztmp) > angstrom) { + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > angstrom) { + } else if (fabs(x[j][1]-ytmp) > delta) { if (x[j][1] < ytmp) continue; } else { if (x[j][0] < xtmp) continue; } - */ } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_halffull_newton.cpp b/src/npair_halffull_newton.cpp index 407a71e614..d1e894943c 100644 --- a/src/npair_halffull_newton.cpp +++ b/src/npair_halffull_newton.cpp @@ -14,7 +14,9 @@ #include "npair_halffull_newton.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" @@ -37,6 +39,9 @@ void NPairHalffullNewton::build(NeighList *list) int *neighptr, *jlist; double xtmp, ytmp, ztmp; + double delta = 0.01 * force->angstrom; + int triclinic = domain->triclinic; + double **x = atom->x; int nlocal = atom->nlocal; @@ -72,8 +77,17 @@ void NPairHalffullNewton::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -81,6 +95,7 @@ void NPairHalffullNewton::build(NeighList *list) if (x[j][1] == ytmp && x[j][0] < xtmp) continue; } } + neighptr[n++] = joriginal; } diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index d066a24ee6..f94bfc5e63 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -29,7 +29,8 @@ void NStencilHalfBin3dTri::create() nstencil = 0; - for (k = 0; k <= sz; k++) + //for (k = 0; k <= sz; k++) + for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance(i, j, k) < cutneighmaxsq) From e3349581c757ad49a187bc86dd429abb4420dd1f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 9 Jul 2023 15:14:36 -0400 Subject: [PATCH 027/417] fix whitespace and remove debug code --- src/npair_half_bin_newton_tri.cpp | 56 +++++++++++-------------------- src/npair_half_nsq_newton.cpp | 24 ++++++------- src/npair_halffull_newton.cpp | 22 ++++++------ src/nstencil_half_bin_3d_tri.cpp | 1 - 4 files changed, 42 insertions(+), 61 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 17504ac3af..2917055214 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -40,9 +40,9 @@ void NPairHalfBinNewtonTri::build(NeighList *list) tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - - double delta = 0.01 * force->angstrom; - + + const double delta = 0.01 * force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -92,40 +92,24 @@ void NPairHalfBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - //if (x[j][2] < ztmp) continue; - //if (x[j][2] == ztmp) { - // if (x[j][1] < ytmp) continue; - // if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - // } - } - } - - /* - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } - */ - + jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; @@ -135,8 +119,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { - //printf("NEIGH i,j %d %d ijtag %d %d dist %g\n", - // i,j,tag[i],tag[j],sqrt(rsq)); if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index be06393f58..295b7de18c 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -42,9 +42,9 @@ void NPairHalfNsqNewton::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - double delta = 0.01 * force->angstrom; - int triclinic = domain->triclinic; - + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -100,15 +100,15 @@ void NPairHalfNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } else { + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { if (x[j][1] < ytmp) continue; diff --git a/src/npair_halffull_newton.cpp b/src/npair_halffull_newton.cpp index d1e894943c..0192ed5729 100644 --- a/src/npair_halffull_newton.cpp +++ b/src/npair_halffull_newton.cpp @@ -39,8 +39,8 @@ void NPairHalffullNewton::build(NeighList *list) int *neighptr, *jlist; double xtmp, ytmp, ztmp; - double delta = 0.01 * force->angstrom; - int triclinic = domain->triclinic; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; double **x = atom->x; int nlocal = atom->nlocal; @@ -77,17 +77,17 @@ void NPairHalffullNewton::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; - + if (j < nlocal) { if (i > j) continue; } else if (triclinic) { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -95,7 +95,7 @@ void NPairHalffullNewton::build(NeighList *list) if (x[j][1] == ytmp && x[j][0] < xtmp) continue; } } - + neighptr[n++] = joriginal; } diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index f94bfc5e63..5887e389fb 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -29,7 +29,6 @@ void NStencilHalfBin3dTri::create() nstencil = 0; - //for (k = 0; k <= sz; k++) for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) From 9db5d4523282972f30dd6cb172fddcbb12921c1d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 9 Jul 2023 15:29:18 -0400 Subject: [PATCH 028/417] port neighbor list build changes to corresponding OPENMP package files --- src/OPENMP/npair_half_bin_newton_tri_omp.cpp | 29 ++++++++++++++------ src/OPENMP/npair_half_nsq_newton_omp.cpp | 24 ++++++++++++---- src/OPENMP/npair_halffull_newton_omp.cpp | 13 +++++++++ src/npair_half_nsq_newton.cpp | 7 +++-- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp index e754456ef1..3ad07acd56 100644 --- a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "force.h" #include "molecule.h" #include "domain.h" #include "my_page.h" @@ -40,6 +41,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -48,7 +50,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; @@ -79,6 +81,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -98,12 +101,22 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -119,7 +132,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_nsq_newton_omp.cpp b/src/OPENMP/npair_half_nsq_newton_omp.cpp index cb08cb7f7a..726814c6f0 100644 --- a/src/OPENMP/npair_half_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_nsq_newton_omp.cpp @@ -15,14 +15,16 @@ #include "omp_compat.h" #include "npair_half_nsq_newton_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" +#include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -42,6 +44,8 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) const int bitmask = (includegroup) ? group->bitmask[includegroup] : 0; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -49,8 +53,8 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,n,itype,jtype,itag,jtag,which,imol,iatom; - tagint tagprev; + int i,j,n,itype,jtype,which,imol,iatom; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; @@ -106,6 +110,14 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -127,7 +139,7 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_halffull_newton_omp.cpp b/src/OPENMP/npair_halffull_newton_omp.cpp index abd5f7eacb..e833ab3095 100644 --- a/src/OPENMP/npair_halffull_newton_omp.cpp +++ b/src/OPENMP/npair_halffull_newton_omp.cpp @@ -15,7 +15,9 @@ #include "npair_halffull_newton_omp.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" #include "npair_omp.h" @@ -38,6 +40,8 @@ NPairHalffullNewtonOmp::NPairHalffullNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} void NPairHalffullNewtonOmp::build(NeighList *list) { const int inum_full = list->listfull->inum; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -83,8 +87,17 @@ void NPairHalffullNewtonOmp::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index 295b7de18c..023ece69c9 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -13,15 +13,16 @@ ------------------------------------------------------------------------- */ #include "npair_half_nsq_newton.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; From 07f42930ff711b09bf46f9641ae964617edf3cad Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 10 Jul 2023 12:53:02 -0700 Subject: [PATCH 029/417] clean up code and comments --- src/compute_property_local.cpp | 3 ++- src/npair_half_bin_newton_tri.cpp | 29 ++++++----------------------- src/npair_half_nsq_newton.cpp | 5 +++++ src/npair_halffull_newton.cpp | 5 +++++ src/nstencil_half_bin_2d_tri.cpp | 12 ++++++++++-- src/nstencil_half_bin_3d_tri.cpp | 8 +++++++- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/compute_property_local.cpp b/src/compute_property_local.cpp index d0523a1bec..92036c4bd2 100644 --- a/src/compute_property_local.cpp +++ b/src/compute_property_local.cpp @@ -405,7 +405,8 @@ int ComputePropertyLocal::count_pairs(int allflag, int forceflag) if (!(mask[j] & groupbit)) continue; // itag = jtag is possible for long cutoffs that include images of self - + // do not need triclinic logic here b/c neighbor list itself is correct + if (newton_pair == 0 && j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 17504ac3af..71a15df59e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -83,11 +83,12 @@ void NPairHalfBinNewtonTri::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms - + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { @@ -107,25 +108,9 @@ void NPairHalfBinNewtonTri::build(NeighList *list) } else { if (x[j][0] < xtmp) continue; } - //if (x[j][2] < ztmp) continue; - //if (x[j][2] == ztmp) { - // if (x[j][1] < ytmp) continue; - // if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - // } } } - /* - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } - */ - jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; @@ -135,8 +120,6 @@ void NPairHalfBinNewtonTri::build(NeighList *list) rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { - //printf("NEIGH i,j %d %d ijtag %d %d dist %g\n", - // i,j,tag[i],tag[j],sqrt(rsq)); if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); diff --git a/src/npair_half_nsq_newton.cpp b/src/npair_half_nsq_newton.cpp index be06393f58..0174a78900 100644 --- a/src/npair_half_nsq_newton.cpp +++ b/src/npair_half_nsq_newton.cpp @@ -89,7 +89,12 @@ void NPairHalfNsqNewton::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use direct I/J coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; diff --git a/src/npair_halffull_newton.cpp b/src/npair_halffull_newton.cpp index d1e894943c..af15b27eac 100644 --- a/src/npair_halffull_newton.cpp +++ b/src/npair_halffull_newton.cpp @@ -70,6 +70,11 @@ void NPairHalffullNewton::build(NeighList *list) ztmp = x[i][2]; // loop over full neighbor list + // use i < j < nlocal to eliminate half the local/local interactions + // for triclinic, must use delta to eliminate half the local/ghost interactions + // cannot use direct I/J coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon jlist = firstneigh_full[i]; jnum = numneigh_full[i]; diff --git a/src/nstencil_half_bin_2d_tri.cpp b/src/nstencil_half_bin_2d_tri.cpp index 06831730fd..920918fe09 100644 --- a/src/nstencil_half_bin_2d_tri.cpp +++ b/src/nstencil_half_bin_2d_tri.cpp @@ -27,9 +27,17 @@ void NStencilHalfBin2dTri::create() { int i, j; + // for triclinic, need to use full stencil in all dims + // not a half stencil in y + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift both coords by epsilon + // thus for an I/J owned/ghost pair, the xy coords + // and bin assignments can be different on I proc vs J proc + nstencil = 0; - for (j = 0; j <= sy; j++) + for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (bin_distance(i, j, 0) < cutneighmaxsq) stencil[nstencil++] = j * mbinx + i; + if (bin_distance(i, j, 0) < cutneighmaxsq) + stencil[nstencil++] = j * mbinx + i; } diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index f94bfc5e63..d146b92cd1 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -27,9 +27,15 @@ void NStencilHalfBin3dTri::create() { int i, j, k; + // for triclinic, need to use full stencil in all dims + // not a half stencil in z + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + // thus for an I/J owned/ghost pair, the xyz coords + // and bin assignments can be different on I proc vs J proc + nstencil = 0; - //for (k = 0; k <= sz; k++) for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) From fbbf44fb8e2948fea648f048f4ab1cb088cd93bc Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 10 Jul 2023 18:25:29 -0700 Subject: [PATCH 030/417] same changes to other NPair and NStencil methods --- src/npair_half_bin_newton_tri.cpp | 4 +- src/npair_half_multi_newton_tri.cpp | 119 +++++++++++-------- src/npair_half_multi_old_newton_tri.cpp | 44 ++++--- src/npair_half_respa_bin_newton_tri.cpp | 45 ++++--- src/npair_half_respa_nsq_newton.cpp | 24 +++- src/npair_half_respa_nsq_newton.h | 2 +- src/npair_half_size_bin_newton_tri.cpp | 41 +++++-- src/npair_half_size_multi_newton_tri.cpp | 107 ++++++++++------- src/npair_half_size_multi_old_newton_tri.cpp | 45 ++++--- src/npair_half_size_nsq_newton.cpp | 22 +++- src/npair_halffull_newton_trim.cpp | 19 +++ src/nstencil_half_multi_2d_tri.cpp | 2 +- src/nstencil_half_multi_3d_tri.cpp | 2 +- src/nstencil_half_multi_old_2d_tri.cpp | 2 +- src/nstencil_half_multi_old_3d_tri.cpp | 2 +- 15 files changed, 313 insertions(+), 167 deletions(-) diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index f6cbf1b1af..9c0688af68 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -16,11 +16,11 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" using namespace LAMMPS_NS; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 9bebfe71e2..316acb5049 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neighbor.h" @@ -39,11 +40,13 @@ NPairHalfMultiNewtonTri::NPairHalfMultiNewtonTri(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfMultiNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,icollection,jcollection,ibin,jbin,which,ns,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; int js; + const double delta = 0.01 * force->angstrom; + int *collection = neighbor->collection; double **x = atom->x; int *type = atom->type; @@ -72,6 +75,8 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); + + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -86,65 +91,79 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin + if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil - // stencil is empty if i larger than j - // stencil is half if i same size as j - // stencil is full if i smaller than j - // if half: pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic: + // stencil is empty if i larger than j + // stencil is full if i smaller than j + // stencil is full if i same size as j + // for i smaller than j: + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } + } - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - // if same size (same collection), use half stencil - if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } - } + 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]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } } ilist[inum++] = i; diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index fbb9a8e504..9dcbcff9f4 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -38,11 +39,13 @@ NPairHalfMultiOldNewtonTri::NPairHalfMultiOldNewtonTri(LAMMPS *lmp) : NPair(lmp) void NPairHalfMultiOldNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,ibin,which,ns,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; double *cutsq,*distsq; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -71,6 +74,7 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -81,13 +85,12 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -98,14 +101,23 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index b2749bd7a7..05b839869a 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -16,10 +16,11 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" using namespace LAMMPS_NS; @@ -38,10 +39,12 @@ NPairHalfRespaBinNewtonTri::NPairHalfRespaBinNewtonTri(LAMMPS *lmp) : void NPairHalfRespaBinNewtonTri::build(NeighList *list) { int i,j,k,n,itype,jtype,ibin,n_inner,n_middle,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -94,6 +97,7 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) neighptr_middle = ipage_middle->vget(); } + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -105,22 +109,33 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_respa_nsq_newton.cpp b/src/npair_half_respa_nsq_newton.cpp index 77d6af141f..d0292eec92 100644 --- a/src/npair_half_respa_nsq_newton.cpp +++ b/src/npair_half_respa_nsq_newton.cpp @@ -16,9 +16,10 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" #include "error.h" @@ -38,12 +39,15 @@ NPairHalfRespaNsqNewton::NPairHalfRespaNsqNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfRespaNsqNewton::build(NeighList *list) { - int i,j,n,itype,jtype,itag,jtag,n_inner,n_middle,bitmask; + int i,j,n,itype,jtype,n_inner,n_middle,bitmask; int imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -112,6 +116,12 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -122,6 +132,14 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_half_respa_nsq_newton.h b/src/npair_half_respa_nsq_newton.h index e5233f5e9d..4a5ae23aef 100644 --- a/src/npair_half_respa_nsq_newton.h +++ b/src/npair_half_respa_nsq_newton.h @@ -15,7 +15,7 @@ // clang-format off NPairStyle(half/respa/nsq/newton, NPairHalfRespaNsqNewton, - NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTON | NP_ORTHO); + NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTON | NP_ORTHO | NP_TRI); // clang-format on #else diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index 47bb9d01e1..e6a236eecb 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -39,11 +40,13 @@ NPairHalfSizeBinNewtonTri::NPairHalfSizeBinNewtonTri(LAMMPS *lmp) : void NPairHalfSizeBinNewtonTri::build(NeighList *list) { int i,j,jh,k,n,ibin,which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; double *radius = atom->radius; int *type = atom->type; @@ -76,6 +79,7 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; @@ -87,22 +91,33 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index 5d8a0f05ef..a363ae6e1e 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neighbor.h" @@ -41,11 +42,13 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) { int i,j,jh,k,n,itype,jtype,icollection,jcollection,ibin,jbin,ns,js; int which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; + const double delta = 0.01 * force->angstrom; + int *collection = neighbor->collection; double **x = atom->x; double *radius = atom->radius; @@ -78,6 +81,8 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); + + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -93,11 +98,13 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin + if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -108,56 +115,66 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { - // if same size (same collection), use half stencil - if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); - - if (rsq <= cutdistsq) { - jh = j; - if (history && rsq < radsum*radsum) - jh = jh ^ mask_history; - - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = jh; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = jh; - else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); - } else neighptr[n++] = jh; - } - } - } + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); + + if (rsq <= cutdistsq) { + jh = j; + if (history && rsq < radsum*radsum) + jh = jh ^ mask_history; + + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = jh; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = jh; + else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); + } else neighptr[n++] = jh; + } + } + } } ilist[inum++] = i; diff --git a/src/npair_half_size_multi_old_newton_tri.cpp b/src/npair_half_size_multi_old_newton_tri.cpp index ea3f271956..974500d6b8 100644 --- a/src/npair_half_size_multi_old_newton_tri.cpp +++ b/src/npair_half_size_multi_old_newton_tri.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -38,12 +39,14 @@ NPairHalfSizeMultiOldNewtonTri::NPairHalfSizeMultiOldNewtonTri(LAMMPS *lmp) : NP void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) { int i,j,jh,k,n,itype,jtype,ibin,ns,which,imol,iatom,moltemplate; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; double *cutsq,*distsq; + const double delta = 0.01 * force->angstrom; + double **x = atom->x; double *radius = atom->radius; int *type = atom->type; @@ -76,6 +79,7 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) n = 0; neighptr = ipage->vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -87,13 +91,12 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -104,14 +107,24 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_size_nsq_newton.cpp b/src/npair_half_size_nsq_newton.cpp index 8b596e6968..abd2a4faff 100644 --- a/src/npair_half_size_nsq_newton.cpp +++ b/src/npair_half_size_nsq_newton.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "group.h" #include "my_page.h" @@ -39,12 +40,15 @@ NPairHalfSizeNsqNewton::NPairHalfSizeNsqNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeNsqNewton::build(NeighList *list) { - int i,j,jh,n,itag,jtag,bitmask,which,imol,iatom,moltemplate; - tagint tagprev; + int i,j,jh,n,bitmask,which,imol,iatom,moltemplate; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; double *radius = atom->radius; tagint *tag = atom->tag; @@ -93,6 +97,12 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -103,6 +113,14 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/npair_halffull_newton_trim.cpp b/src/npair_halffull_newton_trim.cpp index b7bb72c990..7d420f88af 100644 --- a/src/npair_halffull_newton_trim.cpp +++ b/src/npair_halffull_newton_trim.cpp @@ -14,7 +14,9 @@ #include "npair_halffull_newton_trim.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" @@ -38,6 +40,9 @@ void NPairHalffullNewtonTrim::build(NeighList *list) double xtmp, ytmp, ztmp; double delx, dely, delz, rsq; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + double **x = atom->x; int nlocal = atom->nlocal; @@ -68,6 +73,11 @@ void NPairHalffullNewtonTrim::build(NeighList *list) ztmp = x[i][2]; // loop over full neighbor list + // use i < j < nlocal to eliminate half the local/local interactions + // for triclinic, must use delta to eliminate half the local/ghost interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon jlist = firstneigh_full[i]; jnum = numneigh_full[i]; @@ -75,8 +85,17 @@ void NPairHalffullNewtonTrim::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { diff --git a/src/nstencil_half_multi_2d_tri.cpp b/src/nstencil_half_multi_2d_tri.cpp index bf39c04099..85bbe94c86 100644 --- a/src/nstencil_half_multi_2d_tri.cpp +++ b/src/nstencil_half_multi_2d_tri.cpp @@ -80,7 +80,7 @@ void NStencilHalfMulti2dTri::create() cutsq = cutcollectionsq[icollection][jcollection]; if (flag_half_multi[icollection][jcollection]) { - for (j = 0; j <= sy; j++) + for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i, j, 0, bin_collection) < cutsq) stencil_multi[icollection][jcollection][ns++] = j * mbinx + i; diff --git a/src/nstencil_half_multi_3d_tri.cpp b/src/nstencil_half_multi_3d_tri.cpp index f2d4d051ad..9761e15854 100644 --- a/src/nstencil_half_multi_3d_tri.cpp +++ b/src/nstencil_half_multi_3d_tri.cpp @@ -81,7 +81,7 @@ void NStencilHalfMulti3dTri::create() cutsq = cutcollectionsq[icollection][jcollection]; if (flag_half_multi[icollection][jcollection]) { - for (k = 0; k <= sz; k++) + for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i, j, k, bin_collection) < cutsq) diff --git a/src/nstencil_half_multi_old_2d_tri.cpp b/src/nstencil_half_multi_old_2d_tri.cpp index 1438aef843..0aeb65bebd 100644 --- a/src/nstencil_half_multi_old_2d_tri.cpp +++ b/src/nstencil_half_multi_old_2d_tri.cpp @@ -37,7 +37,7 @@ void NStencilHalfMultiOld2dTri::create() s = stencil_multi_old[itype]; distsq = distsq_multi_old[itype]; n = 0; - for (j = 0; j <= sy; j++) + for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) { rsq = bin_distance(i, j, 0); if (rsq < typesq) { diff --git a/src/nstencil_half_multi_old_3d_tri.cpp b/src/nstencil_half_multi_old_3d_tri.cpp index 836eee6039..3717b7836b 100644 --- a/src/nstencil_half_multi_old_3d_tri.cpp +++ b/src/nstencil_half_multi_old_3d_tri.cpp @@ -37,7 +37,7 @@ void NStencilHalfMultiOld3dTri::create() s = stencil_multi_old[itype]; distsq = distsq_multi_old[itype]; n = 0; - for (k = 0; k <= sz; k++) + for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) { rsq = bin_distance(i, j, k); From 6bd965f0df72b23b1a4819f9382eefc642619e72 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 10 Jul 2023 22:35:36 -0400 Subject: [PATCH 031/417] fix whitespace (again) --- src/compute_property_local.cpp | 2 +- src/npair_half_bin_newton_tri.cpp | 36 +++---- src/npair_half_multi_newton_tri.cpp | 98 +++++++++--------- src/npair_half_multi_old_newton_tri.cpp | 32 +++--- src/npair_half_respa_bin_newton_tri.cpp | 36 +++---- src/npair_half_size_bin_newton_tri.cpp | 34 +++---- src/npair_half_size_multi_newton_tri.cpp | 100 +++++++++---------- src/npair_half_size_multi_old_newton_tri.cpp | 34 +++---- src/npair_halffull_newton_trim.cpp | 2 +- src/nstencil_half_bin_3d_tri.cpp | 2 +- 10 files changed, 188 insertions(+), 188 deletions(-) diff --git a/src/compute_property_local.cpp b/src/compute_property_local.cpp index 92036c4bd2..87517a3e05 100644 --- a/src/compute_property_local.cpp +++ b/src/compute_property_local.cpp @@ -406,7 +406,7 @@ int ComputePropertyLocal::count_pairs(int allflag, int forceflag) // itag = jtag is possible for long cutoffs that include images of self // do not need triclinic logic here b/c neighbor list itself is correct - + if (newton_pair == 0 && j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 9c0688af68..453d10096e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -88,28 +88,28 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // cannot use I/J exact coord comparision // b/c transforming orthog -> lambda -> orthog for ghost atoms // with an added PBC offset can shift all 3 coords by epsilon - + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 316acb5049..1d75d6a3ef 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -91,11 +91,11 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections - + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin - + if (icollection == jcollection) jbin = ibin; else jbin = coord2bin(x[i], jcollection); @@ -109,60 +109,60 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) // cannot use I/J exact coord comparision // b/c transforming orthog -> lambda -> orthog for ghost atoms // with an added PBC offset can shift all 3 coords by epsilon - + s = stencil_multi[icollection][jcollection]; ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - - // if same size (same collection), exclude half of interactions - - if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } - } + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { - jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + // if same size (same collection), exclude half of interactions - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } + } - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } } } diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index 9dcbcff9f4..72d46d042f 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -102,22 +102,22 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index 05b839869a..eac67b8bd5 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -118,24 +118,24 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index e6a236eecb..0d1a0a7329 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -101,23 +101,23 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index a363ae6e1e..f597789dee 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -98,11 +98,11 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections - + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin - + if (icollection == jcollection) jbin = ibin; else jbin = coord2bin(x[i], jcollection); @@ -119,61 +119,61 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + + // if same size (same collection), exclude half of interactions - // if same size (same collection), exclude half of interactions - if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); - - if (rsq <= cutdistsq) { - jh = j; - if (history && rsq < radsum*radsum) - jh = jh ^ mask_history; - - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = jh; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = jh; - else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); - } else neighptr[n++] = jh; - } - } + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); + + if (rsq <= cutdistsq) { + jh = j; + if (history && rsq < radsum*radsum) + jh = jh ^ mask_history; + + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = jh; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = jh; + else if (which > 0) neighptr[n++] = jh ^ (which << SBBITS); + } else neighptr[n++] = jh; + } + } } } diff --git a/src/npair_half_size_multi_old_newton_tri.cpp b/src/npair_half_size_multi_old_newton_tri.cpp index 974500d6b8..848a19aa39 100644 --- a/src/npair_half_size_multi_old_newton_tri.cpp +++ b/src/npair_half_size_multi_old_newton_tri.cpp @@ -108,23 +108,23 @@ void NPairHalfSizeMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_halffull_newton_trim.cpp b/src/npair_halffull_newton_trim.cpp index 7d420f88af..e758c04284 100644 --- a/src/npair_halffull_newton_trim.cpp +++ b/src/npair_halffull_newton_trim.cpp @@ -85,7 +85,7 @@ void NPairHalffullNewtonTrim::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; - + if (j < nlocal) { if (i > j) continue; } else if (triclinic) { diff --git a/src/nstencil_half_bin_3d_tri.cpp b/src/nstencil_half_bin_3d_tri.cpp index d146b92cd1..72bef7fb76 100644 --- a/src/nstencil_half_bin_3d_tri.cpp +++ b/src/nstencil_half_bin_3d_tri.cpp @@ -33,7 +33,7 @@ void NStencilHalfBin3dTri::create() // with an added PBC offset can shift all 3 coords by epsilon // thus for an I/J owned/ghost pair, the xyz coords // and bin assignments can be different on I proc vs J proc - + nstencil = 0; for (k = -sz; k <= sz; k++) From 2eeea4332076c4a11193bd6c4a71d29ab649778c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jul 2023 01:09:44 -0400 Subject: [PATCH 032/417] port neighbor list changes to OPENMP package --- src/OPENMP/npair_half_bin_newton_tri_omp.cpp | 20 +-- .../npair_half_multi_newton_tri_omp.cpp | 118 ++++++++++-------- .../npair_half_multi_old_newton_tri_omp.cpp | 50 +++++--- src/OPENMP/npair_half_nsq_newton_omp.cpp | 7 +- .../npair_half_respa_bin_newton_tri_omp.cpp | 47 ++++--- .../npair_half_respa_nsq_newton_omp.cpp | 35 ++++-- .../npair_half_size_bin_newton_tri_omp.cpp | 40 +++--- .../npair_half_size_multi_newton_tri_omp.cpp | 43 ++++--- ...air_half_size_multi_old_newton_tri_omp.cpp | 42 ++++--- src/OPENMP/npair_half_size_nsq_newton_omp.cpp | 27 +++- src/npair_half_bin_newton_tri.cpp | 3 +- src/npair_half_multi_newton_tri.cpp | 4 +- src/npair_half_respa_bin_newton_tri.cpp | 3 +- src/npair_half_respa_nsq_newton.cpp | 7 +- src/npair_half_size_nsq_newton.cpp | 2 +- 15 files changed, 278 insertions(+), 170 deletions(-) diff --git a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp index 3ad07acd56..47524474ed 100644 --- a/src/OPENMP/npair_half_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_bin_newton_tri_omp.cpp @@ -12,17 +12,18 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "omp_compat.h" #include "npair_half_bin_newton_tri_omp.h" #include "npair_omp.h" -#include "neigh_list.h" +#include "omp_compat.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -54,8 +55,6 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -93,10 +92,11 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { diff --git a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp index a152d011a7..b18cba0261 100644 --- a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp @@ -12,17 +12,19 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "omp_compat.h" #include "npair_half_multi_newton_tri_omp.h" -#include "npair_omp.h" -#include "neighbor.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "npair_omp.h" +#include "omp_compat.h" using namespace LAMMPS_NS; @@ -43,6 +45,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -51,13 +54,11 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,jbin,icollection,jcollection,which,ns,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; int js; - // loop over each atom, storing neighbors - int *collection = neighbor->collection; double **x = atom->x; int *type = atom->type; @@ -84,6 +85,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -98,65 +100,79 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin + if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil - // stencil is empty if i larger than j - // stencil is half if i same size as j - // stencil is full if i smaller than j - // if half: pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic: + // stencil is empty if i larger than j + // stencil is full if i smaller than j + // stencil is full if i same size as j + // for i smaller than j: + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { - // if same size (same collection), use half stencil - if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } } jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; } + } + } } ilist[i] = i; diff --git a/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp index e4895ff1a9..38f645abad 100644 --- a/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_old_newton_tri_omp.cpp @@ -15,13 +15,15 @@ #include "omp_compat.h" #include "npair_half_multi_old_newton_tri_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -42,6 +44,7 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -50,13 +53,11 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,which,ns,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; double *cutsq,*distsq; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -82,6 +83,7 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -92,13 +94,12 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -109,12 +110,21 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -129,7 +139,7 @@ void NPairHalfMultiOldNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_nsq_newton_omp.cpp b/src/OPENMP/npair_half_nsq_newton_omp.cpp index 726814c6f0..42cf63278a 100644 --- a/src/OPENMP/npair_half_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_nsq_newton_omp.cpp @@ -58,8 +58,6 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -99,7 +97,12 @@ void NPairHalfNsqNewtonOmp::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; diff --git a/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp index c998f71290..78b3abdd66 100644 --- a/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_respa_bin_newton_tri_omp.cpp @@ -15,13 +15,15 @@ #include "omp_compat.h" #include "npair_half_respa_bin_newton_tri_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "my_page.h" #include "error.h" +#include "force.h" +#include "molecule.h" +#include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -42,6 +44,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; @@ -53,12 +56,10 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,k,n,itype,jtype,ibin,n_inner,n_middle,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -111,6 +112,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) neighptr_middle = ipage_middle->vget(); } + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; @@ -122,20 +124,31 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -151,7 +164,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp b/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp index 6604861f74..a9745edc64 100644 --- a/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_respa_nsq_newton_omp.cpp @@ -15,21 +15,22 @@ #include "omp_compat.h" #include "npair_half_respa_nsq_newton_omp.h" #include "npair_omp.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" +#include "domain.h" +#include "error.h" +#include "force.h" #include "group.h" #include "molecule.h" -#include "domain.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaNsqNewtonOmp::NPairHalfRespaNsqNewtonOmp(LAMMPS *lmp) : - NPair(lmp) {} +NPairHalfRespaNsqNewtonOmp::NPairHalfRespaNsqNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- multiple respa lists @@ -45,6 +46,8 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) const int bitmask = (includegroup) ? group->bitmask[includegroup] : 0; const int molecular = atom->molecular; const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; @@ -55,13 +58,11 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,n,itype,jtype,itag,jtag,n_inner,n_middle,imol,iatom; - tagint tagprev; + int i,j,n,itype,jtype,n_inner,n_middle,imol,iatom; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*neighptr_inner,*neighptr_middle; - // loop over each atom, storing neighbors - double **x = atom->x; int *type = atom->type; int *mask = atom->mask; @@ -128,6 +129,12 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -138,6 +145,14 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -159,7 +174,7 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp index c320296442..7fcf07e9c8 100644 --- a/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_bin_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -46,6 +47,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -54,13 +56,11 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,jh,k,n,ibin,which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; - // loop over each atom, storing neighbors - double **x = atom->x; double *radius = atom->radius; int *type = atom->type; @@ -87,6 +87,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; @@ -98,20 +99,31 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) } // loop over all atoms in bins in stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -132,7 +144,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp index 9a0ead482b..916b7bfbc3 100644 --- a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neighbor.h" @@ -48,6 +49,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -55,15 +57,12 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,jh,k,n,itype,jtype,icollection,jcollection,ibin,jbin,ns; + int i,j,jh,k,n,itype,jtype,icollection,jcollection,ibin,jbin,ns,js; int which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; - int js; - - // loop over each atom, storing neighbors int *collection = neighbor->collection; double **x = atom->x; @@ -92,6 +91,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; icollection = collection[i]; xtmp = x[i][0]; @@ -107,12 +107,13 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) ibin = atom2bin[i]; // loop through stencils for all collections + for (jcollection = 0; jcollection < ncollections; jcollection++) { // if same collection use own bin - if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + if (icollection == jcollection) jbin = ibin; + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -130,14 +131,24 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) js = binhead_multi[jcollection][jbin + s[k]]; for (j = js; j >= 0; j = bins[j]) { - // if same size (same collection), use half stencil - if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } } @@ -160,7 +171,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp index c74b191f66..7faa210107 100644 --- a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "my_page.h" #include "neigh_list.h" @@ -32,7 +33,6 @@ NPairHalfSizeMultiOldNewtonTriOmp::NPairHalfSizeMultiOldNewtonTriOmp(LAMMPS *lmp NPair(lmp) {} /* ---------------------------------------------------------------------- - size particles binned neighbor list construction with Newton's 3rd law for triclinic each owned atom i checks its own bin and other bins in triclinic stencil multi-type stencil is itype dependent and is distance checked @@ -46,6 +46,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -54,7 +55,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) NPAIR_OMP_SETUP(nlocal); int i,j,jh,k,n,itype,jtype,ibin,ns,which,imol,iatom; - tagint tagprev; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutdistsq; int *neighptr,*s; @@ -97,13 +98,12 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) tagprev = tag[i] - iatom - 1; } - // loop over all atoms in bins, including self, in stencil - // skip if i,j neighbor cutoff is less than bin distance - // bins below self are excluded from stencil - // pairs for atoms j "below" i are excluded - // below = lower z or (equal z and lower y) or (equal zy and lower x) - // (equal zyx and j <= i) - // latter excludes self-self interaction but allows superposed atoms + // loop over all atoms in bins in stencil + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon ibin = atom2bin[i]; s = stencil_multi_old[itype]; @@ -114,12 +114,22 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) for (j = binhead[ibin+s[k]]; j >= 0; j = bins[j]) { jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp) { - if (x[j][0] < xtmp) continue; - if (x[j][0] == xtmp && j <= i) continue; + + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } } @@ -140,7 +150,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/OPENMP/npair_half_size_nsq_newton_omp.cpp b/src/OPENMP/npair_half_size_nsq_newton_omp.cpp index 35dc42ec5b..0628478c0b 100644 --- a/src/OPENMP/npair_half_size_nsq_newton_omp.cpp +++ b/src/OPENMP/npair_half_size_nsq_newton_omp.cpp @@ -18,6 +18,7 @@ #include "atom_vec.h" #include "domain.h" #include "error.h" +#include "force.h" #include "molecule.h" #include "group.h" #include "my_page.h" @@ -30,13 +31,11 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeNsqNewtonOmp::NPairHalfSizeNsqNewtonOmp(LAMMPS *lmp) : - NPair(lmp) {} +NPairHalfSizeNsqNewtonOmp::NPairHalfSizeNsqNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- size particles N^2 / 2 search for neighbor pairs with full Newton's 3rd law - shear history must be accounted for when a neighbor pair is added pair added to list if atoms i and j are both owned and i < j if j is ghost only me or other proc adds pair decision based on itag,jtag tests @@ -50,6 +49,8 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) const int moltemplate = (molecular == Atom::TEMPLATE) ? 1 : 0; const int history = list->history; const int mask_history = 1 << HISTBITS; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; @@ -58,8 +59,8 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,jh,n,itag,jtag,which,imol,iatom; - tagint tagprev; + int i,j,jh,n,which,imol,iatom; + tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; @@ -104,6 +105,12 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) } // loop over remaining atoms, owned and ghost + // use itag/jtap comparision to eliminate half the interactions + // itag = jtag is possible for long cutoffs that include images of self + // for triclinic, must use delta to eliminate half the I/J interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon for (j = i+1; j < nall; j++) { if (includegroup && !(mask[j] & bitmask)) continue; @@ -114,6 +121,14 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { @@ -140,7 +155,7 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) if (molecular != Atom::ATOMIC) { if (!moltemplate) which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >=0) + else if (imol >= 0) which = find_special(onemols[imol]->special[iatom], onemols[imol]->nspecial[iatom], tag[j]-tagprev); diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 453d10096e..d261363b0e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ #include "npair_half_bin_newton_tri.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" #include "domain.h" @@ -21,6 +21,7 @@ #include "force.h" #include "molecule.h" #include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 1d75d6a3ef..2b753af499 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -21,8 +21,8 @@ #include "force.h" #include "molecule.h" #include "my_page.h" -#include "neighbor.h" #include "neigh_list.h" +#include "neighbor.h" using namespace LAMMPS_NS; @@ -39,7 +39,7 @@ NPairHalfMultiNewtonTri::NPairHalfMultiNewtonTri(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfMultiNewtonTri::build(NeighList *list) { - int i,j,k,n,itype,jtype,icollection,jcollection,ibin,jbin,which,ns,imol,iatom,moltemplate; + int i,j,k,n,itype,jtype,ibin,jbin,icollection,jcollection,which,ns,imol,iatom,moltemplate; tagint itag,jtag,tagprev; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; int *neighptr,*s; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index eac67b8bd5..4cd4ead0fa 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ #include "npair_half_respa_bin_newton_tri.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" #include "domain.h" @@ -21,6 +21,7 @@ #include "force.h" #include "molecule.h" #include "my_page.h" +#include "neigh_list.h" using namespace LAMMPS_NS; diff --git a/src/npair_half_respa_nsq_newton.cpp b/src/npair_half_respa_nsq_newton.cpp index d0292eec92..ae56d62fb5 100644 --- a/src/npair_half_respa_nsq_newton.cpp +++ b/src/npair_half_respa_nsq_newton.cpp @@ -13,15 +13,16 @@ ------------------------------------------------------------------------- */ #include "npair_half_respa_nsq_newton.h" -#include "neigh_list.h" + #include "atom.h" #include "atom_vec.h" #include "domain.h" +#include "error.h" #include "force.h" #include "group.h" #include "molecule.h" #include "my_page.h" -#include "error.h" +#include "neigh_list.h" using namespace LAMMPS_NS; @@ -132,7 +133,7 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { + } else if (triclinic) { if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; } else if (fabs(x[j][1]-ytmp) > delta) { diff --git a/src/npair_half_size_nsq_newton.cpp b/src/npair_half_size_nsq_newton.cpp index abd2a4faff..ce0c7f9562 100644 --- a/src/npair_half_size_nsq_newton.cpp +++ b/src/npair_half_size_nsq_newton.cpp @@ -113,7 +113,7 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { if ((itag+jtag) % 2 == 1) continue; - } else if (triclinic) { + } else if (triclinic) { if (fabs(x[j][2]-ztmp) > delta) { if (x[j][2] < ztmp) continue; } else if (fabs(x[j][1]-ytmp) > delta) { From bb6e4d844088cea152ebd0cf5007a6ba5c2cbfe2 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 11 Jul 2023 14:30:14 -0700 Subject: [PATCH 033/417] add forgotten line to multi and mutli/old --- src/npair_half_multi_newton_tri.cpp | 1 + src/npair_half_multi_old_newton_tri.cpp | 1 + src/npair_half_size_multi_newton_tri.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 316acb5049..2595c3ce21 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -121,6 +121,7 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index 9dcbcff9f4..8700db3b32 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -102,6 +102,7 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index a363ae6e1e..4ff50870b6 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -126,6 +126,7 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { From 2a7ac115d8563dab636f10ba516c461ba23f0694 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jul 2023 18:25:29 -0400 Subject: [PATCH 034/417] fix whitespace (one more time) --- src/npair_half_multi_newton_tri.cpp | 50 ++++++++++++------------ src/npair_half_multi_old_newton_tri.cpp | 34 ++++++++-------- src/npair_half_size_multi_newton_tri.cpp | 36 ++++++++--------- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 1c95e73151..24300f6929 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -114,31 +114,31 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - - // if same size (same collection), exclude half of interactions - - if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } - } + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + + // if same size (same collection), exclude half of interactions + + if (cutcollectionsq[icollection][icollection] == + cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_multi_old_newton_tri.cpp b/src/npair_half_multi_old_newton_tri.cpp index 8700db3b32..ce3149ebf5 100644 --- a/src/npair_half_multi_old_newton_tri.cpp +++ b/src/npair_half_multi_old_newton_tri.cpp @@ -102,23 +102,23 @@ void NPairHalfMultiOldNewtonTri::build(NeighList *list) jtype = type[j]; if (cutsq[jtype] < distsq[k]) continue; - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index c521034406..aa0d8e3f42 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -125,24 +125,24 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) // if same size (same collection), exclude half of interactions if (cutcollectionsq[icollection][icollection] == - cutcollectionsq[jcollection][jcollection]) { - if (j <= i) continue; - if (j >= nlocal) { - jtag = tag[j]; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (fabs(x[j][2]-ztmp) > delta) { - if (x[j][2] < ztmp) continue; - } else if (fabs(x[j][1]-ytmp) > delta) { - if (x[j][1] < ytmp) continue; - } else { - if (x[j][0] < xtmp) continue; - } - } - } + cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; + if (j >= nlocal) { + jtag = tag[j]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } + } + } } jtype = type[j]; From 89fb236144902530091f279d012b90f907b93b50 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jul 2023 18:35:16 -0400 Subject: [PATCH 035/417] port bugfix for colloid test failure --- src/OPENMP/npair_half_multi_newton_tri_omp.cpp | 1 + src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp index b18cba0261..e26bea990f 100644 --- a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp @@ -130,6 +130,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { diff --git a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp index 916b7bfbc3..4765c918b7 100644 --- a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp @@ -135,6 +135,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]) { + if (j <= i) continue; if (j >= nlocal) { jtag = tag[j]; if (itag > jtag) { From 3fc809a1b9782430a4e41b8ca1d8a3c224762ef6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 11 Jul 2023 18:45:45 -0700 Subject: [PATCH 036/417] add check for atom IDs when triclinic --- src/neighbor.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index df1547e5eb..c6eea7e2f1 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -313,7 +313,10 @@ void Neighbor::init() triclinic = domain->triclinic; newton_pair = force->newton_pair; - // error check + // error checks + + if (triclinic && atom->tag_enable == 0) + error->all(FLERR, "Cannot build triclinic neighbor lists unless atoms have IDs"); if (delay > 0 && (delay % every) != 0) error->all(FLERR,"Neighbor delay must be 0 or multiple of every setting"); From a91b3dab963d0044885298955cc2edf8e6556ead Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 11 Jul 2023 18:50:23 -0700 Subject: [PATCH 037/417] doc atom ID requirement for triclinic --- doc/src/Howto_triclinic.rst | 3 ++- doc/src/atom_modify.rst | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/Howto_triclinic.rst b/doc/src/Howto_triclinic.rst index 0efadbcc8c..2983d013c6 100644 --- a/doc/src/Howto_triclinic.rst +++ b/doc/src/Howto_triclinic.rst @@ -12,7 +12,8 @@ is created, e.g. by the :doc:`create_box ` or :doc:`read_data ` or :doc:`read_restart ` commands. Additionally, LAMMPS defines box size parameters lx,ly,lz where lx = xhi-xlo, and similarly in the y and z dimensions. The 6 -parameters, as well as lx,ly,lz, can be output via the :doc:`thermo_style custom ` command. +parameters, as well as lx,ly,lz, can be output via the +:doc:`thermo_style custom ` command. LAMMPS also allows simulations to be performed in triclinic (non-orthogonal) simulation boxes shaped as a parallelepiped with diff --git a/doc/src/atom_modify.rst b/doc/src/atom_modify.rst index 1e5a3d49ff..21590e6680 100644 --- a/doc/src/atom_modify.rst +++ b/doc/src/atom_modify.rst @@ -65,6 +65,11 @@ switch. This is described on the :doc:`Build_settings ` doc page. If atom IDs are not used, they must be specified as 0 for all atoms, e.g. in a data or restart file. +.. note:: + + If a :doc:`triclinic simulation box ` is used, + atom IDs are required, due to how neighbor lists are built. + The *map* keyword determines how atoms with specific IDs are found when required. An example are the bond (angle, etc) methods which need to find the local index of an atom with a specific global ID From f62a4c537258e6eab4c20df0237b607378963d37 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 17 Jul 2023 16:49:26 -0500 Subject: [PATCH 038/417] Working on fix efield/kk --- src/KOKKOS/fix_efield_kokkos.cpp | 87 ++++++++++++++++++++++++++++++++ src/KOKKOS/fix_efield_kokkos.h | 52 +++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/KOKKOS/fix_efield_kokkos.cpp create mode 100644 src/KOKKOS/fix_efield_kokkos.h diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp new file mode 100644 index 0000000000..697116402d --- /dev/null +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -0,0 +1,87 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "fix_efield_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "atom_vec.h" +#include "input.h" +#include "modify.h" +#include "update.h" +#include "variable.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +FixEfieldKokkos::FixEfieldKokkos(LAMMPS *lmp, int narg, char **arg) : + FixEfield(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *)atom; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = X_MASK | Q_MASK | F_MASK | RMASS_MASK | MASK_MASK | TYPE_MASK; + datamask_modify = F_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEfieldKokkos::post_force(int /*vflag*/) +{ + // update efield due to variables + + update_efield_variables(); + + atomKK->sync(execution_space,datamask_read); + atomKK->modified(execution_space,datamask_modify); + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + q = atomKK->k_q.view(); + type = atomKK->k_type.view(); + mask = atomKK->k_mask.view(); + int nlocal = atomKK->nlocal; + if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; + + copymode = 1; + + eflag = 0; + + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), *this); + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void FixEfieldKokkos::operator()(const int i) const +{ + if (mask[i] & groupbit) { + double qi = q[i]; + f(i,0) += qi*ex; + f(i,1) += qi*ey; + f(i,2) += qi*ez; + } +} + +namespace LAMMPS_NS { +template class FixEfieldKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixEfieldKokkos; +#endif +} diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h new file mode 100644 index 0000000000..e5171ce6f5 --- /dev/null +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -0,0 +1,52 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 +// clang-format off +FixStyle(efield/kk,FixFixEfieldKokkos); +FixStyle(efield/kk/device,FixFixEfieldKokkos); +FixStyle(efield/kk/host,FixFixEfieldKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_EFIELD_KOKKOS_H +#define LMP_FIX_EFIELD_KOKKOS_H + +#include "fix_efield.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixEfieldKokkos : public FixEfield { + public: + FixEfieldKokkos(class LAMMPS *, int, char **); + + void post_force(int) override; + + KOKKOS_INLINE_FUNCTION + void operator()(const int, double &) const; + + private: + typename ArrayTypes::t_x_array x; + typename ArrayTypes::t_f_array f; + typename ArrayTypes::t_int_1d type; + typename ArrayTypes::t_int_1d mask; + typename ArrayTypes::t_float_1d_randomread q; +}; + +} // namespace LAMMPS_NS + +#endif // LMP_FIX_EFIELD_KOKKOS_H +#endif // FIX_CLASS From 6a991ff0a094a089a50b5f3723a7b1e8c1bbf990 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 1 Aug 2023 10:53:20 -0500 Subject: [PATCH 039/417] Updated fix efield/kk, needs work on unwrap --- src/KOKKOS/fix_efield_kokkos.cpp | 173 ++++++++++++++++++++++++++----- src/KOKKOS/fix_efield_kokkos.h | 67 +++++++++--- src/fix_efield.cpp | 2 + 3 files changed, 197 insertions(+), 45 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index 697116402d..fc84967e02 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -15,14 +15,23 @@ #include "fix_efield_kokkos.h" #include "atom_kokkos.h" -#include "atom_masks.h" -#include "atom_vec.h" -#include "input.h" -#include "modify.h" #include "update.h" +#include "modify.h" +#include "domain.h" +#include "region.h" +#include "input.h" #include "variable.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "kokkos_base.h" + +#include using namespace LAMMPS_NS; +using namespace FixConst; + +enum{NONE,CONSTANT,EQUAL,ATOM}; /* ---------------------------------------------------------------------- */ @@ -31,11 +40,36 @@ FixEfieldKokkos::FixEfieldKokkos(LAMMPS *lmp, int narg, char **arg) FixEfield(lmp, narg, arg) { kokkosable = 1; - atomKK = (AtomKokkos *)atom; + atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; - datamask_read = X_MASK | Q_MASK | F_MASK | RMASS_MASK | MASK_MASK | TYPE_MASK; - datamask_modify = F_MASK; + memory->destroy(efield); + memoryKK->create_kokkos(k_efield,efield,maxatom,4,"efield:efield"); + d_efield = k_efield.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +FixEfieldKokkos::~FixEfieldKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_efield,efield); + efield = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEfieldKokkos::init() +{ + FixEfield::init(); + + if (utils::strmatch(update->integrate_style,"^respa")) + error->all(FLERR,"Cannot (yet) use respa with Kokkos"); } /* ---------------------------------------------------------------------- */ @@ -43,39 +77,121 @@ FixEfieldKokkos::FixEfieldKokkos(LAMMPS *lmp, int narg, char **arg) template void FixEfieldKokkos::post_force(int /*vflag*/) { - // update efield due to variables + atomKK->sync(execution_space, F_MASK | Q_MASK | MASK_MASK); - update_efield_variables(); - - atomKK->sync(execution_space,datamask_read); - atomKK->modified(execution_space,datamask_modify); - - x = atomKK->k_x.view(); f = atomKK->k_f.view(); q = atomKK->k_q.view(); - type = atomKK->k_type.view(); mask = atomKK->k_mask.view(); - int nlocal = atomKK->nlocal; - if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; - copymode = 1; + int nlocal = atom->nlocal; - eflag = 0; + // update region if necessary - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), *this); - - copymode = 0; + if (region) { + if (!utils::strmatch(region->style, "^block")) + error->all(FLERR,"Cannot (yet) use {}-style region with fix efield/kk",region->style); + region->prematch(); + DAT::tdual_int_1d k_match = DAT::tdual_int_1d("efield:k_match",nlocal); + KokkosBase* regionKKBase = dynamic_cast(region); + regionKKBase->match_all_kokkos(groupbit,k_match); + k_match.template sync(); + d_match = k_match.template view(); + } + + // reallocate sforce array if necessary + + if (varflag == ATOM && atom->nmax > maxatom) { + maxatom = atom->nmax; + memoryKK->destroy_kokkos(k_efield,efield); + memoryKK->create_kokkos(k_efield,efield,maxatom,4,"efield:efield"); + d_efield = k_efield.view(); + } + + fsum[0] = fsum[1] = fsum[2] = fsum[3] = 0.0; + double_4 fsum_kk; + force_flag = 0; + + if (varflag == CONSTANT) { + copymode = 1; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + copymode = 0; + + // variable force, wrap with clear/add + + } else { + + atomKK->sync(Host,ALL_MASK); // this can be removed when variable class is ported to Kokkos + + modify->clearstep_compute(); + + if (xstyle == EQUAL) ex = input->variable->compute_equal(xvar); + else if (xstyle == ATOM) + input->variable->compute_atom(xvar,igroup,&efield[0][0],4,0); + if (ystyle == EQUAL) ey = input->variable->compute_equal(yvar); + else if (ystyle == ATOM) + input->variable->compute_atom(yvar,igroup,&efield[0][1],4,0); + if (zstyle == EQUAL) ez = input->variable->compute_equal(zvar); + else if (zstyle == ATOM) + input->variable->compute_atom(zvar,igroup,&efield[0][2],4,0); + + modify->addstep_compute(update->ntimestep + 1); + + if (varflag == ATOM) { // this can be removed when variable class is ported to Kokkos + k_efield.modify(); + k_efield.sync(); + } + + copymode = 1; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + copymode = 0; + } + + atomKK->modified(execution_space, F_MASK); + + fsum[0] = fsum_kk.d0; + fsum[1] = fsum_kk.d1; + fsum[2] = fsum_kk.d2; + fsum[3] = fsum_kk.d3; } template KOKKOS_INLINE_FUNCTION -void FixEfieldKokkos::operator()(const int i) const -{ +void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { if (mask[i] & groupbit) { - double qi = q[i]; - f(i,0) += qi*ex; - f(i,1) += qi*ey; - f(i,2) += qi*ez; + if (region && !d_match[i]) return; + const F_FLOAT qtmp = q[i]; + const F_FLOAT fx = qtmp * ex; + const F_FLOAT fy = qtmp * ey; + const F_FLOAT fz = qtmp * ez; + f(i,0) += fx; + f(i,1) += fy; + f(i,2) += fz; + //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; + } +} + +template +KOKKOS_INLINE_FUNCTION +void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int &i, double_4& fsum_kk) const { + if (mask[i] & groupbit) { + if (region && !d_match[i]) return; + const F_FLOAT qtmp = q[i]; + const F_FLOAT fx = qtmp * ex; + const F_FLOAT fy = qtmp * ey; + const F_FLOAT fz = qtmp * ez; + if (xstyle == ATOM) f(i,0) += d_efield(i,0); + else if (xstyle) f(i,0) += fx; + if (ystyle == ATOM) f(i,1) = d_efield(i,1); + else if (ystyle) f(i,1) += fy; + if (zstyle == ATOM) f(i,2) = d_efield(i,2); + else if (zstyle) f(i,2) += fz; + //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; } } @@ -85,3 +201,4 @@ template class FixEfieldKokkos; template class FixEfieldKokkos; #endif } + diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index e5171ce6f5..8d8d2ee97a 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -13,9 +13,9 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(efield/kk,FixFixEfieldKokkos); -FixStyle(efield/kk/device,FixFixEfieldKokkos); -FixStyle(efield/kk/host,FixFixEfieldKokkos); +FixStyle(efield/kk,FixEfieldKokkos); +FixStyle(efield/kk/device,FixEfieldKokkos); +FixStyle(efield/kk/host,FixEfieldKokkos); // clang-format on #else @@ -28,25 +28,58 @@ FixStyle(efield/kk/host,FixFixEfieldKokkos); namespace LAMMPS_NS { +struct e_double_4 { + double d0, d1, d2, d3; + KOKKOS_INLINE_FUNCTION + e_double_4() { + d0 = d1 = d2 = d3 = 0.0; + } + KOKKOS_INLINE_FUNCTION + e_double_4& operator+=(const e_double_4 &rhs) { + d0 += rhs.d0; + d1 += rhs.d1; + d2 += rhs.d2; + d3 += rhs.d3; + return *this; + } +}; +typedef e_double_4 double_4; + +struct TagFixEfieldConstant{}; + +struct TagFixEfieldNonConstant{}; + template class FixEfieldKokkos : public FixEfield { - public: - FixEfieldKokkos(class LAMMPS *, int, char **); + public: + typedef DeviceType device_type; + typedef double_4 value_type; + typedef ArrayTypes AT; - void post_force(int) override; + FixEfieldKokkos(class LAMMPS *, int, char **); + ~FixEfieldKokkos() override; + void init() override; + void post_force(int) override; - KOKKOS_INLINE_FUNCTION - void operator()(const int, double &) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEfieldConstant, const int&, double_4&) const; - private: - typename ArrayTypes::t_x_array x; - typename ArrayTypes::t_f_array f; - typename ArrayTypes::t_int_1d type; - typename ArrayTypes::t_int_1d mask; - typename ArrayTypes::t_float_1d_randomread q; + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEfieldNonConstant, const int&, double_4&) const; + + private: + DAT::tdual_ffloat_2d k_efield; + typename AT::t_ffloat_2d_randomread d_efield; + typename AT::t_int_1d d_match; + + typename AT::t_x_array_randomread x; + typename AT::t_float_1d_randomread q; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread mask; }; -} // namespace LAMMPS_NS +} + +#endif +#endif -#endif // LMP_FIX_EFIELD_KOKKOS_H -#endif // FIX_CLASS diff --git a/src/fix_efield.cpp b/src/fix_efield.cpp index d01a498d39..23277f8af3 100644 --- a/src/fix_efield.cpp +++ b/src/fix_efield.cpp @@ -129,6 +129,8 @@ FixEfield::FixEfield(LAMMPS *lmp, int narg, char **arg) : FixEfield::~FixEfield() { + if (copymode) return; + delete[] xstr; delete[] ystr; delete[] zstr; From 34c398dd372a5eae6ecb53a4fa10a2bf2e0cdad0 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Wed, 2 Aug 2023 06:59:24 -0500 Subject: [PATCH 040/417] Tried two ways of doing parallel reduce for fsum --- src/KOKKOS/fix_efield_kokkos.cpp | 75 +++++++++++++++++++++++++++++--- src/KOKKOS/fix_efield_kokkos.h | 1 + 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index fc84967e02..d4ef6dc3f2 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -17,7 +17,7 @@ #include "atom_kokkos.h" #include "update.h" #include "modify.h" -#include "domain.h" +#include "domain_kokkos.h" #include "region.h" #include "input.h" #include "variable.h" @@ -77,10 +77,11 @@ void FixEfieldKokkos::init() template void FixEfieldKokkos::post_force(int /*vflag*/) { - atomKK->sync(execution_space, F_MASK | Q_MASK | MASK_MASK); + atomKK->sync(execution_space, F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); f = atomKK->k_f.view(); q = atomKK->k_q.view(); + image = atomKK->k_image.view(); mask = atomKK->k_mask.view(); int nlocal = atom->nlocal; @@ -113,7 +114,50 @@ void FixEfieldKokkos::post_force(int /*vflag*/) if (varflag == CONSTANT) { copymode = 1; - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + + { + // local variables for lambda capture + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + auto l_ex = ex; + auto l_ey = ey; + auto l_ez = ez; + + auto l_x = x; + auto l_q = q; + auto l_f = f; + auto l_mask = mask; + auto l_image = image; + auto l_groupbit = groupbit; + + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), + LAMMPS_LAMBDA(int i, double_4& fsum_kk) { + if (l_mask[i] & l_groupbit) { + + Few x_i; + x_i[0] = l_x(i,0); + x_i[1] = l_x(i,1); + x_i[2] = l_x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,l_image(i)); + auto qtmp = l_q(i); + auto fx = qtmp * l_ex; + auto fy = qtmp * l_ey; + auto fz = qtmp * l_ez; + l_f(i,0) += fx; + l_f(i,1) += fy; + l_f(i,2) += fz; + + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; + } + }, fsum_kk); + + } + copymode = 0; // variable force, wrap with clear/add @@ -159,6 +203,14 @@ KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { if (mask[i] & groupbit) { if (region && !d_match[i]) return; + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + Few x_i; + x_i[0] = x(i,0); + x_i[1] = x(i,1); + x_i[2] = x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); const F_FLOAT qtmp = q[i]; const F_FLOAT fx = qtmp * ex; const F_FLOAT fy = qtmp * ey; @@ -166,7 +218,8 @@ void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, f(i,0) += fx; f(i,1) += fy; f(i,2) += fz; - //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; @@ -176,19 +229,27 @@ void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, template KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int &i, double_4& fsum_kk) const { + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; if (mask[i] & groupbit) { if (region && !d_match[i]) return; + Few x_i; + x_i[0] = x(i,0); + x_i[1] = x(i,1); + x_i[2] = x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); const F_FLOAT qtmp = q[i]; const F_FLOAT fx = qtmp * ex; const F_FLOAT fy = qtmp * ey; const F_FLOAT fz = qtmp * ez; if (xstyle == ATOM) f(i,0) += d_efield(i,0); else if (xstyle) f(i,0) += fx; - if (ystyle == ATOM) f(i,1) = d_efield(i,1); + if (ystyle == ATOM) f(i,1) += d_efield(i,1); else if (ystyle) f(i,1) += fy; - if (zstyle == ATOM) f(i,2) = d_efield(i,2); + if (zstyle == ATOM) f(i,2) += d_efield(i,2); else if (zstyle) f(i,2) += fz; - //fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index 8d8d2ee97a..d159473d1d 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -75,6 +75,7 @@ class FixEfieldKokkos : public FixEfield { typename AT::t_x_array_randomread x; typename AT::t_float_1d_randomread q; typename AT::t_f_array f; + typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; }; From bc6fcdc61a550b645b25f12138a3bb4022153c9a Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Fri, 4 Aug 2023 08:49:27 -0700 Subject: [PATCH 041/417] Applying triclinic neighbor fixes to intel package. --- src/INTEL/fix_intel.cpp | 2 + src/INTEL/npair_halffull_newton_intel.cpp | 66 ++++++++++---- .../npair_halffull_newton_trim_intel.cpp | 87 ++++++++++++++----- src/INTEL/npair_intel.cpp | 40 +++++++-- 4 files changed, 144 insertions(+), 51 deletions(-) diff --git a/src/INTEL/fix_intel.cpp b/src/INTEL/fix_intel.cpp index 4c46608677..8396904ffd 100644 --- a/src/INTEL/fix_intel.cpp +++ b/src/INTEL/fix_intel.cpp @@ -20,6 +20,7 @@ #include "fix_intel.h" #include "comm.h" +#include "domain.h" #include "error.h" #include "force.h" #include "neighbor.h" @@ -470,6 +471,7 @@ void FixIntel::pair_init_check(const bool cdmessage) int need_tag = 0; if (atom->molecular != Atom::ATOMIC || three_body_neighbor()) need_tag = 1; + if (domain->triclinic && force->newton_pair) need_tag = 1; // Clear buffers used for pair style char kmode[80]; diff --git a/src/INTEL/npair_halffull_newton_intel.cpp b/src/INTEL/npair_halffull_newton_intel.cpp index cd05d5f97a..adcf2527ab 100644 --- a/src/INTEL/npair_halffull_newton_intel.cpp +++ b/src/INTEL/npair_halffull_newton_intel.cpp @@ -20,7 +20,9 @@ #include "atom.h" #include "comm.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "modify.h" #include "my_page.h" #include "neigh_list.h" @@ -56,6 +58,9 @@ void NPairHalffullNewtonIntel::build_t(NeighList *list, const int * _noalias const numneigh_full = list->listfull->numneigh; const int ** _noalias const firstneigh_full = (const int ** const)list->listfull->firstneigh; // NOLINT + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; + #if defined(_OPENMP) #pragma omp parallel #endif @@ -82,25 +87,50 @@ void NPairHalffullNewtonIntel::build_t(NeighList *list, const int * _noalias const jlist = firstneigh_full[i]; const int jnum = numneigh_full[i]; - #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned - #pragma ivdep - #endif - for (int jj = 0; jj < jnum; jj++) { - const int joriginal = jlist[jj]; - const int j = joriginal & NEIGHMASK; - int addme = 1; - if (j < nlocal) { - if (i > j) addme = 0; - } else { - if (x[j].z < ztmp) addme = 0; - if (x[j].z == ztmp) { - if (x[j].y < ytmp) addme = 0; - if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + if (!triclinic) { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (x[j].z < ztmp) addme = 0; + if (x[j].z == ztmp) { + if (x[j].y < ytmp) addme = 0; + if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + } } + if (addme) + neighptr[n++] = joriginal; + } + } else { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (fabs(x[j].z-ztmp) > delta) { + if (x[j].z < ztmp) addme = 0; + } else if (fabs(x[j].y-ytmp) > delta) { + if (x[j].y < ytmp) addme = 0; + } else { + if (x[j].x < xtmp) addme = 0; + } + } + if (addme) + neighptr[n++] = joriginal; } - if (addme) - neighptr[n++] = joriginal; } ilist[ii] = i; @@ -203,7 +233,7 @@ void NPairHalffullNewtonIntel::build_t3(NeighList *list, int *numhalf) void NPairHalffullNewtonIntel::build(NeighList *list) { - if (_fix->three_body_neighbor() == 0) { + if (_fix->three_body_neighbor() == 0 || domain->triclinic) { if (_fix->precision() == FixIntel::PREC_MODE_MIXED) build_t(list, _fix->get_mixed_buffers()); else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) diff --git a/src/INTEL/npair_halffull_newton_trim_intel.cpp b/src/INTEL/npair_halffull_newton_trim_intel.cpp index e38375f750..34b9b20e9c 100644 --- a/src/INTEL/npair_halffull_newton_trim_intel.cpp +++ b/src/INTEL/npair_halffull_newton_trim_intel.cpp @@ -20,7 +20,9 @@ #include "atom.h" #include "comm.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "modify.h" #include "my_page.h" #include "neigh_list.h" @@ -57,6 +59,8 @@ void NPairHalffullNewtonTrimIntel::build_t(NeighList *list, const int ** _noalias const firstneigh_full = (const int ** const)list->listfull->firstneigh; // NOLINT const flt_t cutsq_custom = cutoff_custom * cutoff_custom; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; #if defined(_OPENMP) #pragma omp parallel @@ -84,35 +88,70 @@ void NPairHalffullNewtonTrimIntel::build_t(NeighList *list, const int * _noalias const jlist = firstneigh_full[i]; const int jnum = numneigh_full[i]; - #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned - #pragma ivdep - #endif - for (int jj = 0; jj < jnum; jj++) { - const int joriginal = jlist[jj]; - const int j = joriginal & NEIGHMASK; - int addme = 1; - if (j < nlocal) { - if (i > j) addme = 0; - } else { - if (x[j].z < ztmp) addme = 0; - if (x[j].z == ztmp) { - if (x[j].y < ytmp) addme = 0; - if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + if (!triclinic) { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (x[j].z < ztmp) addme = 0; + if (x[j].z == ztmp) { + if (x[j].y < ytmp) addme = 0; + if (x[j].y == ytmp && x[j].x < xtmp) addme = 0; + } } + + // trim to shorter cutoff + + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + + if (rsq > cutsq_custom) addme = 0; + + if (addme) + neighptr[n++] = joriginal; } + } else { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + int addme = 1; + if (j < nlocal) { + if (i > j) addme = 0; + } else { + if (fabs(x[j].z-ztmp) > delta) { + if (x[j].z < ztmp) addme = 0; + } else if (fabs(x[j].y-ytmp) > delta) { + if (x[j].y < ytmp) addme = 0; + } else { + if (x[j].x < xtmp) addme = 0; + } + } - // trim to shorter cutoff + // trim to shorter cutoff - const flt_t delx = xtmp - x[j].x; - const flt_t dely = ytmp - x[j].y; - const flt_t delz = ztmp - x[j].z; - const flt_t rsq = delx * delx + dely * dely + delz * delz; + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; - if (rsq > cutsq_custom) addme = 0; + if (rsq > cutsq_custom) addme = 0; - if (addme) - neighptr[n++] = joriginal; + if (addme) + neighptr[n++] = joriginal; + } } ilist[ii] = i; @@ -235,7 +274,7 @@ void NPairHalffullNewtonTrimIntel::build_t3(NeighList *list, int *numhalf, void NPairHalffullNewtonTrimIntel::build(NeighList *list) { - if (_fix->three_body_neighbor() == 0) { + if (_fix->three_body_neighbor() == 0 || domain->triclinic) { if (_fix->precision() == FixIntel::PREC_MODE_MIXED) build_t(list, _fix->get_mixed_buffers()); else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) diff --git a/src/INTEL/npair_intel.cpp b/src/INTEL/npair_intel.cpp index 600109d7ae..dcfb66e05f 100644 --- a/src/INTEL/npair_intel.cpp +++ b/src/INTEL/npair_intel.cpp @@ -204,6 +204,8 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, } const int special_bound = sb; + const double delta = 0.01 * force->angstrom; + #ifdef _LMP_INTEL_OFFLOAD const int * _noalias const binhead = this->binhead; const int * _noalias const bins = this->bins; @@ -229,7 +231,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, in(ncache_stride,maxnbors,nthreads,maxspecial,nstencil,e_nall,offload) \ in(offload_end,separate_buffers,astart,aend,nlocal,molecular) \ in(ntypes,xperiodic,yperiodic,zperiodic,xprd_half,yprd_half,zprd_half) \ - in(pack_width,special_bound) \ + in(pack_width,special_bound,delta) \ out(overflow:length(5) alloc_if(0) free_if(0)) \ out(timer_compute:length(1) alloc_if(0) free_if(0)) \ signal(tag) @@ -331,7 +333,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, const flt_t ztmp = x[i].z; const int itype = x[i].w; tagint itag; - if (THREE) itag = tag[i]; + if (THREE || (TRI && !FULL)) itag = tag[i]; const int ioffset = ntypes * itype; const int ibin = atombin[i]; @@ -365,7 +367,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, ty[u] = x[j].y; tz[u] = x[j].z; tjtype[u] = x[j].w; - if (THREE) ttag[u] = tag[j]; + if (THREE || (TRI && !FULL)) ttag[u] = tag[j]; } if (FULL == 0 && TRI != 1) { @@ -486,12 +488,32 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, // Triclinic if (TRI) { - if (tz[u] < ztmp) addme = 0; - if (tz[u] == ztmp) { - if (ty[u] < ytmp) addme = 0; - if (ty[u] == ytmp) { - if (tx[u] < xtmp) addme = 0; - if (tx[u] == xtmp && j <= i) addme = 0; + if (FULL) { + if (tz[u] < ztmp) addme = 0; + if (tz[u] == ztmp) { + if (ty[u] < ytmp) addme = 0; + if (ty[u] == ytmp) { + if (tx[u] < xtmp) addme = 0; + if (tx[u] == xtmp && j <= i) addme = 0; + } + } + } else { + if (j <= i) addme = 0; + if (j >= nlocal) { + const tagint jtag = ttag[u]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) addme = 0; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) addme = 0; + } else { + if (fabs(tz[u]-ztmp) > delta) { + if (tz[u] < ztmp) addme = 0; + } else if (fabs(ty[u]-ytmp) > delta) { + if (ty[u] < ytmp) addme = 0; + } else { + if (tx[u] < xtmp) addme = 0; + } + } } } } From dbab5b69312a2d789f37973ce21873cc2e2757e4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 4 Aug 2023 22:24:48 -0400 Subject: [PATCH 042/417] possible workaround for unit test failure taken from: https://github.com/open-mpi/ompi/issues/9656 --- unittest/formats/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index 93ea2f3b32..58c797b6e6 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -41,6 +41,8 @@ set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${ add_executable(test_file_operations test_file_operations.cpp) target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock) add_test(NAME FileOperations COMMAND test_file_operations) +# try to mitigate possible OpenMPI bug +set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "OMPI_MCA_sharedfp=\"^sm\"") add_executable(test_dump_atom test_dump_atom.cpp) target_link_libraries(test_dump_atom PRIVATE lammps GTest::GMock) From dc8f17e8e6d75e795e93fd2b2d85e93324f6ec12 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 6 Aug 2023 00:04:46 -0500 Subject: [PATCH 043/417] Fixed bugs with missing x array, removed the () operator overloads because they require access to domain within the kernels --- src/KOKKOS/fix_efield_kokkos.cpp | 63 +++++++++++++++++++++++++++----- src/KOKKOS/fix_efield_kokkos.h | 4 +- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index d4ef6dc3f2..ecf4418cf6 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -77,8 +77,9 @@ void FixEfieldKokkos::init() template void FixEfieldKokkos::post_force(int /*vflag*/) { - atomKK->sync(execution_space, F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); + atomKK->sync(execution_space, X_MASK | F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); + x = atomKK->k_f.view(); f = atomKK->k_f.view(); q = atomKK->k_q.view(); image = atomKK->k_image.view(); @@ -132,10 +133,8 @@ void FixEfieldKokkos::post_force(int /*vflag*/) auto l_image = image; auto l_groupbit = groupbit; - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal), - LAMMPS_LAMBDA(int i, double_4& fsum_kk) { + Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double_4& fsum_kk) { if (l_mask[i] & l_groupbit) { - Few x_i; x_i[0] = l_x(i,0); x_i[1] = l_x(i,1); @@ -148,14 +147,12 @@ void FixEfieldKokkos::post_force(int /*vflag*/) l_f(i,0) += fx; l_f(i,1) += fy; l_f(i,2) += fz; - fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; } - }, fsum_kk); - + },fsum_kk); } copymode = 0; @@ -186,7 +183,53 @@ void FixEfieldKokkos::post_force(int /*vflag*/) } copymode = 1; - Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); + + { + // local variables for lambda capture + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + auto l_ex = ex; + auto l_ey = ey; + auto l_ez = ez; + auto l_d_efield = d_efield; + + auto l_x = x; + auto l_q = q; + auto l_f = f; + auto l_mask = mask; + auto l_image = image; + auto l_groupbit = groupbit; + auto l_xstyle = xstyle; + auto l_ystyle = ystyle; + auto l_zstyle = zstyle; + + Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double_4& fsum_kk) { + if (l_mask[i] & l_groupbit) { + Few x_i; + x_i[0] = l_x(i,0); + x_i[1] = l_x(i,1); + x_i[2] = l_x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,l_image(i)); + auto qtmp = l_q(i); + auto fx = qtmp * l_ex; + auto fy = qtmp * l_ey; + auto fz = qtmp * l_ez; + if (l_xstyle == ATOM) l_f(i,0) += l_d_efield(i,0); + else if (l_xstyle) l_f(i,0) += fx; + if (l_ystyle == ATOM) l_f(i,1) += l_d_efield(i,1); + else if (l_ystyle) l_f(i,1) += fy; + if (l_zstyle == ATOM) l_f(i,2) += l_d_efield(i,2); + else if (l_zstyle) l_f(i,2) += fz; + fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; + fsum_kk.d1 += fx; + fsum_kk.d2 += fy; + fsum_kk.d3 += fz; + } + },fsum_kk); + } + copymode = 0; } @@ -197,7 +240,7 @@ void FixEfieldKokkos::post_force(int /*vflag*/) fsum[2] = fsum_kk.d2; fsum[3] = fsum_kk.d3; } - +/* template KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { @@ -255,7 +298,7 @@ void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int fsum_kk.d3 += fz; } } - +*/ namespace LAMMPS_NS { template class FixEfieldKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index d159473d1d..2739d03ffc 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -60,13 +60,13 @@ class FixEfieldKokkos : public FixEfield { ~FixEfieldKokkos() override; void init() override; void post_force(int) override; - +/* KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldConstant, const int&, double_4&) const; KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldNonConstant, const int&, double_4&) const; - +*/ private: DAT::tdual_ffloat_2d k_efield; typename AT::t_ffloat_2d_randomread d_efield; From 4a8275446439aaaa0e859fbbe7fc53de9ac6c4b4 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 7 Aug 2023 00:30:32 -0500 Subject: [PATCH 044/417] Fixed an obvious bug with x --- src/KOKKOS/fix_efield_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index ecf4418cf6..1f29d1f809 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -79,7 +79,7 @@ void FixEfieldKokkos::post_force(int /*vflag*/) { atomKK->sync(execution_space, X_MASK | F_MASK | Q_MASK | IMAGE_MASK | MASK_MASK); - x = atomKK->k_f.view(); + x = atomKK->k_x.view(); f = atomKK->k_f.view(); q = atomKK->k_q.view(); image = atomKK->k_image.view(); From 7c17ea632c6fda6c367002b44c028a778624aee7 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Mon, 7 Aug 2023 12:09:44 +0200 Subject: [PATCH 045/417] Reverted changes to tau as a time constant. To be checked. --- src/fix_press_langevin.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index ec8f034181..2fad9e300f 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -75,6 +75,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Pressure and pistons period tau_p p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; + // p_mass[i] = 1e-3; p_fric[i] = 0.; @@ -88,6 +89,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Random value for each piston fran[i] = 0.0; f_piston[i] = 0.0; + dilation[i] = 0.0; } // process keywords @@ -364,9 +366,9 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // with alpha = Q/p_period // similar to fix_langevin formalism for (int i = 0; i < 6; i++) { - p_fric[i] = p_mass/p_period[i]; - gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); - gjfb[i] = 1./(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + // p_mass[i] = p_period[i]; // force->boltz*t_start*(atom->natoms + 1)*p_period[i]*p_period[i]; + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); } nrigid = 0; @@ -469,6 +471,8 @@ void FixPressLangevin::initial_integrate(int /* vflag */) // Compute new random term on pistons dynamics if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop-t_start); + // for (int i = 0; i < 6; i++) + // p_mass[i] = force->boltz*t_target*(atom->natoms + 1)*p_period[i]*p_period[i]; couple_beta(t_target); dt = update->dt; @@ -600,7 +604,7 @@ void FixPressLangevin::couple_beta(double t_target) int me = comm->me; for (int i=0; i<6; i++) - gamma[i] = sqrt(2.0*force->boltz*update->dt*p_fric[i]*t_target); + gamma[i] = sqrt(2.0*p_mass*force->boltz*update->dt/p_period[i]*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; @@ -806,7 +810,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - p_fric[i] * update->dt / 2.0 / p_mass) / (1.0 + p_fric[i] * update->dt / 2.0 / p_mass); - gjfb[i] = sqrt(1.0 + p_fric[i] * update->dt / 2.0 / p_mass); + gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); + gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); } } From 4ca32f0ceccedc2bee1c657038a72e0802c58605 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 7 Aug 2023 15:24:16 -0500 Subject: [PATCH 046/417] Added comments to the use of operators overloaded when accessing unwrap on the GPU (serial works fine) --- src/KOKKOS/fix_efield_kokkos.cpp | 14 +++++++++----- src/KOKKOS/fix_efield_kokkos.h | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index 1f29d1f809..bbf106f515 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -115,6 +115,8 @@ void FixEfieldKokkos::post_force(int /*vflag*/) if (varflag == CONSTANT) { copymode = 1; + + // It would be more concise to use the operators below, but there is still an issue with unwrap (TODO below) //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); { @@ -183,8 +185,8 @@ void FixEfieldKokkos::post_force(int /*vflag*/) } copymode = 1; + // It would be more concise to use the operators below, but there is still an issue with unwrap (TODO below) //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,fsum_kk); - { // local variables for lambda capture auto prd = Few(domain->prd); @@ -240,12 +242,13 @@ void FixEfieldKokkos::post_force(int /*vflag*/) fsum[2] = fsum_kk.d2; fsum[3] = fsum_kk.d3; } -/* + template KOKKOS_INLINE_FUNCTION void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, double_4& fsum_kk) const { if (mask[i] & groupbit) { if (region && !d_match[i]) return; + auto prd = Few(domain->prd); auto h = Few(domain->h); auto triclinic = domain->triclinic; @@ -254,14 +257,14 @@ void FixEfieldKokkos::operator()(TagFixEfieldConstant, const int &i, x_i[1] = x(i,1); x_i[2] = x(i,2); auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); - const F_FLOAT qtmp = q[i]; + const F_FLOAT qtmp = q(i); const F_FLOAT fx = qtmp * ex; const F_FLOAT fy = qtmp * ey; const F_FLOAT fz = qtmp * ez; f(i,0) += fx; f(i,1) += fy; f(i,2) += fz; - + // TODO: access to unwrap below crashes fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; @@ -292,13 +295,14 @@ void FixEfieldKokkos::operator()(TagFixEfieldNonConstant, const int else if (ystyle) f(i,1) += fy; if (zstyle == ATOM) f(i,2) += d_efield(i,2); else if (zstyle) f(i,2) += fz; + // TODO: access to unwrap below crashes fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; fsum_kk.d2 += fy; fsum_kk.d3 += fz; } } -*/ + namespace LAMMPS_NS { template class FixEfieldKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_efield_kokkos.h b/src/KOKKOS/fix_efield_kokkos.h index 2739d03ffc..d159473d1d 100644 --- a/src/KOKKOS/fix_efield_kokkos.h +++ b/src/KOKKOS/fix_efield_kokkos.h @@ -60,13 +60,13 @@ class FixEfieldKokkos : public FixEfield { ~FixEfieldKokkos() override; void init() override; void post_force(int) override; -/* + KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldConstant, const int&, double_4&) const; KOKKOS_INLINE_FUNCTION void operator()(TagFixEfieldNonConstant, const int&, double_4&) const; -*/ + private: DAT::tdual_ffloat_2d k_efield; typename AT::t_ffloat_2d_randomread d_efield; From 6ff85cab7f3bc8cec12470fadd675945561a0c39 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 10 Aug 2023 00:34:52 -0500 Subject: [PATCH 047/417] Adding fix spring/self/kk, needed to add maxatom to fix spring/self, may need resize xoriginal as well --- src/fix_spring_self.cpp | 1 + src/fix_spring_self.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fix_spring_self.cpp b/src/fix_spring_self.cpp index 550b3afc4d..31f54caef2 100644 --- a/src/fix_spring_self.cpp +++ b/src/fix_spring_self.cpp @@ -73,6 +73,7 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : // register with Atom class xoriginal = nullptr; + maxatom = atom->nmax; FixSpringSelf::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); diff --git a/src/fix_spring_self.h b/src/fix_spring_self.h index 59dba78e43..24a03aa92e 100644 --- a/src/fix_spring_self.h +++ b/src/fix_spring_self.h @@ -47,11 +47,12 @@ class FixSpringSelf : public Fix { int size_restart(int) override; int maxsize_restart() override; - private: + protected: double k, espring; double **xoriginal; // original coords of atoms int xflag, yflag, zflag; int ilevel_respa; + int maxatom; }; } // namespace LAMMPS_NS From 4bb3ecd09c1a88768e556be76f8707a685c33680 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 10 Aug 2023 00:36:33 -0500 Subject: [PATCH 048/417] Added the fix spring/self/kk source files --- src/KOKKOS/fix_spring_self_kokkos.cpp | 152 ++++++++++++++++++++++++++ src/KOKKOS/fix_spring_self_kokkos.h | 57 ++++++++++ 2 files changed, 209 insertions(+) create mode 100644 src/KOKKOS/fix_spring_self_kokkos.cpp create mode 100644 src/KOKKOS/fix_spring_self_kokkos.h diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp new file mode 100644 index 0000000000..fe6d3a3d50 --- /dev/null +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -0,0 +1,152 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "fix_spring_self_kokkos.h" + +#include "atom_kokkos.h" +#include "update.h" +#include "modify.h" +#include "domain_kokkos.h" +#include "region.h" +#include "input.h" +#include "variable.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "kokkos_base.h" + +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +template +FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char **arg) : + FixSpringSelf(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + maxatom = atom->nmax; + memory->destroy(xoriginal); + memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"spring/self:xoriginal"); + d_xoriginal = k_xoriginal.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +FixSpringSelfKokkos::~FixSpringSelfKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_xoriginal,xoriginal); + xoriginal = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::init() +{ + FixSpringSelf::init(); + + if (utils::strmatch(update->integrate_style,"^respa")) + error->all(FLERR,"Cannot (yet) use respa with Kokkos"); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::post_force(int /*vflag*/) +{ + atomKK->sync(execution_space, X_MASK | F_MASK | MASK_MASK); + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + image = atomKK->k_image.view(); + mask = atomKK->k_mask.view(); + + int nlocal = atom->nlocal; + + // reallocate xoriginal array if necessary + + if (atom->nmax > maxatom) { + maxatom = atom->nmax; + memoryKK->destroy_kokkos(k_xoriginal,xoriginal); + memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"fix_spring/self:xoriginal"); + d_xoriginal = k_xoriginal.view(); + } + + double espring_kk; + + + copymode = 1; + //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this, espring_kk); + { + // local variables for lambda capture + auto prd = Few(domain->prd); + auto h = Few(domain->h); + auto triclinic = domain->triclinic; + auto l_xflag = xflag; + auto l_yflag = yflag; + auto l_zflag = zflag; + auto l_k = k; + auto l_x = x; + auto l_xoriginal = d_xoriginal; + auto l_f = f; + auto l_mask = mask; + auto l_image = image; + auto l_groupbit = groupbit; + + Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double& espring_kk) { + if (l_mask[i] & l_groupbit) { + Few x_i; + x_i[0] = l_x(i,0); + x_i[1] = l_x(i,1); + x_i[2] = l_x(i,2); + auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,l_image(i)); + auto dx = unwrap[0] - l_xoriginal(i, 0); + auto dy = unwrap[1] - l_xoriginal(i, 1); + auto dz = unwrap[2] - l_xoriginal(i, 2); + if (!l_xflag) dx = 0.0; + if (!l_yflag) dy = 0.0; + if (!l_zflag) dz = 0.0; + l_f(i,0) -= l_k*dx; + l_f(i,1) -= l_k*dy; + l_f(i,2) -= l_k*dz; + espring_kk += l_k * (dx*dx + dy*dy + dz*dz); + } + },espring_kk); + } + + copymode = 0; + + atomKK->modified(execution_space, F_MASK); + + espring = 0.5*espring_kk; +} + +namespace LAMMPS_NS { +template class FixSpringSelfKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixSpringSelfKokkos; +#endif +} + diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h new file mode 100644 index 0000000000..58dcbc525e --- /dev/null +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -0,0 +1,57 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 +// clang-format off +FixStyle(spring/self/kk,FixSpringSelfKokkos); +FixStyle(spring/self/kk/device,FixSpringSelfKokkos); +FixStyle(spring/self/kk/host,FixSpringSelfKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_SPRING_SELF_KOKKOS_H +#define LMP_FIX_SPRING_SELF_KOKKOS_H + +#include "fix_spring_self.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixSpringSelfKokkos : public FixSpringSelf { + public: + typedef DeviceType device_type; + typedef double value_type; + typedef ArrayTypes AT; + + FixSpringSelfKokkos(class LAMMPS *, int, char **); + ~FixSpringSelfKokkos() override; + void init() override; + void post_force(int) override; + + private: + DAT::tdual_ffloat_2d k_xoriginal; + typename AT::t_ffloat_2d_randomread d_xoriginal; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_imageint_1d_randomread image; + typename AT::t_int_1d_randomread mask; +}; + +} + +#endif +#endif + From a24eccf95d0abd036823ff5bbe45839ca9d8a907 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Fri, 11 Aug 2023 09:43:28 -0500 Subject: [PATCH 049/417] Removed maxatom from fix spring/self, need to work on exchange for xoriginal on spring/self/kk --- src/KOKKOS/fix_spring_self_kokkos.cpp | 12 +----------- src/fix_spring_self.cpp | 3 ++- src/fix_spring_self.h | 1 - 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index fe6d3a3d50..5031c0641b 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -43,9 +43,8 @@ FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - maxatom = atom->nmax; memory->destroy(xoriginal); - memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"spring/self:xoriginal"); + memoryKK->create_kokkos(k_xoriginal,xoriginal,atom->nmax,3,"spring/self:xoriginal"); d_xoriginal = k_xoriginal.view(); } @@ -85,15 +84,6 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) int nlocal = atom->nlocal; - // reallocate xoriginal array if necessary - - if (atom->nmax > maxatom) { - maxatom = atom->nmax; - memoryKK->destroy_kokkos(k_xoriginal,xoriginal); - memoryKK->create_kokkos(k_xoriginal,xoriginal,maxatom,3,"fix_spring/self:xoriginal"); - d_xoriginal = k_xoriginal.view(); - } - double espring_kk; diff --git a/src/fix_spring_self.cpp b/src/fix_spring_self.cpp index 31f54caef2..df00a2ba8c 100644 --- a/src/fix_spring_self.cpp +++ b/src/fix_spring_self.cpp @@ -73,7 +73,6 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : // register with Atom class xoriginal = nullptr; - maxatom = atom->nmax; FixSpringSelf::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); @@ -97,6 +96,8 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : FixSpringSelf::~FixSpringSelf() { + if (copymode) return; + // unregister callbacks to this fix from Atom class atom->delete_callback(id,Atom::GROW); diff --git a/src/fix_spring_self.h b/src/fix_spring_self.h index 24a03aa92e..f13f2be918 100644 --- a/src/fix_spring_self.h +++ b/src/fix_spring_self.h @@ -52,7 +52,6 @@ class FixSpringSelf : public Fix { double **xoriginal; // original coords of atoms int xflag, yflag, zflag; int ilevel_respa; - int maxatom; }; } // namespace LAMMPS_NS From ca9924035bbb90c5d6c9cf41db40a6a10f293ec5 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 12 Aug 2023 01:19:43 -0500 Subject: [PATCH 050/417] Working on pack/unpack exchange for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 143 ++++++++++++++++++++++++++ src/KOKKOS/fix_spring_self_kokkos.h | 53 +++++++++- 2 files changed, 193 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 5031c0641b..4e89ede2ba 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -133,6 +133,149 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) espring = 0.5*espring_kk; } +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixSpringSelfKokkos::pack_exchange_item(const int &mysend, int &offset, const bool &final) const +{ + const int i = d_exchange_sendlist(mysend); + + d_buf[mysend] = nsend + offset; + int m = nsend + offset; + d_buf[m++] = d_xoriginal(i,0); + d_buf[m++] = d_xoriginal(i,1); + d_buf[m++] = d_xoriginal(i,2); + if (mysend == nsend-1) d_count() = m; + offset = m - nsend; + + const int j = d_copylist(mysend); + if (j > -1) { + d_xoriginal(i,0) = d_xoriginal(j,0); + d_xoriginal(i,1) = d_xoriginal(j,1); + d_xoriginal(i,2) = d_xoriginal(j,2); + } +} + +/* ---------------------------------------------------------------------- */ + +template +int FixSpringSelfKokkos::pack_exchange_kokkos( + const int &nsend, DAT::tdual_xfloat_2d &k_buf, + DAT::tdual_int_1d k_exchange_sendlist, DAT::tdual_int_1d k_copylist, + ExecutionSpace space) +{ + + k_buf.sync(); + k_copylist.sync(); + k_exchange_sendlist.sync(); + + d_buf = typename ArrayTypes::t_xfloat_1d_um( + k_buf.template view().data(), + k_buf.extent(0)*k_buf.extent(1)); + d_copylist = k_copylist.view(); + d_exchange_sendlist = k_exchange_sendlist.view(); + this->nsend = nsend; + + + k_xoriginal.template sync(); + + Kokkos::deep_copy(d_count,0); + + copymode = 1; + + FixSpringSelfKokkosPackExchangeFunctor pack_exchange_functor(this); + Kokkos::parallel_scan(nsend,pack_exchange_functor); + + copymode = 0; + + k_buf.modify(); + + if (space == Host) k_buf.sync(); + else k_buf.sync(); + + k_xoriginal.template modify(); + + Kokkos::deep_copy(h_count,d_count); + + return h_count(); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixSpringSelfKokkos::operator()(TagFixSpringSelfUnpackExchange, const int &i) const +{ + int index = d_indices(i); + + if (index > -1) { + int m = d_buf[i]; + + d_xoriginal(index,0) = static_cast (d_buf[m++]); + d_xoriginal(index,1) = static_cast (d_buf[m++]); + d_xoriginal(index,2) = static_cast (d_buf[m++]); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::unpack_exchange_kokkos( + DAT::tdual_xfloat_2d &k_buf, DAT::tdual_int_1d &k_indices, int nrecv, + ExecutionSpace /*space*/) +{ + k_buf.sync(); + k_indices.sync(); + + d_buf = typename ArrayTypes::t_xfloat_1d_um( + k_buf.template view().data(), + k_buf.extent(0)*k_buf.extent(1)); + d_indices = k_indices.view(); + + k_xoriginal.template sync(); + + copymode = 1; + + Kokkos::parallel_for(Kokkos::RangePolicy(0,nrecv),*this); + + copymode = 0; + + k_xoriginal.template modify(); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixSpringSelfKokkos::pack_exchange(int i, double *buf) +{ + k_xoriginal.sync_host(); + + int m = FixSpringSelf::pack_exchange(i,buf); + + k_xoriginal.modify_host(); + + return m; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based arrays from exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixSpringSelfKokkos::unpack_exchange(int nlocal, double *buf) +{ + k_xoriginal.sync_host(); + + int m = FixSpringSelf::unpack_exchange(nlocal,buf); + + k_xoriginal.modify_host(); + + return m; +} + namespace LAMMPS_NS { template class FixSpringSelfKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 58dcbc525e..b69d4edb4a 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -25,11 +25,14 @@ FixStyle(spring/self/kk/host,FixSpringSelfKokkos); #include "fix_spring_self.h" #include "kokkos_type.h" +#include "kokkos_base.h" namespace LAMMPS_NS { +struct TagFixSpringSelfUnpackExchange{}; + template -class FixSpringSelfKokkos : public FixSpringSelf { +class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { public: typedef DeviceType device_type; typedef double value_type; @@ -40,14 +43,58 @@ class FixSpringSelfKokkos : public FixSpringSelf { void init() override; void post_force(int) override; - private: + KOKKOS_INLINE_FUNCTION + void pack_exchange_item(const int&, int &, const bool &) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixSpringSelfUnpackExchange, const int&) const; + + int pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf, + DAT::tdual_int_1d k_sendlist, + DAT::tdual_int_1d k_copylist, + ExecutionSpace space) override; + + void unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, + DAT::tdual_int_1d &indices,int nrecv, + ExecutionSpace space) override; + + + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + + protected: DAT::tdual_ffloat_2d k_xoriginal; - typename AT::t_ffloat_2d_randomread d_xoriginal; + typename AT::t_ffloat_2d d_xoriginal; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; + + int nsend; + + typename AT::t_int_2d d_sendlist; + typename AT::t_xfloat_1d_um d_buf; + + typename AT::t_int_1d d_exchange_sendlist; + typename AT::t_int_1d d_copylist; + typename AT::t_int_1d d_indices; + + typename AT::t_int_scalar d_count; + HAT::t_int_scalar h_count; + +}; + +template +struct FixSpringSelfKokkosPackExchangeFunctor { + typedef DeviceType device_type; + typedef int value_type; + FixSpringSelfKokkos c; + FixSpringSelfKokkosPackExchangeFunctor(FixSpringSelfKokkos* c_ptr):c(*c_ptr) {}; + KOKKOS_INLINE_FUNCTION + void operator()(const int &i, int &offset, const bool &final) const { + c.pack_exchange_item(i, offset, final); + } }; } From ea965d3b2681d6d922edb27e7a0b98859d6c6fb3 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 13 Aug 2023 23:40:53 -0500 Subject: [PATCH 051/417] Working on exchange comm on device, and grow arrays for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 21 +++++++++++++++++++-- src/KOKKOS/fix_spring_self_kokkos.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 4e89ede2ba..8a576e2dea 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -38,14 +38,20 @@ FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char FixSpringSelf(lmp, narg, arg) { kokkosable = 1; + exchange_comm_device = 1; + maxexchange = 6; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; memory->destroy(xoriginal); - memoryKK->create_kokkos(k_xoriginal,xoriginal,atom->nmax,3,"spring/self:xoriginal"); - d_xoriginal = k_xoriginal.view(); + + int nmax = atom->nmax; + grow_arrays(nmax); + + d_count = typename AT::t_int_scalar("fix_shake:count"); + h_count = Kokkos::create_mirror_view(d_count); } /* ---------------------------------------------------------------------- */ @@ -133,6 +139,17 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) espring = 0.5*espring_kk; } +/* ---------------------------------------------------------------------- + allocate local atom-based arrays +------------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::grow_arrays(int nmax) +{ + memoryKK->grow_kokkos(k_xoriginal,xoriginal,nmax,3,"spring/self:xoriginal"); + d_xoriginal = k_xoriginal.view(); +} + /* ---------------------------------------------------------------------- */ template diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index b69d4edb4a..30b9eaf40a 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -41,6 +41,7 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { FixSpringSelfKokkos(class LAMMPS *, int, char **); ~FixSpringSelfKokkos() override; void init() override; + void grow_arrays(int) override; void post_force(int) override; KOKKOS_INLINE_FUNCTION From 3eb8fd219afbb97303efd4fcc5dcd85958dd7954 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 16 Aug 2023 16:19:11 -0600 Subject: [PATCH 052/417] update of a Howto_output doc page --- doc/src/Howto_output.rst | 140 ++++++++++++++++++++++++++------------- 1 file changed, 93 insertions(+), 47 deletions(-) diff --git a/doc/src/Howto_output.rst b/doc/src/Howto_output.rst index 851b7703fd..6fcd36ab56 100644 --- a/doc/src/Howto_output.rst +++ b/doc/src/Howto_output.rst @@ -1,7 +1,7 @@ Output from LAMMPS (thermo, dumps, computes, fixes, variables) ============================================================== -There are four basic kinds of LAMMPS output: +There are four basic forms of LAMMPS output: * :doc:`Thermodynamic output `, which is a list of quantities printed every few timesteps to the screen and logfile. @@ -20,18 +20,17 @@ output files, depending on what :doc:`dump ` and :doc:`fix ` commands you specify. As discussed below, LAMMPS gives you a variety of ways to determine -what quantities are computed and printed when the thermodynamics, +what quantities are calculated and printed when the thermodynamics, dump, or fix commands listed above perform output. Throughout this discussion, note that users can also :doc:`add their own computes and -fixes to LAMMPS ` which can then generate values that can then -be output with these commands. +fixes to LAMMPS ` which can generate values that can then be +output with these commands. The following subsections discuss different LAMMPS commands related to output and the kind of data they operate on and produce: * :ref:`Global/per-atom/local/per-grid data ` * :ref:`Scalar/vector/array data ` -* :ref:`Per-grid data ` * :ref:`Disambiguation ` * :ref:`Thermodynamic output ` * :ref:`Dump file output ` @@ -48,34 +47,65 @@ to output and the kind of data they operate on and produce: Global/per-atom/local/per-grid data ----------------------------------- -Various output-related commands work with four different styles of +Various output-related commands work with four different "styles" of data: global, per-atom, local, and per-grid. A global datum is one or more system-wide values, e.g. the temperature of the system. A per-atom datum is one or more values per atom, e.g. the kinetic energy of each atom. Local datums are calculated by each processor based on -the atoms it owns, but there may be zero or more per atom, e.g. a list +the atoms it owns, and there may be zero or more per atom, e.g. a list of bond distances. A per-grid datum is one or more values per grid cell, for a grid which -overlays the simulation domain. The grid cells and the data they -store are distributed across processors; each processor owns the grid -cells whose center point falls within its subdomain. +overlays the simulation domain. Similar to atoms and per-atom data, +the grid cells and the data they store are distributed across +processors; each processor owns the grid cells whose center points +fall within its subdomain. .. _scalar: Scalar/vector/array data ------------------------ -Global, per-atom, and local datums can come in three kinds: a single -scalar value, a vector of values, or a 2d array of values. The doc -page for a "compute" or "fix" or "variable" that generates data will -specify both the style and kind of data it produces, e.g. a per-atom -vector. +Global, per-atom, local, and per-grid datums can come in three +"kinds": a single scalar value, a vector of values, or a 2d array of +values. More specifically these are the valid kinds for each style: -When a quantity is accessed, as in many of the output commands -discussed below, it can be referenced via the following bracket -notation, where ID in this case is the ID of a compute. The leading -"c\_" would be replaced by "f\_" for a fix, or "v\_" for a variable: +* global scalar +* global vector +* global array +* per-atom vector +* per-atom array +* local vector +* local array +* per-grid vector +* per-grid array + +A per-atom vector means a single value per atom; the "vector" is the +length of the number of atoms. A per-atom array means multiple values +per atom. Similarly a local vector or array means one or multiple +values per entity (e.g. per bond in the system). And a per-grid +vector or array means one or multiple values per grid cell. + +The doc page for a compute or fix or variable that generates data will +specify both the styles and kinds of data it produces, e.g. a per-atom +vector. Note that a compute or fix may generate multiple styles and +kinds of output. However, for per-atom data only a vector or array is +output, never both. Likewise for per-local and per-grid data. An +example of a fix which generates multiple styles and kinds of data is +the :doc:`fix mdi/qm ` command. It outputs a global +scalar, global vector, and per-atom array for the quantum mechanical +energy and virial of the system and forces on each atom. + +By contrast, different variable styles generate only a single kind of +data: a global scalar for an equal-style variable, global vector for a +vector-style variable, and a per-atom vector for an atom-style +variable. + +When data is accessed by another command, as in many of the output +commands discussed below, it can be referenced via the following +bracket notation, where ID in this case is the ID of a compute. The +leading "c\_" would be replaced by "f\_" for a fix, or "v\_" for a +variable (and ID would be the name of the variable): +-------------+--------------------------------------------+ | c_ID | entire scalar, vector, or array | @@ -85,40 +115,56 @@ notation, where ID in this case is the ID of a compute. The leading | c_ID[I][J] | one element of array | +-------------+--------------------------------------------+ -In other words, using one bracket reduces the dimension of the data -once (vector -> scalar, array -> vector). Using two brackets reduces -the dimension twice (array -> scalar). Thus a command that uses -scalar values as input can typically also process elements of a vector -or array. +Note that using one bracket reduces the dimension of the data once +(vector -> scalar, array -> vector). Using two brackets reduces the +dimension twice (array -> scalar). Thus a command that uses scalar +values as input can also conceptually operate on an element of a +vector or array. -.. _grid: - -Per-grid data ------------------------- - -Per-grid data can come in two kinds: a vector of values (one per grid -cekk), or a 2d array of values (multiple values per grid ckk). The -doc page for a "compute" or "fix" that generates data will specify -names for both the grid(s) and datum(s) it produces, e.g. per-grid -vectors or arrays, which can be referenced by other commands. See the -:doc:`Howto grid ` doc page for more details. +Per-grid vectors or arrays are accessed similarly, except that the ID +for the compute or fix includes a grid name and a data name. This is +because a fix or compute can create multiple grids (of different +sizes) and multiple sets of data (for each grid). The fix or compute +defines names for each grid and for each data set, so that all of them +can be accessed by other commands. See the :doc:`Howto grid +` doc page for more details. .. _disambiguation: Disambiguation -------------- -Some computes and fixes produce data in multiple styles, e.g. a global -scalar and a per-atom vector. Usually the context in which the input -script references the data determines which style is meant. Example: -if a compute provides both a global scalar and a per-atom vector, the -former will be accessed by using ``c_ID`` in an equal-style variable, -while the latter will be accessed by using ``c_ID`` in an atom-style -variable. Note that atom-style variable formulas can also access -global scalars, but in this case it is not possible to do this -directly because of the ambiguity. Instead, an equal-style variable -can be defined which accesses the global scalar, and that variable can -be used in the atom-style variable formula in place of ``c_ID``. +When a compute or fix produces data in multiple styles, e.g. global +and per-atom, a reference to the data can sometimes be ambiguous. +Usually the context in which the input script references the data +determines which style is meant. + +For example, if a compute outputs a global vector and a per-atom +array, an element of the global vector will be accessed by using +``c_ID[I]`` in :doc:`thermodynamic output `, while a +column of the per-atom array will be accessed by using ``c_ID[I]`` in +a :doc:`dump custom ` command. + +However, if a :doc:`atom-style variable ` references +``c_ID[I]``, then it could be intended to refer to a single element of +the global vector or a column of the per-atom array. The doc page for +any command that has a potential ambiguity (variables are the most +common) will explain how to resolve the ambiguity. + +In this case, an atom-style variables references per-atom data if it +exists. If access to an element of a global vector is needed (as in +this example), an equal-style variable which references the value can +be defined and used in the atom-style variable formula instead. + +Similarly, :doc:`thermodynamic output ` can only +reference global data from a compute or fix. But you can indirectly +access per-atom data as follows. The reference ``c_ID[245][2]`` for +the ID of a :doc:`compute displace/atom ` +command, refers to the y-component of displacement for the atom with +ID 245. While you cannot use that reference directly in the +:doc:`thermo_style ` command, you can use it an +equal-style variable formula, and then reference the variable in +thermodynamic output. .. _thermo: @@ -389,7 +435,7 @@ output and input data types must match, e.g. global/per-atom/local data and scalar/vector/array data. Also note that, as described above, when a command takes a scalar as -input, that could be an element of a vector or array. Likewise a +input, that could also be an element of a vector or array. Likewise a vector input could be a column of an array. +--------------------------------------------------------+----------------------------------------------+----------------------------------------------------+ From 0d739439c7cebf64716561022151921c04cd35c8 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 17 Aug 2023 12:47:48 -0600 Subject: [PATCH 053/417] changes to compute voronoi/atom --- doc/src/compute_voronoi_atom.rst | 126 ++++++++++++--------------- src/VORONOI/compute_voronoi_atom.cpp | 37 ++++---- 2 files changed, 75 insertions(+), 88 deletions(-) diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 274be1b702..3e67bb6cbf 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * voronoi/atom = style name of this compute command * zero or more keyword/value pairs may be appended -* keyword = *only_group* or *occupation* or *surface* or *radius* or *edge_histo* or *edge_threshold* or *face_threshold* or *neighbors* or *peratom* +* keyword = *only_group* or *occupation* or *surface* or *radius* or *edge_histo* or *edge_threshold* or *face_threshold* or *neighbors* .. parsed-literal:: @@ -31,7 +31,6 @@ Syntax *face_threshold* arg = minarea minarea = minimum area for a face to be counted *neighbors* value = *yes* or *no* = store list of all neighbors or no - *peratom* value = *yes* or *no* = per-atom quantities accessible or no Examples """""""" @@ -53,14 +52,12 @@ atoms in the simulation box. The tessellation is calculated using all atoms in the simulation, but non-zero values are only stored for atoms in the group. -By default two per-atom quantities are calculated by this compute. -The first is the volume of the Voronoi cell around each atom. Any -point in an atom's Voronoi cell is closer to that atom than any other. -The second is the number of faces of the Voronoi cell. This is -equal to the number of nearest neighbors of the central atom, -plus any exterior faces (see note below). If the *peratom* keyword -is set to "no", the per-atom quantities are still calculated, -but they are not accessible. +Two per-atom quantities are calculated by this compute. The first is +the volume of the Voronoi cell around each atom. Any point in an +atom's Voronoi cell is closer to that atom than any other. The second +is the number of faces of the Voronoi cell. This is equal to the +number of nearest neighbors of the central atom, plus any exterior +faces (see note below). ---------- @@ -97,13 +94,13 @@ present in atom_style sphere for granular models. The *edge_histo* keyword activates the compilation of a histogram of number of edges on the faces of the Voronoi cells in the compute -group. The argument *maxedge* of the this keyword is the largest number -of edges on a single Voronoi cell face expected to occur in the -sample. This keyword adds the generation of a global vector with -*maxedge*\ +1 entries. The last entry in the vector contains the number of -faces with more than *maxedge* edges. Since the polygon with the -smallest amount of edges is a triangle, entries 1 and 2 of the vector -will always be zero. +group. The argument *maxedge* of the this keyword is the largest +number of edges on a single Voronoi cell face expected to occur in the +sample. This keyword generates output of a global vector by this +compute with *maxedge*\ +1 entries. The last entry in the vector +contains the number of faces with more than *maxedge* edges. Since the +polygon with the smallest amount of edges is a triangle, entries 1 and +2 of the vector will always be zero. The *edge_threshold* and *face_threshold* keywords allow the suppression of edges below a given minimum length and faces below a @@ -127,8 +124,8 @@ to locate vacancies (the coordinates are given by the atom coordinates at the time step when the compute was first invoked), while column two data can be used to identify interstitial atoms. -If the *neighbors* value is set to yes, then this compute creates a -local array with 3 columns. There is one row for each face of each +If the *neighbors* value is set to yes, then this compute also creates +a local array with 3 columns. There is one row for each face of each Voronoi cell. The 3 columns are the atom ID of the atom that owns the cell, the atom ID of the atom in the neighboring cell (or zero if the face is external), and the area of the face. The array can be @@ -143,8 +140,8 @@ containing all the Voronoi neighbors in a system: compute 6 all voronoi/atom neighbors yes dump d2 all local 1 dump.neighbors index c_6[1] c_6[2] c_6[3] -If the *face_threshold* keyword is used, then only faces -with areas greater than the threshold are stored. +If the *face_threshold* keyword is used, then only faces with areas +greater than the threshold are stored. ---------- @@ -158,48 +155,48 @@ Voro++ software in the src/VORONOI/README file. .. note:: - The calculation of Voronoi volumes is performed by each processor for - the atoms it owns, and includes the effect of ghost atoms stored by - the processor. This assumes that the Voronoi cells of owned atoms - are not affected by atoms beyond the ghost atom cut-off distance. - This is usually a good assumption for liquid and solid systems, but - may lead to underestimation of Voronoi volumes in low density - systems. By default, the set of ghost atoms stored by each processor - is determined by the cutoff used for :doc:`pair_style ` - interactions. The cutoff can be set explicitly via the - :doc:`comm_modify cutoff ` command. The Voronoi cells - for atoms adjacent to empty regions will extend into those regions up - to the communication cutoff in :math:`x`, :math:`y`, or :math:`z`. - In that situation, an exterior face is created at the cutoff distance - normal to the :math:`x`, :math:`y`, or :math:`z` direction. For - triclinic systems, the exterior face is parallel to the corresponding - reciprocal lattice vector. + The calculation of Voronoi volumes is performed by each processor + for the atoms it owns, and includes the effect of ghost atoms + stored by the processor. This assumes that the Voronoi cells of + owned atoms are not affected by atoms beyond the ghost atom cut-off + distance. This is usually a good assumption for liquid and solid + systems, but may lead to underestimation of Voronoi volumes in low + density systems. By default, the set of ghost atoms stored by each + processor is determined by the cutoff used for :doc:`pair_style + ` interactions. The cutoff can be set explicitly via + the :doc:`comm_modify cutoff ` command. The Voronoi + cells for atoms adjacent to empty regions will extend into those + regions up to the communication cutoff in :math:`x`, :math:`y`, or + :math:`z`. In that situation, an exterior face is created at the + cutoff distance normal to the :math:`x`, :math:`y`, or :math:`z` + direction. For triclinic systems, the exterior face is parallel to + the corresponding reciprocal lattice vector. .. note:: - The Voro++ package performs its calculation in 3d. This will - still work for a 2d LAMMPS simulation, provided all the atoms have the - same :math:`z`-coordinate. The Voronoi cell of each atom will be a columnar - polyhedron with constant cross-sectional area along the :math:`z`-direction - and two exterior faces at the top and bottom of the simulation box. If - the atoms do not all have the same :math:`z`-coordinate, then the columnar - cells will be accordingly distorted. The cross-sectional area of each - Voronoi cell can be obtained by dividing its volume by the :math:`z` extent - of the simulation box. Note that you define the :math:`z` extent of the - simulation box for 2d simulations when using the - :doc:`create_box ` or :doc:`read_data ` commands. + The Voro++ package performs its calculation in 3d. This will still + work for a 2d LAMMPS simulation, provided all the atoms have the + same :math:`z`-coordinate. The Voronoi cell of each atom will be a + columnar polyhedron with constant cross-sectional area along the + :math:`z`-direction and two exterior faces at the top and bottom of + the simulation box. If the atoms do not all have the same + :math:`z`-coordinate, then the columnar cells will be accordingly + distorted. The cross-sectional area of each Voronoi cell can be + obtained by dividing its volume by the :math:`z` extent of the + simulation box. Note that you define the :math:`z` extent of the + simulation box for 2d simulations when using the :doc:`create_box + ` or :doc:`read_data ` commands. Output info """"""""""" -By default, this compute calculates a per-atom array with two -columns. In regular dynamic tessellation mode the first column is the -Voronoi volume, the second is the neighbor count, as described above -(read above for the output data in case the *occupation* keyword is -specified). These values can be accessed by any command that uses -per-atom values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output -options. If the *peratom* keyword is set to "no", the per-atom array -is still created, but it is not accessible. +This compute calculates a per-atom array with two columns. In regular +dynamic tessellation mode the first column is the Voronoi volume, the +second is the neighbor count, as described above (read above for the +output data in case the *occupation* keyword is specified). These +values can be accessed by any command that uses per-atom values from a +compute as input. See the :doc:`Howto output ` page for +an overview of LAMMPS output options. If the *edge_histo* keyword is used, then this compute generates a global vector of length *maxedge*\ +1, containing a histogram of the @@ -209,17 +206,6 @@ If the *neighbors* value is set to *yes*, then this compute calculates a local array with three columns. There is one row for each face of each Voronoi cell. -.. note:: - - Some LAMMPS commands such as the :doc:`compute reduce ` - command can accept either a per-atom or local quantity. If this compute - produces both quantities, the command - may access the per-atom quantity, even if you want to access the local - quantity. This effect can be eliminated by using the *peratom* - keyword to turn off the production of the per-atom quantities. For - the default value *yes* both quantities are produced. For the value - *no*, only the local array is produced. - The Voronoi cell volume will be in distance :doc:`units ` cubed. The Voronoi face area will be in distance :doc:`units ` squared. @@ -227,7 +213,8 @@ Restrictions """""""""""" This compute is part of the VORONOI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. It also requires you have a copy of the Voro++ library built and installed on your system. See instructions on obtaining and @@ -241,5 +228,4 @@ Related commands Default """"""" -*neighbors* no, *peratom* yes - +The default for the neighobrs keyword is no. diff --git a/src/VORONOI/compute_voronoi_atom.cpp b/src/VORONOI/compute_voronoi_atom.cpp index 28bab271a2..eb4f53986f 100644 --- a/src/VORONOI/compute_voronoi_atom.cpp +++ b/src/VORONOI/compute_voronoi_atom.cpp @@ -111,12 +111,7 @@ ComputeVoronoi::ComputeVoronoi(LAMMPS *lmp, int narg, char **arg) : if (iarg + 2 > narg) error->all(FLERR,"Illegal compute voronoi/atom command"); faces_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; - } else if (strcmp(arg[iarg], "peratom") == 0) { - if (iarg + 2 > narg) error->all(FLERR,"Illegal compute voronoi/atom command"); - peratom_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); - iarg += 2; - } - else error->all(FLERR,"Illegal compute voronoi/atom command"); + } else error->all(FLERR,"Illegal compute voronoi/atom command"); } if (occupation && ( surface!=VOROSURF_NONE || maxedge>0 ) ) @@ -394,27 +389,29 @@ void ComputeVoronoi::checkOccupation() // clear occupation vector memset(occvec, 0, oldnatoms*sizeof(*occvec)); - int i, j, k, - nlocal = atom->nlocal, - nall = atom->nghost + nlocal; - double rx, ry, rz, - **x = atom->x; + int i, j, k; + double rx, ry, rz; + + int nlocal = atom->nlocal; + int nall = atom->nghost + nlocal; + double **x = atom->x; // prepare destination buffer for variable evaluation + if (atom->nmax > lmax) { memory->destroy(lnext); lmax = atom->nmax; memory->create(lnext,lmax,"voronoi/atom:lnext"); } - // clear lroot - for (i=0; ifind_voronoi_cell(x[i][0], x[i][1], x[i][2], rx, ry, rz, k)) || @@ -435,6 +432,7 @@ void ComputeVoronoi::checkOccupation() } // MPI sum occupation + #ifdef NOTINPLACE memcpy(sendocc, occvec, oldnatoms*sizeof(*occvec)); MPI_Allreduce(sendocc, occvec, oldnatoms, MPI_INT, MPI_SUM, world); @@ -443,6 +441,7 @@ void ComputeVoronoi::checkOccupation() #endif // determine the total number of atoms in this atom's currently occupied cell + int c; for (i=0; itag[i]; if (mytag > oldmaxtag) voro[i][0] = 0; @@ -479,6 +479,7 @@ void ComputeVoronoi::checkOccupation() void ComputeVoronoi::loopCells() { // invoke voro++ and fetch results for owned atoms in group + voronoicell_neighbor c; int i; if (faces_flag) nfaces = 0; From 299eda8ca36eb4f1eda63f31bd021dca479a4ba3 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 17 Aug 2023 16:12:14 -0600 Subject: [PATCH 054/417] have compute_reduce require either peratom or local inputs --- doc/src/compute_reduce.rst | 134 +++++++++++++++++++--------------- doc/src/fix_rigid.rst | 5 +- src/compute_reduce.cpp | 95 +++++++++++++++--------- src/compute_reduce.h | 3 +- src/compute_reduce_region.cpp | 18 +++-- 5 files changed, 149 insertions(+), 106 deletions(-) diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 204f1c090d..31591d4419 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -37,13 +37,16 @@ Syntax v_name = per-atom vector calculated by an atom-style variable with name * zero or more keyword/args pairs may be appended -* keyword = *replace* +* keyword = *replace* or *inputs* .. parsed-literal:: *replace* args = vec1 vec2 vec1 = reduced value from this input vector will be replaced vec2 = replace it with vec1[N] where N is index of max/min value from vec2 + *inputs* arg = peratom or local + peratom = all inputs are per-atom quantities (default) + local = all input are local quantities Examples """""""" @@ -61,26 +64,30 @@ Description Define a calculation that "reduces" one or more vector inputs into scalar values, one per listed input. The inputs can be per-atom or -local quantities; they cannot be global quantities. Atom attributes -are per-atom quantities, :doc:`computes ` and :doc:`fixes ` -may generate any of the three kinds of quantities, and :doc:`atom-style variables ` generate per-atom quantities. See the -:doc:`variable ` command and its special functions which can -perform the same operations as the compute reduce command on global -vectors. +local quantities and must all be the same kind (per-atom or local); +see discussion of the optional *inputs* keyword below. + +Atom attributes are per-atom quantities, :doc:`computes ` and +:doc:`fixes ` can generate either per-atom or local quantities, +and :doc:`atom-style variables ` generate per-atom +quantities. See the :doc:`variable ` command and its +special functions which can perform the same reduction operations as +the compute reduce command on global vectors. The reduction operation is specified by the *mode* setting. The *sum* option adds the values in the vector into a global total. The *min* or *max* options find the minimum or maximum value across all vector values. The *minabs* or *maxabs* options find the minimum or maximum value across all absolute vector values. The *ave* setting adds the -vector values into a global total, then divides by the number of values -in the vector. The *sumsq* option sums the square of the values in the -vector into a global total. The *avesq* setting does the same as *sumsq*, -then divides the sum of squares by the number of values. The last two options -can be useful for calculating the variance of some quantity (e.g., variance = -sumsq :math:`-` ave\ :math:`^2`). The *sumabs* option sums the absolute -values in the vector into a global total. The *aveabs* setting does the same -as *sumabs*, then divides the sum of absolute values by the number of +vector values into a global total, then divides by the number of +values in the vector. The *sumsq* option sums the square of the +values in the vector into a global total. The *avesq* setting does +the same as *sumsq*, then divides the sum of squares by the number of +values. The last two options can be useful for calculating the +variance of some quantity (e.g., variance = sumsq :math:`-` ave\ +:math:`^2`). The *sumabs* option sums the absolute values in the +vector into a global total. The *aveabs* setting does the same as +*sumabs*, then divides the sum of absolute values by the number of values. Each listed input is operated on independently. For per-atom inputs, @@ -123,52 +130,54 @@ array with six columns: ---------- -The atom attribute values (*x*, *y*, *z*, *vx*, *vy*, *vz*, *fx*, *fy*, and -*fz*) are self-explanatory. Note that other atom attributes can be used as -inputs to this fix by using the -:doc:`compute property/atom ` command and then specifying -an input value from that compute. +The atom attribute values (*x*, *y*, *z*, *vx*, *vy*, *vz*, *fx*, +*fy*, and *fz*) are self-explanatory. Note that other atom attributes +can be used as inputs to this fix by using the :doc:`compute +property/atom ` command and then specifying an +input value from that compute. If a value begins with "c\_", a compute ID must follow which has been -previously defined in the input script. Computes can generate -per-atom or local quantities. See the individual -:doc:`compute ` page for details. If no bracketed integer -is appended, the vector calculated by the compute is used. If a -bracketed integer is appended, the Ith column of the array calculated -by the compute is used. Users can also write code for their own -compute styles and :doc:`add them to LAMMPS `. See the -discussion above for how :math:`I` can be specified with a wildcard asterisk -to effectively specify multiple values. +previously defined in the input script. Valid computes can generate +per-atom or local quantities. See the individual :doc:`compute +` page for details. If no bracketed integer is appended, the +vector calculated by the compute is used. If a bracketed integer is +appended, the Ith column of the array calculated by the compute is +used. Users can also write code for their own compute styles and +:doc:`add them to LAMMPS `. See the discussion above for how +:math:`I` can be specified with a wildcard asterisk to effectively +specify multiple values. If a value begins with "f\_", a fix ID must follow which has been -previously defined in the input script. Fixes can generate per-atom -or local quantities. See the individual :doc:`fix ` page for -details. Note that some fixes only produce their values on certain -timesteps, which must be compatible with when compute reduce +previously defined in the input script. Valid fixes can generate +per-atom or local quantities. See the individual :doc:`fix ` +page for details. Note that some fixes only produce their values on +certain timesteps, which must be compatible with when compute reduce references the values, else an error results. If no bracketed integer is appended, the vector calculated by the fix is used. If a bracketed integer is appended, the Ith column of the array calculated by the fix is used. Users can also write code for their own fix style and :doc:`add them to LAMMPS `. See the discussion above for how -:math:`I` can be specified with a wildcard asterisk to effectively specify -multiple values. +:math:`I` can be specified with a wildcard asterisk to effectively +specify multiple values. If a value begins with "v\_", a variable name must follow which has been previously defined in the input script. It must be an :doc:`atom-style variable `. Atom-style variables can reference thermodynamic keywords and various per-atom attributes, or invoke other computes, fixes, or variables when they are evaluated, so -this is a very general means of generating per-atom quantities to reduce. +this is a very general means of generating per-atom quantities to +reduce. ---------- If the *replace* keyword is used, two indices *vec1* and *vec2* are -specified, where each index ranges from 1 to the number of input values. -The replace keyword can only be used if the *mode* is *min* or *max*\ . -It works as follows. A min/max is computed as usual on the *vec2* -input vector. The index :math:`N` of that value within *vec2* is also stored. -Then, instead of performing a min/max on the *vec1* input vector, the -stored index is used to select the :math:`N`\ th element of the *vec1* vector. +specified, where each index ranges from 1 to the number of input +values. The replace keyword can only be used if the *mode* is *min* +or *max*\ . It works as follows. A min/max is computed as usual on +the *vec2* input vector. The index :math:`N` of that value within +*vec2* is also stored. Then, instead of performing a min/max on the +*vec1* input vector, the stored index is used to select the :math:`N`\ +th element of the *vec1* vector. Thus, for example, if you wish to use this compute to find the bond with maximum stretch, you can do it as follows: @@ -190,6 +199,14 @@ information in this context, the *replace* keywords will extract the atom IDs for the two atoms in the bond of maximum stretch. These atom IDs and the bond stretch will be printed with thermodynamic output. +The *inputs* keyword allows selection of whether all the inputs are +per-atom or local quantities. As noted above, all the inputs must be +the same kind (per-atom or local). Per-atom is the default setting. +If a compute or fix is specified as an input, it must produce per-atom +or local data to match this setting. If it produces both, e.g. for +the :doc:`compute voronoi/atom ` command, then +this keyword selects between them. + ---------- If a single input is specified this compute produces a global scalar @@ -197,34 +214,35 @@ value. If multiple inputs are specified, this compute produces a global vector of values, the length of which is equal to the number of inputs specified. -As discussed below, for the *sum*, *sumabs*, and *sumsq* modes, the value(s) -produced by this compute are all "extensive", meaning their value -scales linearly with the number of atoms involved. If normalized -values are desired, this compute can be accessed by the +As discussed below, for the *sum*, *sumabs*, and *sumsq* modes, the +value(s) produced by this compute are all "extensive", meaning their +value scales linearly with the number of atoms involved. If +normalized values are desired, this compute can be accessed by the :doc:`thermo_style custom ` command with -:doc:`thermo_modify norm yes ` set as an option. -Or it can be accessed by a -:doc:`variable ` that divides by the appropriate atom count. +:doc:`thermo_modify norm yes ` set as an option. Or it +can be accessed by a :doc:`variable ` that divides by the +appropriate atom count. ---------- Output info """"""""""" -This compute calculates a global scalar if a single input value is specified -or a global vector of length :math:`N`, where :math:`N` is the number of -inputs, and which can be accessed by indices 1 to :math:`N`. These values can -be used by any command that uses global scalar or vector values from a -compute as input. See the :doc:`Howto output ` doc page -for an overview of LAMMPS output options. +This compute calculates a global scalar if a single input value is +specified or a global vector of length :math:`N`, where :math:`N` is +the number of inputs, and which can be accessed by indices 1 to +:math:`N`. These values can be used by any command that uses global +scalar or vector values from a compute as input. See the :doc:`Howto +output ` doc page for an overview of LAMMPS output +options. All the scalar or vector values calculated by this compute are "intensive", except when the *sum*, *sumabs*, or *sumsq* modes are used on per-atom or local vectors, in which case the calculated values are "extensive". -The scalar or vector values will be in whatever :doc:`units ` the -quantities being reduced are in. +The scalar or vector values will be in whatever :doc:`units ` +the quantities being reduced are in. Restrictions """""""""""" @@ -238,4 +256,4 @@ Related commands Default """"""" -none +The default value for the *inputs* keyword is peratom. diff --git a/doc/src/fix_rigid.rst b/doc/src/fix_rigid.rst index 89759da817..a50e215681 100644 --- a/doc/src/fix_rigid.rst +++ b/doc/src/fix_rigid.rst @@ -843,7 +843,7 @@ stress/atom ` commands. The former can be accessed by :doc:`thermodynamic output `. The default setting for this fix is :doc:`fix_modify virial yes `. -All of the *rigid* styles (not the *rigid/small* styles) compute a +All of the *rigid* styles (but not the *rigid/small* styles) compute a global array of values which can be accessed by various :doc:`output commands `. Similar information about the bodies defined by the *rigid/small* styles can be accessed via the @@ -887,7 +887,8 @@ Restrictions """""""""""" These fixes are all part of the RIGID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Assigning a temperature via the :doc:`velocity create ` command to a system with :doc:`rigid bodies ` may not have diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 6b27498eb7..8565ddb1c9 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -31,12 +31,16 @@ using namespace LAMMPS_NS; +enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduceRegion + #define BIG 1.0e20 //---------------------------------------------------------------- + void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -47,9 +51,11 @@ void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) } *(double *) inout = m; } + void abs_min(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -68,6 +74,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : owner(nullptr), idregion(nullptr), region(nullptr), varatom(nullptr) { int iarg = 0; + if (strcmp(style, "reduce") == 0) { if (narg < 5) utils::missing_cmd_args(FLERR, "compute reduce", error); iarg = 3; @@ -128,42 +135,52 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // parse values + input_mode = UNDECIDED; + values.clear(); nvalues = 0; for (int iarg = 0; iarg < nargnew; ++iarg) { value_t val; val.id = ""; - val.flavor = 0; val.val.c = nullptr; if (strcmp(arg[iarg], "x") == 0) { + input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 0; } else if (strcmp(arg[iarg], "y") == 0) { + input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 1; } else if (strcmp(arg[iarg], "z") == 0) { + input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 2; } else if (strcmp(arg[iarg], "vx") == 0) { + input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 0; } else if (strcmp(arg[iarg], "vy") == 0) { + input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 1; } else if (strcmp(arg[iarg], "vz") == 0) { + input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 2; } else if (strcmp(arg[iarg], "fx") == 0) { + input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 0; } else if (strcmp(arg[iarg], "fy") == 0) { + input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 1; } else if (strcmp(arg[iarg], "fz") == 0) { + input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 2; @@ -207,6 +224,14 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Compute {} replace column already used for another replacement"); replace[col1] = col2; iarg += 2; + } else if (strcmp(arg[iarg], "inputs") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); + if (strcmp(arg[iarg+1], "peratom") == 0) input_mode = PERATOM; + else if (strcmp(arg[iarg+1], "local") == 0) { + if (input_mode == PERATOM) + error->all(FLERR,"Compute {} inputs must be all peratom or all local"); + input_mode = LOCAL; + } } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); } @@ -231,66 +256,64 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // setup and error check for (auto &val : values) { - if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) - val.flavor = PERATOM; - - else if (val.which == ArgInfo::COMPUTE) { + if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) error->all(FLERR, "Compute ID {} for compute {} does not exist", val.id, style); - if (val.val.c->peratom_flag) { - val.flavor = PERATOM; + + if (input_mode == PERATOM) { + if (!val.val.c->peratom_flag) + error->all(FLERR, "Compute {} compute {} does not calculate per-atom values", style, val.id); if (val.argindex == 0 && val.val.c->size_peratom_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, val.id); if (val.argindex && val.val.c->size_peratom_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); - } else if (val.val.c->local_flag) { - val.flavor = LOCAL; + + } else if (input_mode == LOCAL) { + if (!val.val.c->peratom_flag) + error->all(FLERR, "Compute {} compute {} does not calculate local values", style, val.id); if (val.argindex == 0 && val.val.c->size_local_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, val.id); if (val.argindex && val.val.c->size_local_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, - val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, val.id); if (val.argindex && val.argindex > val.val.c->size_local_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); - } else - error->all(FLERR, "Compute {} compute {} calculates global values", style, val.id); + } } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) error->all(FLERR, "Fix ID {} for compute {} does not exist", val.id, style); - if (val.val.f->peratom_flag) { - val.flavor = PERATOM; + + if (input_mode == PERATOM) { + if (!val.val.f->peratom_flag) + error->all(FLERR, "Compute {} fix {} does not calculate per-atom values", style, val.id); if (val.argindex == 0 && (val.val.f->size_peratom_cols != 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, - val.id); + error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, val.id); if (val.argindex && (val.val.f->size_peratom_cols == 0)) error->all(FLERR, "Compute {} fix {} does not calculate a per-atom array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); - } else if (val.val.f->local_flag) { - val.flavor = LOCAL; + + } else if (input_mode == LOCAL) { + if (!val.val.f->local_flag) + error->all(FLERR, "Compute {} fix {} does not calculate local values", style, val.id); if (val.argindex == 0 && (val.val.f->size_local_cols != 0)) error->all(FLERR, "Compute {} fix {} does not calculate a local vector", style, val.id); if (val.argindex && (val.val.f->size_local_cols == 0)) error->all(FLERR, "Compute {} fix {} does not calculate a local array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_local_cols)) error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); - } else - error->all(FLERR, "Compute {} fix {} calculates global values", style, val.id); + } } else if (val.which == ArgInfo::VARIABLE) { + if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) error->all(FLERR, "Variable name {} for compute {} does not exist", val.id, style); if (input->variable->atomstyle(val.val.v) == 0) error->all(FLERR, "Compute {} variable {} is not atom-style variable", style, val.id); - val.flavor = PERATOM; } } @@ -512,7 +535,7 @@ double ComputeReduce::compute_one(int m, int flag) } else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { val.val.c->compute_peratom(); val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; @@ -537,7 +560,7 @@ double ComputeReduce::compute_one(int m, int flag) one = carray_atom[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (!(val.val.c->invoked_flag & Compute::INVOKED_LOCAL)) { val.val.c->compute_local(); val.val.c->invoked_flag |= Compute::INVOKED_LOCAL; @@ -567,7 +590,7 @@ double ComputeReduce::compute_one(int m, int flag) if (update->ntimestep % val.val.f->peratom_freq) error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (aidx == 0) { double *fix_vector = val.val.f->vector_atom; if (flag < 0) { @@ -585,7 +608,7 @@ double ComputeReduce::compute_one(int m, int flag) one = fix_array[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (aidx == 0) { double *fix_vector = val.val.f->vector_local; int n = val.val.f->size_local_rows; @@ -632,18 +655,18 @@ bigint ComputeReduce::count(int m) if ((val.which == ArgInfo::X) || (val.which == ArgInfo::V) || (val.which == ArgInfo::F)) return group->count(igroup); else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.c->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_LMP_BIGINT, MPI_SUM, world); return ncountall; } } else if (val.which == ArgInfo::FIX) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.f->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_LMP_BIGINT, MPI_SUM, world); diff --git a/src/compute_reduce.h b/src/compute_reduce.h index f8f73cb17a..f8b652e00c 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -37,12 +37,11 @@ class ComputeReduce : public Compute { double memory_usage() override; protected: - int mode, nvalues; + int mode, nvalues, input_mode; struct value_t { int which; int argindex; std::string id; - int flavor; union { class Compute *c; class Fix *f; diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index efce00ff66..2f5a3de675 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -26,6 +26,8 @@ using namespace LAMMPS_NS; +enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduce + static constexpr double BIG = 1.0e20; /* ---------------------------------------------------------------------- */ @@ -97,7 +99,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) // invoke compute if not previously invoked } else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { val.val.c->compute_peratom(); val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; @@ -122,7 +124,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) one = compute_array[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (!(val.val.c->invoked_flag & Compute::INVOKED_LOCAL)) { val.val.c->compute_local(); val.val.c->invoked_flag |= Compute::INVOKED_LOCAL; @@ -151,7 +153,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) if (update->ntimestep % val.val.f->peratom_freq) error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { if (aidx == 0) { double *fix_vector = val.val.f->vector_atom; if (flag < 0) { @@ -171,7 +173,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) one = fix_array[flag][aidxm1]; } - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { if (aidx == 0) { double *fix_vector = val.val.f->vector_local; if (flag < 0) @@ -219,18 +221,18 @@ bigint ComputeReduceRegion::count(int m) if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) return group->count(igroup, region); else if (val.which == ArgInfo::COMPUTE) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup, region); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.c->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); return ncountall; } } else if (val.which == ArgInfo::FIX) { - if (val.flavor == PERATOM) { + if (input_mode == PERATOM) { return group->count(igroup, region); - } else if (val.flavor == LOCAL) { + } else if (input_mode == LOCAL) { bigint ncount = val.val.f->size_local_rows; bigint ncountall; MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); From f2901827e6cc74bdacfe8cfb06d1ba62322ed007 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 17 Aug 2023 17:25:27 -0600 Subject: [PATCH 055/417] updates to variable doc page to clarify compute/fix options --- doc/src/compute.rst | 4 +- doc/src/thermo_style.rst | 53 +++++----- doc/src/variable.rst | 218 +++++++++++++++++++++------------------ 3 files changed, 148 insertions(+), 127 deletions(-) diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 317efa4f41..226dc6373b 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -43,8 +43,8 @@ underscores. ---------- -Computes calculate one or more of four styles of quantities: global, -per-atom, local, or per-atom. A global quantity is one or more +Computes calculate and store any of four styles of quantities: global, +per-atom, local, or per-grid. A global quantity is one or more system-wide values, e.g. the temperature of the system. A per-atom quantity is one or more values per atom, e.g. the kinetic energy of each atom. Per-atom values are set to 0.0 for atoms not in the diff --git a/doc/src/thermo_style.rst b/doc/src/thermo_style.rst index 63ad59e553..c3c607a479 100644 --- a/doc/src/thermo_style.rst +++ b/doc/src/thermo_style.rst @@ -385,19 +385,20 @@ creates a global vector with 6 values. The *c_ID* and *c_ID[I]* and *c_ID[I][J]* keywords allow global values calculated by a compute to be output. As discussed on the :doc:`compute ` doc page, computes can calculate global, -per-atom, or local values. Only global values can be referenced by -this command. However, per-atom compute values for an individual atom -can be referenced in a :doc:`variable ` and the variable -referenced by thermo_style custom, as discussed below. See the -discussion above for how the I in *c_ID[I]* can be specified with a -wildcard asterisk to effectively specify multiple values from a global -compute vector. +per-atom, local, and per-grid values. Only global values can be +referenced by this command. However, per-atom compute values for an +individual atom can be referenced in a :doc:`equal-style variable +` and the variable referenced by thermo_style custom, as +discussed below. See the discussion above for how the I in *c_ID[I]* +can be specified with a wildcard asterisk to effectively specify +multiple values from a global compute vector. The ID in the keyword should be replaced by the actual ID of a compute that has been defined elsewhere in the input script. See the -:doc:`compute ` command for details. If the compute calculates -a global scalar, vector, or array, then the keyword formats with 0, 1, -or 2 brackets will reference a scalar value from the compute. +:doc:`compute ` command for details. If the compute +calculates a global scalar, vector, or array, then the keyword formats +with 0, 1, or 2 brackets will reference a scalar value from the +compute. Note that some computes calculate "intensive" global quantities like temperature; others calculate "extensive" global quantities like @@ -410,13 +411,14 @@ norm ` option being used. The *f_ID* and *f_ID[I]* and *f_ID[I][J]* keywords allow global values calculated by a fix to be output. As discussed on the :doc:`fix -` doc page, fixes can calculate global, per-atom, or local -values. Only global values can be referenced by this command. -However, per-atom fix values can be referenced for an individual atom -in a :doc:`variable ` and the variable referenced by -thermo_style custom, as discussed below. See the discussion above for -how the I in *f_ID[I]* can be specified with a wildcard asterisk to -effectively specify multiple values from a global fix vector. +` doc page, fixes can calculate global, per-atom, local, and +per-grid values. Only global values can be referenced by this +command. However, per-atom fix values can be referenced for an +individual atom in a :doc:`equal-style variable ` and the +variable referenced by thermo_style custom, as discussed below. See +the discussion above for how the I in *f_ID[I]* can be specified with +a wildcard asterisk to effectively specify multiple values from a +global fix vector. The ID in the keyword should be replaced by the actual ID of a fix that has been defined elsewhere in the input script. See the @@ -438,14 +440,15 @@ output. The name in the keyword should be replaced by the variable name that has been defined elsewhere in the input script. Only equal-style and vector-style variables can be referenced; the latter requires a bracketed term to specify the Ith element of the vector -calculated by the variable. However, an atom-style variable can be -referenced for an individual atom by an equal-style variable and that -variable referenced. See the :doc:`variable ` command for -details. Variables of style *equal* and *vector* and *atom* define a -formula which can reference per-atom properties or thermodynamic -keywords, or they can invoke other computes, fixes, or variables when -evaluated, so this is a very general means of creating thermodynamic -output. +calculated by the variable. However, an equal-style variable can use +an atom-style variable in its formula indexed by the ID of an +individual atom. This is a way to output a speciic atom's per-atom +coordinates or other per-atom properties in thermo output. See the +:doc:`variable ` command for details. Note that variables +of style *equal* and *vector* and *atom* define a formula which can +reference per-atom properties or thermodynamic keywords, or they can +invoke other computes, fixes, or variables when evaluated, so this is +a very general means of creating thermodynamic output. Note that equal-style and vector-style variables are assumed to produce "intensive" global quantities, which are thus printed as-is, diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 28c0d29799..38e423b632 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -550,12 +550,11 @@ variables. Most of the formula elements produce a scalar value. Some produce a global or per-atom vector of values. Global vectors can be produced by computes or fixes or by other vector-style variables. Per-atom -vectors are produced by atom vectors, compute references that -represent a per-atom vector, fix references that represent a per-atom -vector, and variables that are atom-style variables. Math functions -that operate on scalar values produce a scalar value; math function -that operate on global or per-atom vectors do so element-by-element -and produce a global or per-atom vector. +vectors are produced by atom vectors, computes or fixes which output a +per-atom vector or array, and variables that are atom-style variables. +Math functions that operate on scalar values produce a scalar value; +math function that operate on global or per-atom vectors do so +element-by-element and produce a global or per-atom vector. A formula for equal-style variables cannot use any formula element that produces a global or per-atom vector. A formula for a @@ -564,12 +563,13 @@ scalar value or a global vector value, but cannot use a formula element that produces a per-atom vector. A formula for an atom-style variable can use formula elements that produce either a scalar value or a per-atom vector, but not one that produces a global vector. + Atom-style variables are evaluated by other commands that define a -:doc:`group ` on which they operate, e.g. a :doc:`dump ` or -:doc:`compute ` or :doc:`fix ` command. When they invoke -the atom-style variable, only atoms in the group are included in the -formula evaluation. The variable evaluates to 0.0 for atoms not in -the group. +:doc:`group ` on which they operate, e.g. a :doc:`dump ` +or :doc:`compute ` or :doc:`fix ` command. When they +invoke the atom-style variable, only atoms in the group are included +in the formula evaluation. The variable evaluates to 0.0 for atoms +not in the group. ---------- @@ -1138,69 +1138,74 @@ only defined if an :doc:`atom_style ` is being used that defines molecule IDs. Note that many other atom attributes can be used as inputs to a -variable by using the :doc:`compute property/atom ` command and then specifying -a quantity from that compute. +variable by using the :doc:`compute property/atom +` command and then specifying a quantity from +that compute. ---------- Compute References ------------------ -Compute references access quantities calculated by a -:doc:`compute `. The ID in the reference should be replaced by -the ID of a compute defined elsewhere in the input script. As -discussed in the page for the :doc:`compute ` command, -computes can produce global, per-atom, or local values. Only global -and per-atom values can be used in a variable. Computes can also -produce a scalar, vector, or array. +Compute references access quantities calculated by a :doc:`compute +`. The ID in the reference should be replaced by the ID of a +compute defined elsewhere in the input script. -An equal-style variable can only use scalar values, which means a -global scalar, or an element of a global or per-atom vector or array. -A vector-style variable can use scalar values or a global vector of -values, or a column of a global array of values. Atom-style variables -can use global scalar values. They can also use per-atom vector -values, or a column of a per-atom array. See the doc pages for -individual computes to see what kind of values they produce. +As discussed on the page for the :doc:`compute ` command, +computes can produce global, per-atom, local, and per-grid values. +Only global and per-atom values can be used in a variable. Computes +can also produce scalars (global only), vectors, and arrays. See the +doc pages for individual computes to see what different kinds of data +they produce. -Examples of different kinds of compute references are as follows. -There is typically no ambiguity (see exception below) as to what a -reference means, since computes only produce either global or per-atom -quantities, never both. +An equal-style variable can only use scalar values, either from global +or per-atom data. In the case of per-atom data, this would be a value +for a specific atom. -+-------------+-------------------------------------------------------------------------------------------------------+ -| c_ID | global scalar, or per-atom vector | -+-------------+-------------------------------------------------------------------------------------------------------+ -| c_ID[I] | Ith element of global vector, or atom I's value in per-atom vector, or Ith column from per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ -| c_ID[I][J] | I,J element of global array, or atom I's Jth value in per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ +A vector-style variable can use scalar values (same as for equal-style +variables), or global vectors of values. The latter can also be a +column of a global array. -For I and J indices, integers can be specified or a variable name, -specified as v_name, where name is the name of the variable. The -rules for this syntax are the same as for the "Atom Values and -Vectors" discussion above. +Atom-style variables can use scalar values (same as for equal-style +varaibles), or per-atom vectors of values. The latter can also be a +column of a per-atom array. -One source of ambiguity for compute references is when a vector-style -variable refers to a compute that produces both a global scalar and a -global vector. Consider a compute with ID "foo" that does this, -referenced as follows by variable "a", where "myVec" is another -vector-style variable: +The various allowed compute references in the variable formulas for +equal-, vector-, and atom-style variables are listed in the following +table: -.. code-block:: LAMMPS ++--------+------------+--------------------------------------------+ +| equal | c_ID | global scalar | +| equal | c_ID[I] | element of global vector | +| equal | c_ID[I][J] | element of global array | +| equal | C_ID[I] | element of per-atom vector, I = ID of atom | +| equal | C_ID{i}[J] | element of per-atom array, I = ID of atom | ++--------+------------+--------------------------------------------| +| vector | c_ID | global vector | +| vector | c_ID[I] | column of global array | +---------+------------+--------------------------------------------+ +| atom | c_ID | per-atom vector | +| atom | c_ID[I] | column of per-atom array | ++--------+------------+--------------------------------------------+ - variable a vector c_foo*v_myVec +Note that if an equal-style variable formula wishes to access per-atom +data from a compute, it must use capital "C" as the ID prefix and not +lower-case "c". -The reference "c_foo" could refer to either the global scalar or -global vector produced by compute "foo". In this case, "c_foo" will -always refer to the global scalar, and "C_foo" can be used to -reference the global vector. Similarly if the compute produces both a -global vector and global array, then "c_foo[I]" will always refer to -an element of the global vector, and "C_foo[I]" can be used to -reference the Ith column of the global array. +Also note that if a vector- or atom-style variable formula needs to +access a scalar value from a compute (i.e. the 5 kinds of values in +the first 5 lines of the table), it can not do so directly. Instead, +it can use a reference to an equal-style variable which stores the +scalar value from the compute. -Note that if a variable containing a compute is evaluated directly in -an input script (not during a run), then the values accessed by the -compute must be current. See the discussion below about "Variable +The I and J indices in these compute references can be integers or can +be a variable name, specified as v_name, where name is the name of the +variable. The rules for this syntax are the same as for indices in +the "Atom Values and Vectors" discussion above. + +If a variable containing a compute is evaluated directly in an input +script (not during a run), then the values accessed by the compute +should be current. See the discussion below about "Variable Accuracy". ---------- @@ -1208,51 +1213,60 @@ Accuracy". Fix References -------------- -Fix references access quantities calculated by a :doc:`fix `. +Fix references access quantities calculated by a :doc:`fix `. The ID in the reference should be replaced by the ID of a fix defined -elsewhere in the input script. As discussed in the page for the -:doc:`fix ` command, fixes can produce global, per-atom, or local -values. Only global and per-atom values can be used in a variable. -Fixes can also produce a scalar, vector, or array. An equal-style -variable can only use scalar values, which means a global scalar, or -an element of a global or per-atom vector or array. Atom-style -variables can use the same scalar values. They can also use per-atom -vector values. A vector value can be a per-atom vector itself, or a -column of an per-atom array. See the doc pages for individual fixes -to see what kind of values they produce. +elsewhere in the input script. -The different kinds of fix references are exactly the same as the -compute references listed in the above table, where "c\_" is replaced -by "f\_". Again, there is typically no ambiguity (see exception below) -as to what a reference means, since fixes only produce either global -or per-atom quantities, never both. +As discussed on the page for the :doc:`fix ` command, fixes can +produce global, per-atom, local, and per-grid values. Only global and +per-atom values can be used in a variable. Fixes can also produce +scalars (global only), vectors, and arrays. See the doc pages for +individual fixes to see what different kinds of data they produce. -+-------------+-------------------------------------------------------------------------------------------------------+ -| f_ID | global scalar, or per-atom vector | -+-------------+-------------------------------------------------------------------------------------------------------+ -| f_ID[I] | Ith element of global vector, or atom I's value in per-atom vector, or Ith column from per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ -| f_ID[I][J] | I,J element of global array, or atom I's Jth value in per-atom array | -+-------------+-------------------------------------------------------------------------------------------------------+ +An equal-style variable can only use scalar values, either from global +or per-atom data. In the case of per-atom data, this would be a value +for a specific atom. -For I and J indices, integers can be specified or a variable name, -specified as v_name, where name is the name of the variable. The -rules for this syntax are the same as for the "Atom Values and -Vectors" discussion above. +A vector-style variable can use scalar values (same as for equal-style +variables), or global vectors of values. The latter can also be a +column of a global array. -One source of ambiguity for fix references is the same ambiguity -discussed for compute references above. Namely when a vector-style -variable refers to a fix that produces both a global scalar and a -global vector. The solution is the same as for compute references. -For a fix with ID "foo", "f_foo" will always refer to the global -scalar, and "F_foo" can be used to reference the global vector. And -similarly for distinguishing between a fix's global vector versus -global array with "f_foo[I]" versus "F_foo[I]". +Atom-style variables can use scalar values (same as for equal-style +varaibles), or per-atom vectors of values. The latter can also be a +column of a per-atom array. -Note that if a variable containing a fix is evaluated directly in an -input script (not during a run), then the values accessed by the fix -should be current. See the discussion below about "Variable -Accuracy". +The various allowed fix references in the variable formulas for +equal-, vector-, and atom-style variables are listed in the following +table: + ++--------+------------+--------------------------------------------+ +| equal | f_ID | global scalar | +| equal | f_ID[I] | element of global vector | +| equal | f_ID[I][J] | element of global array | +| equal | F_ID[I] | element of per-atom vector, I = ID of atom | +| equal | F_ID{i}[J] | element of per-atom array, I = ID of atom | ++--------+------------+--------------------------------------------| +| vector | f_ID | global vector | +| vector | f_ID[I] | column of global array | +---------+------------+--------------------------------------------+ +| atom | f_ID | per-atom vector | +| atom | f_ID[I] | column of per-atom array | ++--------+------------+--------------------------------------------+ + +Note that if an equal-style variable formula wishes to access per-atom +data from a fix, it must use capital "F" as the ID prefix and not +lower-case "f". + +Also note that if a vector- or atom-style variable formula needs to +access a scalar value from a fix (i.e. the 5 kinds of values in the +first 5 lines of the table), it can not do so directly. Instead, it +can use a reference to an equal-style variable which stores the scalar +value from the fix. + +The I and J indices in these fix references can be integers or can be +a variable name, specified as v_name, where name is the name of the +variable. The rules for this syntax are the same as for indices in +the "Atom Values and Vectors" discussion above. Note that some fixes only generate quantities on certain timesteps. If a variable attempts to access the fix on non-allowed timesteps, an @@ -1260,6 +1274,10 @@ error is generated. For example, the :doc:`fix ave/time ` command may only generate averaged quantities every 100 steps. See the doc pages for individual fix commands for details. +If a variable containing a fix is evaluated directly in an input +script (not during a run), then the values accessed by the fix should +be current. See the discussion below about "Variable Accuracy". + ---------- Variable References @@ -1312,8 +1330,8 @@ produce only a global scalar or global vector or per-atom vector. For the I index, an integer can be specified or a variable name, specified as v_name, where name is the name of the variable. The -rules for this syntax are the same as for the "Atom Values and -Vectors" discussion above. +rules for this syntax are the same as for indices in the "Atom Values +and Vectors" discussion above. ---------- From 95e9e6549f6a2658e7f361c4e40616478f274856 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 18 Aug 2023 09:28:58 -0600 Subject: [PATCH 056/417] simply variable.cpp --- src/variable.cpp | 347 ++++++++++++++++++++++++----------------------- 1 file changed, 180 insertions(+), 167 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index cf2e5c3b6f..5013f3ce55 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1469,8 +1469,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (domain->box_exist == 0) print_var_error(FLERR,"Variable evaluation before simulation box is defined",ivar); - // uppercase used to force access of - // global vector vs global scalar, and global array vs global vector + // uppercase used to access of peratom data by equal-style var int lowercase = 1; if (word[0] == 'C') lowercase = 0; @@ -1479,7 +1478,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute) print_var_error(FLERR,fmt::format("Invalid compute ID '{}' in variable formula", word+2),ivar); - // parse zero or one or two trailing brackets // point i beyond last bracket // nbracket = # of bracket pairs @@ -1501,107 +1499,203 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } } - // c_ID = scalar from global scalar, must be lowercase + // equal-style variable is being evaluated - if (nbracket == 0 && compute->scalar_flag && lowercase) { + if (style[ivar] == EQUAL) { + + // c_ID = scalar from global scalar - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_SCALAR)) { - compute->compute_scalar(); - compute->invoked_flag |= Compute::INVOKED_SCALAR; - } + if (lowercase && nbracket == 0) { - value1 = compute->scalar; - if (tree) { - auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; - treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + if (!compute->scalar_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); - // c_ID[i] = scalar from global vector, must be lowercase + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_SCALAR)) { + compute->compute_scalar(); + compute->invoked_flag |= Compute::INVOKED_SCALAR; + } - } else if (nbracket == 1 && compute->vector_flag && lowercase) { + value1 = compute->scalar; + argstack[nargstack++] = value1; - if (index1 > compute->size_vector && - compute->size_vector_variable == 0) - print_var_error(FLERR,"Variable formula compute vector is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { - compute->compute_vector(); - compute->invoked_flag |= Compute::INVOKED_VECTOR; - } + // c_ID[i] = scalar from global vector + + } else if (lowercase && nbracket == 1) { + + if (!compute->vector_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index1 > compute->size_vector && + compute->size_vector_variable == 0) + print_var_error(FLERR,"Variable formula compute vector is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { + compute->compute_vector(); + compute->invoked_flag |= Compute::INVOKED_VECTOR; + } if (compute->size_vector_variable && index1 > compute->size_vector) value1 = 0.0; else value1 = compute->vector[index1-1]; - if (tree) { + argstack[nargstack++] = value1; + + // c_ID[i][j] = scalar from global array + + } else if (lowercase && nbracket == 2) { + + if (!compute->array_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index1 > compute->size_array_rows && + compute->size_array_rows_variable == 0) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (index2 > compute->size_array_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { + compute->compute_array(); + compute->invoked_flag |= Compute::INVOKED_ARRAY; + } + + if (compute->size_array_rows_variable && + index1 > compute->size_array_rows) value1 = 0.0; + else value1 = compute->array[index1-1][index2-1]; + argstack[nargstack++] = value1; + + // C_ID[i] = scalar element of per-atom vector + + } else if (!lowercase && nbracket == 1) { + + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } + + peratom2global(1,nullptr,compute->vector_atom,1,index1,tree, + treestack,ntreestack,argstack,nargstack); + + // C_ID[i][j] = scalar element of per-atom array + + } else if (!lowercase && nbracket == 2) { + + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index2 > compute->size_peratom_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } + + if (compute->array_atom) + peratom2global(1,nullptr,&compute->array_atom[0][index2-1], + compute->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + else + peratom2global(1,nullptr,nullptr,compute->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + + // no other possibilities for equal-style variable, so error + + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // vector-style variable is being evaluated + + } else if (style[ivar] == VECTOR) { + + // c_ID = vector from global vector + + if (lowercase && nbracket == 0) { + + if (!compute->vector_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // c_ID[i] = vector from global array + + } else if (lowercase && nbracket == 1) { + + if (!compute->array_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // no other possibilities for vector-style variable, so error + + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + + // atom-style variable is being evaluated + + } else if (style[ivar] == ATOM) { + + // c_ID = vector from per-atom vector + + if (lowercase && nbracket == 0) { + + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } + auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = ATOMARRAY; + newtree->array = compute->vector_atom; + newtree->nstride = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // c_ID[i] = vector from per-atom array - // c_ID[i][j] = scalar from global array, must be lowercase + } else if (lowercase && nbracket == 1) { - } else if (nbracket == 2 && compute->array_flag && lowercase) { + if (!compute->peratom_flag) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (!compute->size_peratom_cols) + print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (index1 > compute->size_peratom_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { + compute->compute_peratom(); + compute->invoked_flag |= Compute::INVOKED_PERATOM; + } - if (index1 > compute->size_array_rows && - compute->size_array_rows_variable == 0) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (index2 > compute->size_array_cols) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { - compute->compute_array(); - compute->invoked_flag |= Compute::INVOKED_ARRAY; - } - - if (compute->size_array_rows_variable && - index1 > compute->size_array_rows) value1 = 0.0; - else value1 = compute->array[index1-1][index2-1]; - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = ATOMARRAY; + newtree->array = nullptr; + if (compute->array_atom) + newtree->array = &compute->array_atom[0][index1-1]; + newtree->nstride = compute->size_peratom_cols; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; - // c_ID = vector from global vector, lowercase or uppercase - - } else if (nbracket == 0 && compute->vector_flag) { - - if (tree == nullptr) - print_var_error(FLERR,"Compute global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Compute global vector in atom-style variable formula",ivar); - if (compute->size_vector == 0) - print_var_error(FLERR,"Variable formula compute vector is zero length",ivar); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { - compute->compute_vector(); - compute->invoked_flag |= Compute::INVOKED_VECTOR; - } - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = compute->vector; - newtree->nvector = compute->size_vector; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // c_ID[i] = vector from global array, lowercase or uppercase - - } else if (nbracket == 1 && compute->array_flag) { + // no other possibilities for atom-style variable, so error + + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + } + if (tree == nullptr) print_var_error(FLERR,"Compute global vector in equal-style variable formula",ivar); if (treetype == ATOM) @@ -1623,97 +1717,16 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nstride = compute->size_array_cols; treestack[ntreestack++] = newtree; - // c_ID[i] = scalar from per-atom vector - } else if (nbracket == 1 && compute->peratom_flag && - compute->size_peratom_cols == 0) { - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - peratom2global(1,nullptr,compute->vector_atom,1,index1,tree, - treestack,ntreestack,argstack,nargstack); - // c_ID[i][j] = scalar from per-atom array - } else if (nbracket == 2 && compute->peratom_flag && - compute->size_peratom_cols > 0) { - if (index2 > compute->size_peratom_cols) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - if (compute->array_atom) - peratom2global(1,nullptr,&compute->array_atom[0][index2-1],compute->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - else - peratom2global(1,nullptr,nullptr,compute->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - // c_ID = vector from per-atom vector - - } else if (nbracket == 0 && compute->peratom_flag && - compute->size_peratom_cols == 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom compute in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Per-atom compute in vector-style variable formula",ivar); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - newtree->array = compute->vector_atom; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // c_ID[i] = vector from per-atom array - - } else if (nbracket == 1 && compute->peratom_flag && - compute->size_peratom_cols > 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom compute in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Per-atom compute in vector-style variable formula",ivar); - if (index1 > compute->size_peratom_cols) - print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) { - compute->compute_peratom(); - compute->invoked_flag |= Compute::INVOKED_PERATOM; - } - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - if (compute->array_atom) - newtree->array = &compute->array_atom[0][index1-1]; - newtree->nstride = compute->size_peratom_cols; - 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); + // ---------------- // fix // ---------------- From 91d826a5d660e2e00f5a016dfb8db189cbde1985 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 18 Aug 2023 09:34:46 -0600 Subject: [PATCH 057/417] changed compute section of variable formulas --- src/variable.cpp | 62 +++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 5013f3ce55..a41c12d111 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1626,6 +1626,22 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute->vector_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_vector == 0) + print_var_error(FLERR,"Variable formula compute vector is zero length",ivar); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { + compute->compute_vector(); + compute->invoked_flag |= Compute::INVOKED_VECTOR; + } + + auto newtree = new Tree(); + newtree->type = VECTORARRAY; + newtree->array = compute->vector; + newtree->nvector = compute->size_vector; + newtree->nstride = 1; + treestack[ntreestack++] = newtree; // c_ID[i] = vector from global array @@ -1633,6 +1649,24 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute->array_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); + if (compute->size_array_rows == 0) + print_var_error(FLERR,"Variable formula compute array is zero length",ivar); + if (index1 > compute->size_array_cols) + print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0); + if (!compute->is_initialized()) + print_var_error(FLERR,"Variable formula compute cannot be invoked before " + "initialization by a run",ivar); + if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { + compute->compute_array(); + compute->invoked_flag |= Compute::INVOKED_ARRAY; + } + + auto newtree = new Tree(); + newtree->type = VECTORARRAY; + newtree->array = &compute->array[0][index1-1]; + newtree->nvector = compute->size_array_rows; + newtree->nstride = compute->size_array_cols; + treestack[ntreestack++] = newtree; // no other possibilities for vector-style variable, so error @@ -1695,38 +1729,12 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); } - - if (tree == nullptr) - print_var_error(FLERR,"Compute global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Compute global vector in atom-style variable formula",ivar); - if (compute->size_array_rows == 0) - print_var_error(FLERR,"Variable formula compute array is zero length",ivar); - if (!compute->is_initialized()) - print_var_error(FLERR,"Variable formula compute cannot be invoked before " - "initialization by a run",ivar); - if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { - compute->compute_array(); - compute->invoked_flag |= Compute::INVOKED_ARRAY; - } - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = &compute->array[0][index1-1]; - newtree->nvector = compute->size_array_rows; - newtree->nstride = compute->size_array_cols; - treestack[ntreestack++] = newtree; - - - - - - + // ---------------- // fix // ---------------- From 6e1529ddff9068529f70e8aa29f16c0e49df36a6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 18 Aug 2023 13:18:50 -0600 Subject: [PATCH 058/417] finish changes to variables --- doc/src/variable.rst | 91 +++---- src/variable.cpp | 553 +++++++++++++++++++++++-------------------- 2 files changed, 338 insertions(+), 306 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 38e423b632..4541de5fa2 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1174,19 +1174,19 @@ The various allowed compute references in the variable formulas for equal-, vector-, and atom-style variables are listed in the following table: -+--------+------------+--------------------------------------------+ -| equal | c_ID | global scalar | -| equal | c_ID[I] | element of global vector | -| equal | c_ID[I][J] | element of global array | -| equal | C_ID[I] | element of per-atom vector, I = ID of atom | -| equal | C_ID{i}[J] | element of per-atom array, I = ID of atom | -+--------+------------+--------------------------------------------| -| vector | c_ID | global vector | -| vector | c_ID[I] | column of global array | ----------+------------+--------------------------------------------+ -| atom | c_ID | per-atom vector | -| atom | c_ID[I] | column of per-atom array | -+--------+------------+--------------------------------------------+ ++--------+------------+------------------------------------------+ +| equal | c_ID | global scalar | +| equal | c_ID[I] | element of global vector | +| equal | c_ID[I][J] | element of global array | +| equal | C_ID[I] | element of per-atom vector (I = atom ID) | +| equal | C_ID{i}[J] | element of per-atom array (I = atom ID) | ++--------+------------+------------------------------------------+ +| vector | c_ID | global vector | +| vector | c_ID[I] | column of global array | +---------+------------+------------------------------------------+ +| atom | c_ID | per-atom vector | +| atom | c_ID[I] | column of per-atom array | ++--------+------------+------------------------------------------+ Note that if an equal-style variable formula wishes to access per-atom data from a compute, it must use capital "C" as the ID prefix and not @@ -1235,23 +1235,22 @@ Atom-style variables can use scalar values (same as for equal-style varaibles), or per-atom vectors of values. The latter can also be a column of a per-atom array. -The various allowed fix references in the variable formulas for -equal-, vector-, and atom-style variables are listed in the following -table: +The allowed fix references in variable formulas for equal-, vector-, +and atom-style variables are listed in the following table: -+--------+------------+--------------------------------------------+ -| equal | f_ID | global scalar | -| equal | f_ID[I] | element of global vector | -| equal | f_ID[I][J] | element of global array | -| equal | F_ID[I] | element of per-atom vector, I = ID of atom | -| equal | F_ID{i}[J] | element of per-atom array, I = ID of atom | -+--------+------------+--------------------------------------------| -| vector | f_ID | global vector | -| vector | f_ID[I] | column of global array | ----------+------------+--------------------------------------------+ -| atom | f_ID | per-atom vector | -| atom | f_ID[I] | column of per-atom array | -+--------+------------+--------------------------------------------+ ++--------+------------+------------------------------------------+ +| equal | f_ID | global scalar | +| equal | f_ID[I] | element of global vector | +| equal | f_ID[I][J] | element of global array | +| equal | F_ID[I] | element of per-atom vector (I = atom ID) | +| equal | F_ID{i}[J] | element of per-atom array (I = atom ID) | ++--------+------------+------------------------------------------+ +| vector | f_ID | global vector | +| vector | f_ID[I] | column of global array | +---------+------------+------------------------------------------+ +| atom | f_ID | per-atom vector | +| atom | f_ID[I] | column of per-atom array | ++--------+------------+------------------------------------------+ Note that if an equal-style variable formula wishes to access per-atom data from a fix, it must use capital "F" as the ID prefix and not @@ -1312,21 +1311,27 @@ including other atom-style or atomfile-style variables. If it uses a vector-style variable, a subscript must be used to access a single value from the vector-style variable. -Examples of different kinds of variable references are as follows. -There is no ambiguity as to what a reference means, since variables -produce only a global scalar or global vector or per-atom vector. +The allowed variable references in variable formulas for equal-, +vector-, and atom-style variables are listed in the following table. +Note that there is no ambiguity as to what a reference means, since +referenced variables produce only a global scalar or global vector or +per-atom vector. -+------------+----------------------------------------------------------------------+ -| v_name | global scalar from equal-style variable | -+------------+----------------------------------------------------------------------+ -| v_name | global vector from vector-style variable | -+------------+----------------------------------------------------------------------+ -| v_name | per-atom vector from atom-style or atomfile-style variable | -+------------+----------------------------------------------------------------------+ -| v_name[I] | Ith element of a global vector from vector-style variable | -+------------+----------------------------------------------------------------------+ -| v_name[I] | value of atom with ID = I from atom-style or atomfile-style variable | -+------------+----------------------------------------------------------------------+ ++--------+-----------+-----------------------------------------------------------------------------------+ +| equal | v_name | global scalar from an equal-style variable | +| equal | v_name[I] | element of global vector from a vector-style variable | +| equal | v_name[I] | element of per-atom vector (I = atom ID) from an atom- or atomfile-style variable | ++--------+-----------+-----------------------------------------------------------------------------------+ +| vector | v_name | global scalar from an equal-style variable | +| vector | v_name | global vector from a vector-style variable | +| vector | v_name[I] | element of global vector from a vector-style variable | +| vector | v_name[I] | element of per-atom vector (I = atom ID) from an atom- or atomfile-style variable | ++--------+-----------+-----------------------------------------------------------------------------------+ +| atom | v_name | global scalar from an equal-style variable | +| atom | v_name | per-atom vector from an atom-style or atomfile-style variable | +| atom | v_name[I] | element of global vector from a vector-style variable | +| atom | v_name[I] | element of per-atom vector (I = atom ID) from an atom- or atomfile-style variable | ++--------+-----------+-----------------------------------------------------------------------------------+ For the I index, an integer can be specified or a variable name, specified as v_name, where name is the name of the variable. The diff --git a/src/variable.cpp b/src/variable.cpp index a41c12d111..ce8f16cd68 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1509,7 +1509,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!compute->scalar_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); - if (!compute->is_initialized()) print_var_error(FLERR,"Variable formula compute cannot be invoked before " "initialization by a run",ivar); @@ -1567,7 +1566,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) else value1 = compute->array[index1-1][index2-1]; argstack[nargstack++] = value1; - // C_ID[i] = scalar element of per-atom vector + // C_ID[i] = scalar element of per-atom vector, note uppercase "C" } else if (!lowercase && nbracket == 1) { @@ -1586,7 +1585,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) peratom2global(1,nullptr,compute->vector_atom,1,index1,tree, treestack,ntreestack,argstack,nargstack); - // C_ID[i][j] = scalar element of per-atom array + // C_ID[i][j] = scalar element of per-atom array, note uppercase "C" } else if (!lowercase && nbracket == 2) { @@ -1728,12 +1727,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); } - - - - - - // ---------------- // fix @@ -1753,7 +1746,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!fix) print_var_error(FLERR,fmt::format("Invalid fix ID '{}' in variable formula",word+2),ivar); - // parse zero or one or two trailing brackets // point i beyond last bracket // nbracket = # of bracket pairs @@ -1775,181 +1767,200 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } } - // f_ID = scalar from global scalar, must be lowercase + // equal-style variable is being evaluated - if (nbracket == 0 && fix->scalar_flag && lowercase) { + if (style[ivar] == EQUAL) { + + // f_ID = scalar from global scalar - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + if (lowercase && nbracket == 0) { - value1 = fix->compute_scalar(); - if (tree) { + if (!fix->scalar_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + value1 = fix->compute_scalar(); + argstack[nargstack++] = value1; + + // f_ID[i] = scalar from global vector + + } else if (lowercase && nbracket == 1) { + + if (!fix->vector_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index1 > fix->size_vector && + fix->size_vector_variable == 0) + print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + value1 = fix->compute_vector(index1-1); + argstack[nargstack++] = value1; + + // f_ID[i][j] = scalar from global array + + } else if (lowercase && nbracket == 2) { + + if (!fix->array_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index1 > fix->size_array_rows && + fix->size_array_rows_variable == 0) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (index2 > fix->size_array_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + value1 = fix->compute_array(index1-1,index2-1); + argstack[nargstack++] = value1; + + // F_ID[i] = scalar element of per-atom vector, note uppercase "F" + + } else if (!lowercase && nbracket == 1) { + + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (update->whichflag > 0 && + update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + peratom2global(1,nullptr,fix->vector_atom,1,index1,tree, + treestack,ntreestack,argstack,nargstack); + + // F_ID[i][j] = scalar element of per-atom array, note uppercase "F" + + } else if (!lowercase && nbracket == 2) { + + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (!fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index2 > fix->size_peratom_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + + if (fix->array_atom) + peratom2global(1,nullptr,&fix->array_atom[0][index2-1], + fix->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + else + peratom2global(1,nullptr,nullptr,fix->size_peratom_cols,index1, + tree,treestack,ntreestack,argstack,nargstack); + + // no other possibilities for equal-style variable, so error + + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + + // vector-style variable is being evaluated + + } else if (style[ivar] == VECTOR) { + + // f_ID = vector from global vector + + if (lowercase && nbracket == 0) { + + if (!fix->vector_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_vector == 0) + print_var_error(FLERR,"Variable formula fix vector is zero length",ivar); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); + + int nvec = fix->size_vector; + double *vec; + memory->create(vec,nvec,"variable:values"); + for (int m = 0; m < nvec; m++) + vec[m] = fix->compute_vector(m); + auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = VECTORARRAY; + newtree->array = vec; + newtree->nvector = nvec; + newtree->nstride = 1; + newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // f_ID[i] = vector from global array - // f_ID[i] = scalar from global vector, must be lowercase + } else if (lowercase && nbracket == 1) { - } else if (nbracket == 1 && fix->vector_flag && lowercase) { + if (!fix->array_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_array_rows == 0) + print_var_error(FLERR,"Variable formula fix array is zero length",ivar); + if (index1 > fix->size_array_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->global_freq) + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - if (index1 > fix->size_vector && - fix->size_vector_variable == 0) - print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + int nvec = fix->size_array_rows; + double *vec; + memory->create(vec,nvec,"variable:values"); + for (int m = 0; m < nvec; m++) + vec[m] = fix->compute_array(m,index1-1); - value1 = fix->compute_vector(index1-1); - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = VECTORARRAY; + newtree->array = vec; + newtree->nvector = nvec; + newtree->nstride = 1; + newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // no other possibilities for vector-style variable, so error + + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); - // f_ID[i][j] = scalar from global array, must be lowercase + // atom-style variable is being evaluated - } else if (nbracket == 2 && fix->array_flag && lowercase) { + } else if (style[ivar] == ATOM) { + + // f_ID = vector from per-atom vector - if (index1 > fix->size_array_rows && - fix->size_array_rows_variable == 0) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (index2 > fix->size_array_cols) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + if (lowercase && nbracket == 0) { + + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - value1 = fix->compute_array(index1-1,index2-1); - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; + newtree->type = ATOMARRAY; + newtree->array = fix->vector_atom; + newtree->nstride = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + + // f_ID[i] = vector from per-atom array - // f_ID = vector from global vector, lowercase or uppercase + } else if (lowercase && nbracket == 1) { - } else if (nbracket == 0 && fix->vector_flag) { + if (!fix->peratom_flag) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (!fix->size_peratom_cols) + print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + if (index1 > fix->size_peratom_cols) + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); + if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - if (tree == nullptr) - print_var_error(FLERR,"Fix global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Fix global vector in atom-style variable formula",ivar); - if (fix->size_vector == 0) - print_var_error(FLERR,"Variable formula fix vector is zero length",ivar); + auto newtree = new Tree(); + newtree->type = ATOMARRAY; + newtree->array = nullptr; + if (fix->array_atom) + newtree->array = &fix->array_atom[0][index1-1]; + newtree->nstride = fix->size_peratom_cols; + treestack[ntreestack++] = newtree; - int nvec = fix->size_vector; - double *vec; - memory->create(vec,nvec,"variable:values"); - for (int m = 0; m < nvec; m++) - vec[m] = fix->compute_vector(m); - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = vec; - newtree->nvector = nvec; - newtree->nstride = 1; - newtree->selfalloc = 1; - treestack[ntreestack++] = newtree; - - // f_ID[i] = vector from global array, lowercase or uppercase - - } else if (nbracket == 1 && fix->array_flag) { - - if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - if (tree == nullptr) - print_var_error(FLERR,"Fix global vector in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Fix global vector in atom-style variable formula",ivar); - if (fix->size_array_rows == 0) - print_var_error(FLERR,"Variable formula fix array is zero length",ivar); - - int nvec = fix->size_array_rows; - double *vec; - memory->create(vec,nvec,"variable:values"); - for (int m = 0; m < nvec; m++) - vec[m] = fix->compute_array(m,index1-1); - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = vec; - newtree->nvector = nvec; - newtree->nstride = 1; - newtree->selfalloc = 1; - treestack[ntreestack++] = newtree; - - // f_ID[i] = scalar from per-atom vector - - } else if (nbracket == 1 && fix->peratom_flag && - fix->size_peratom_cols == 0) { - - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - - peratom2global(1,nullptr,fix->vector_atom,1,index1, - tree,treestack,ntreestack,argstack,nargstack); - - // f_ID[i][j] = scalar from per-atom array - - } else if (nbracket == 2 && fix->peratom_flag && - fix->size_peratom_cols > 0) { - - if (index2 > fix->size_peratom_cols) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - - if (fix->array_atom) - peratom2global(1,nullptr,&fix->array_atom[0][index2-1],fix->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - else - peratom2global(1,nullptr,nullptr,fix->size_peratom_cols,index1, - tree,treestack,ntreestack,argstack,nargstack); - - // f_ID = vector from per-atom vector - - } else if (nbracket == 0 && fix->peratom_flag && - fix->size_peratom_cols == 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar); - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - newtree->array = fix->vector_atom; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // f_ID[i] = vector from per-atom array - - } else if (nbracket == 1 && fix->peratom_flag && - fix->size_peratom_cols > 0) { - - if (tree == nullptr) - print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar); - if (index1 > fix->size_peratom_cols) - print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); - if (update->whichflag > 0 && - update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - if (fix->array_atom) - newtree->array = &fix->array_atom[0][index1-1]; - newtree->nstride = fix->size_peratom_cols; - treestack[ntreestack++] = newtree; - - } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + // no other possibilities for atom-style variable, so error + + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); + } // ---------------- // variable @@ -1979,124 +1990,140 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) i = ptr-str+1; } - // v_name = scalar from internal-style variable - // access value directly + // vname with no bracket - if (nbracket == 0 && style[ivar] == INTERNAL) { + if (nbracket == 0) { - value1 = dvalue[ivar]; - if (tree) { - auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = value1; - treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = value1; + // scalar from internal-style variable + // access value directly - // v_name = scalar from non atom/atomfile & non vector-style variable - // access value via retrieve() + if (style[ivar] = INTERNAL) { - } else if (nbracket == 0 && style[ivar] != ATOM && - style[ivar] != ATOMFILE && style[ivar] != VECTOR) { + value1 = dvalue[ivar]; + if (tree) { + auto newtree = new Tree(); + newtree->type = VALUE; + newtree->value = value1; + treestack[ntreestack++] = newtree; + } else argstack[nargstack++] = value1; - char *var = retrieve(word+2); - if (var == nullptr) - print_var_error(FLERR,"Invalid variable evaluation in variable formula",ivar); - if (utils::is_double(var)) { + // scalar from any style variable except VECTOR, ATOM, ATOMFILE + // access value via retrieve() + + } else if (style[ivar] != ATOM && style[ivar] != ATOMFILE && style[ivar] != VECTOR) { + + char *var = retrieve(word+2); + if (var == nullptr) + print_var_error(FLERR,"Invalid variable evaluation in variable formula",ivar); + if (!utils::is_double(var)) + print_var_error(FLERR,"Non-numeric variable value in variable formula",ivar); if (tree) { auto newtree = new Tree(); newtree->type = VALUE; newtree->value = atof(var); treestack[ntreestack++] = newtree; } else argstack[nargstack++] = atof(var); - } else print_var_error(FLERR,"Non-numeric variable value in variable formula",ivar); - // v_name = per-atom vector from atom-style variable - // evaluate the atom-style variable as newtree + // vector from vector-style variable + // evaluate the vector-style variable, put result in newtree - } else if (nbracket == 0 && style[ivar] == ATOM) { + } else if (style[ivar] == VECTOR) { - if (tree == nullptr) - print_var_error(FLERR,"Atom-style variable in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Atom-style variable in vector-style variable formula",ivar); + if (tree == nullptr) + print_var_error(FLERR,"Vector-style variable in equal-style variable formula",ivar); + if (treetype == ATOM) + print_var_error(FLERR,"Vector-style variable in atom-style variable formula",ivar); - Tree *newtree = nullptr; - evaluate(data[ivar][0],&newtree,ivar); - treestack[ntreestack++] = newtree; + double *vec; + int nvec = compute_vector(ivar,&vec); - // v_name = per-atom vector from atomfile-style variable - - } else if (nbracket == 0 && style[ivar] == ATOMFILE) { - - if (tree == nullptr) - print_var_error(FLERR,"Atomfile-style variable in equal-style variable formula",ivar); - if (treetype == VECTOR) - print_var_error(FLERR,"Atomfile-style variable in vector-style variable formula",ivar); - - auto newtree = new Tree(); - newtree->type = ATOMARRAY; - newtree->array = reader[ivar]->fixstore->vstore; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // v_name = vector from vector-style variable - // evaluate the vector-style variable, put result in newtree - - } else if (nbracket == 0 && style[ivar] == VECTOR) { - - if (tree == nullptr) - print_var_error(FLERR,"Vector-style variable in equal-style variable formula",ivar); - if (treetype == ATOM) - print_var_error(FLERR,"Vector-style variable in atom-style variable formula",ivar); - - double *vec; - int nvec = compute_vector(ivar,&vec); - - auto newtree = new Tree(); - newtree->type = VECTORARRAY; - newtree->array = vec; - newtree->nvector = nvec; - newtree->nstride = 1; - treestack[ntreestack++] = newtree; - - // v_name[N] = scalar from atom-style variable - // compute the per-atom variable in result - // use peratom2global to extract single value from result - - } else if (nbracket && style[ivar] == ATOM) { - - double *result; - memory->create(result,atom->nlocal,"variable:result"); - compute_atom(ivar,0,result,1,0); - peratom2global(1,nullptr,result,1,index,tree,treestack,ntreestack,argstack,nargstack); - memory->destroy(result); - - // v_name[N] = scalar from atomfile-style variable - - } else if (nbracket && style[ivar] == ATOMFILE) { - - peratom2global(1,nullptr,reader[ivar]->fixstore->vstore,1,index, - tree,treestack,ntreestack,argstack,nargstack); - - // v_name[N] = scalar from vector-style variable - // compute the vector-style variable, extract single value - - } else if (nbracket && style[ivar] == VECTOR) { - - double *vec; - int nvec = compute_vector(ivar,&vec); - if (index <= 0 || index > nvec) - print_var_error(FLERR,"Invalid index into vector-style variable",ivar); - int m = index; // convert from tagint to int - - if (tree) { auto newtree = new Tree(); - newtree->type = VALUE; - newtree->value = vec[m-1]; + newtree->type = VECTORARRAY; + newtree->array = vec; + newtree->nvector = nvec; + newtree->nstride = 1; treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = vec[m-1]; - } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); + // vector from atom-style variable + // evaluate the atom-style variable as newtree + + } else if (style[ivar] == ATOM) { + + if (tree == nullptr) + print_var_error(FLERR,"Atom-style variable in equal-style variable formula",ivar); + if (treetype == VECTOR) + print_var_error(FLERR,"Atom-style variable in vector-style variable formula",ivar); + + Tree *newtree = nullptr; + evaluate(data[ivar][0],&newtree,ivar); + treestack[ntreestack++] = newtree; + + // vector from atomfile-style variable + // point to the values in FixStore instance + + } else if (style[ivar] == ATOMFILE) { + + if (tree == nullptr) + print_var_error(FLERR,"Atomfile-style variable in equal-style variable formula",ivar); + if (treetype == VECTOR) + print_var_error(FLERR,"Atomfile-style variable in vector-style variable formula",ivar); + + auto newtree = new Tree(); + newtree->type = ATOMARRAY; + newtree->array = reader[ivar]->fixstore->vstore; + newtree->nstride = 1; + treestack[ntreestack++] = newtree; + + // no other possibilities for variable with no bracket + + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); + + // vname[i] with one bracket + + } else if (nbracket == 1) { + + // scalar from vector-style variable + // compute the vector-style variable, extract single value + + if (style[ivar] == VECTOR) { + + double *vec; + int nvec = compute_vector(ivar,&vec); + if (index <= 0 || index > nvec) + print_var_error(FLERR,"Invalid index into vector-style variable",ivar); + int m = index; // convert from tagint to int + + if (tree) { + auto newtree = new Tree(); + newtree->type = VALUE; + newtree->value = vec[m-1]; + treestack[ntreestack++] = newtree; + } else argstack[nargstack++] = vec[m-1]; + + // scalar from atom-style variable + // compute the per-atom variable in result + // use peratom2global to extract single value from result + + } else if (style[ivar] == ATOM) { + + double *result; + memory->create(result,atom->nlocal,"variable:result"); + compute_atom(ivar,0,result,1,0); + peratom2global(1,nullptr,result,1,index,tree,treestack,ntreestack,argstack,nargstack); + memory->destroy(result); + + // scalar from atomfile-style variable + // use peratom2global to extract single value from FixStore instance + + } else if (style[ivar] == ATOMFILE) { + + peratom2global(1,nullptr,reader[ivar]->fixstore->vstore,1,index, + tree,treestack,ntreestack,argstack,nargstack); + + // no other possibilities for variable with one bracket + + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); + } // ---------------- // math/group/special/labelmap function or atom value/vector or From c6233547a531cee52049780592e8c3589960633d Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 21 Aug 2023 09:39:00 -0600 Subject: [PATCH 059/417] update compute and fix doc pages for new generality --- doc/src/compute.rst | 114 ++++++++++++++++++++++++-------------------- doc/src/fix.rst | 89 +++++++++++++++++++--------------- 2 files changed, 113 insertions(+), 90 deletions(-) diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 226dc6373b..2780cac368 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -27,58 +27,62 @@ Examples Description """"""""""" -Define a computation that will be performed on a group of atoms. -Quantities calculated by a compute are instantaneous values, meaning -they are calculated from information about atoms on the current -timestep or iteration, though a compute may internally store some -information about a previous state of the system. Defining a compute -does not perform a computation. Instead computes are invoked by other -LAMMPS commands as needed (e.g., to calculate a temperature needed for -a thermostat fix or to generate thermodynamic or dump file output). -See the :doc:`Howto output ` page for a summary of -various LAMMPS output options, many of which involve computes. +Define a diagnostic computation that will be performed on a group of +atoms. Quantities calculated by a compute are instantaneous values, +meaning they are calculated from information about atoms on the +current timestep or iteration, though internally a compute may store +some information about a previous state of the system. Defining a +compute does not perform the computation. Instead computes are +invoked by other LAMMPS commands as needed (e.g., to calculate a +temperature needed for a thermostat fix or to generate thermodynamic +or dump file output). See the :doc:`Howto output ` page +for a summary of various LAMMPS output options, many of which involve +computes. The ID of a compute can only contain alphanumeric characters and underscores. ---------- -Computes calculate and store any of four styles of quantities: global, -per-atom, local, or per-grid. A global quantity is one or more -system-wide values, e.g. the temperature of the system. A per-atom -quantity is one or more values per atom, e.g. the kinetic energy of -each atom. Per-atom values are set to 0.0 for atoms not in the -specified compute group. Local quantities are calculated by each -processor based on the atoms it owns, but there may be zero or more -per atom, e.g. a list of bond distances. Per-grid quantities are -calculated on a regular 2d or 3d grid which overlays a 2d or 3d -simulation domain. The grid points and the data they store are -distributed across processors; each processor owns the grid points -which fall within its subdomain. +Computes calculate and store any of four *styles* of quantities: +global, per-atom, local, or per-grid. -Computes that produce per-atom quantities have the word "atom" at the -end of their style, e.g. *ke/atom*\ . Computes that produce local -quantities have the word "local" at the end of their style, -e.g. *bond/local*\ . Computes that produce per-grid quantities have -the word "grid" at the end of their style, e.g. *property/grid*\ . -Styles with neither "atom" or "local" or "grid" at the end of their -style name produce global quantities. +A global quantity is one or more system-wide values, e.g. the +temperature of the system. A per-atom quantity is one or more values +per atom, e.g. the kinetic energy of each atom. Per-atom values are +set to 0.0 for atoms not in the specified compute group. Local +quantities are calculated by each processor based on the atoms it +owns, but there may be zero or more per atom, e.g. a list of bond +distances. Per-grid quantities are calculated on a regular 2d or 3d +grid which overlays a 2d or 3d simulation domain. The grid points and +the data they store are distributed across processors; each processor +owns the grid points which fall within its subdomain. -Note that a single compute typically produces either global or -per-atom or local or per-grid values. It does not compute both global -and per-atom values. It can produce local values or per-grid values -in tandem with global or per-atom quantities. The compute doc page -will explain the details. +As a general rule of thumb, computes that produce per-atom quantities +have the word "atom" at the end of their style, e.g. *ke/atom*\ . +Computes that produce local quantities have the word "local" at the +end of their style, e.g. *bond/local*\ . Computes that produce +per-grid quantities have the word "grid" at the end of their style, +e.g. *property/grid*\ . And styles with neither "atom" or "local" or +"grid" at the end of their style name produce global quantities. -Global, per-atom, local, and per-grid quantities come in three kinds: -a single scalar value, a vector of values, or a 2d array of values. -The doc page for each compute describes the style and kind of values -it produces, e.g. a per-atom vector. Some computes produce more than -one kind of a single style, e.g. a global scalar and a global vector. +Global, per-atom, local, and per-grid quantities can also be of three +*kinds*: a single scalar value (global only), a vector of values, or a +2d array of values. For per-atom, local, and per-grid quantities, a +"vector" means a single value for each atom, each local entity +(e.g. bond), or grid cell. Likewise an "array", means multiple values +for each atom, each local entity, or each grid cell. -When a compute quantity is accessed, as in many of the output commands -discussed below, it can be referenced via the following bracket -notation, where ID is the ID of the compute: +Note that a single compute can produce any combination of global, +per-atom, local, or per-grid values. Likewise it can prouduce any +combination of scalar, vector, or array output for each style. The +exception is that for per-atom, local, and per-grid output, either a +vector or array can be produced, but not both. The doc page for each +compute explains the values it produces. + +When a compute output is accessed by another input script command it +is referenced via the following bracket notation, where ID is the ID +of the compute: +-------------+--------------------------------------------+ | c_ID | entire scalar, vector, or array | @@ -89,17 +93,23 @@ notation, where ID is the ID of the compute: +-------------+--------------------------------------------+ In other words, using one bracket reduces the dimension of the -quantity once (vector :math:`\to` scalar, array :math:`\to` vector). Using two -brackets reduces the dimension twice (array :math:`\to` scalar). Thus a -command that uses scalar compute values as input can also process elements of a -vector or array. +quantity once (vector :math:`\to` scalar, array :math:`\to` vector). +Using two brackets reduces the dimension twice (array :math:`\to` +scalar). Thus, for example, a command that uses global scalar compute +values as input can also process elements of a vector or array. +Depending on the command, this can either be done directly using the +syntax in the table, or by first defining a :doc:`variable ` +of the appropriate style to store the quantity, then using the +variable as an input to the command. -Note that commands and :doc:`variables ` which use compute -quantities typically do not allow for all kinds (e.g., a command may -require a vector of values, not a scalar). This means there is no -ambiguity about referring to a compute quantity as c_ID even if it -produces, for example, both a scalar and vector. The doc pages for -various commands explain the details. +Note that commands and :doc:`variables ` which take compute +outputs as input typically do not allow for all styles and kinds of +data (e.g., a command may require global but not per-atom values, or +it may require a vector of values, not a scalar). This means there is +typically no ambiguity about referring to a compute output as c_ID +even if it produces, for example, both a scalar and vector. The doc +pages for various commands explain the details, including how any +ambiguities are resolved. ---------- diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 09fc05d500..a879a45e05 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -77,35 +77,44 @@ for individual fixes for info on which ones can be restarted. ---------- -Some fixes calculate one or more of four styles of quantities: global, -per-atom, local, or per-grid, which can be used by other commands or -output as described below. A global quantity is one or more -system-wide values, e.g. the energy of a wall interacting with -particles. A per-atom quantity is one or more values per atom, -e.g. the displacement vector for each atom since time 0. Per-atom -values are set to 0.0 for atoms 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. Per-grid quantities -are calculated on a regular 2d or 3d grid which overlays a 2d or 3d -simulation domain. The grid points and the data they store are -distributed across processors; each processor owns the grid points -which fall within its subdomain. +Some fixes calculate and store any of four *styles* of quantities: +global, per-atom, local, or per-grid. -Note that a single fix typically produces either global or per-atom or -local or per-grid values (or none at all). It does not produce both -global and per-atom. It can produce local or per-grid values in -tandem with global or per-atom values. The fix doc page will explain -the details. +A global quantity is one or more system-wide values, e.g. the energy +of a wall interacting with particles. A per-atom quantity is one or +more values per atom, e.g. the original coordinates of each atom at +time 0. Per-atom values are set to 0.0 for atoms 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 atom, e.g. values +for each bond. Per-grid quantities are calculated on a regular 2d or +3d grid which overlays a 2d or 3d simulation domain. The grid points +and the data they store are distributed across processors; each +processor owns the grid points which fall within its subdomain. -Global, per-atom, local, and per-grid quantities come in three kinds: -a single scalar value, a vector of values, or a 2d array of values. -The doc page for each fix describes the style and kind of values it -produces, e.g. a per-atom vector. Some fixes produce more than one -kind of a single style, e.g. a global scalar and a global vector. +As a general rule of thumb, fixes that produce per-atom quantities +have the word "atom" at the end of their style, e.g. *ave/atom*\ . +Fixes that produce local quantities have the word "local" at the end +of their style, e.g. *store/local*\ . Fixes that produce per-grid +quantities have the word "grid" at the end of their style, +e.g. *ave/grid*\ . -When a fix quantity is accessed, as in many of the output commands -discussed below, it can be referenced via the following bracket -notation, where ID is the ID of the fix: +Global, per-atom, local, and per-grid quantities can also be of three +*kinds*: a single scalar value (global only), a vector of values, or a +2d array of values. For per-atom, local, and per-grid quantities, a +"vector" means a single value for each atom, each local entity +(e.g. bond), or grid cell. Likewise an "array", means multiple values +for each atom, each local entity, or each grid cell. + +Note that a single fix can produce any combination of global, +per-atom, local, or per-grid values. Likewise it can prouduce any +combination of scalar, vector, or array output for each style. The +exception is that for per-atom, local, and per-grid output, either a +vector or array can be produced, but not both. The doc page for each +fix explains the values it produces, if any. + +When a fix output is accessed by another input script command it is +referenced via the following bracket notation, where ID is the ID of +the fix: +-------------+--------------------------------------------+ | f_ID | entire scalar, vector, or array | @@ -116,19 +125,23 @@ notation, where ID is the ID of the fix: +-------------+--------------------------------------------+ In other words, using one bracket reduces the dimension of the -quantity once (vector :math:`\to` scalar, array :math:`\to` vector). Using two -brackets reduces the dimension twice (array :math:`\to` scalar). Thus, a -command that uses scalar fix values as input can also process elements of a -vector or array. +quantity once (vector :math:`\to` scalar, array :math:`\to` vector). +Using two brackets reduces the dimension twice (array :math:`\to` +scalar). Thus, for example, a command that uses global scalar fix +values as input can also process elements of a vector or array. +Depending on the command, this can either be done directly using the +syntax in the table, or by first defining a :doc:`variable ` +of the appropriate style to store the quantity, then using the +variable as an input to the command. -Note that commands and :doc:`variables ` that use fix -quantities typically do not allow for all kinds (e.g., a command may -require a vector of values, not a scalar), and even if they do, the context -in which they are called can be used to resolve which output is being -requested. This means there is no -ambiguity about referring to a fix quantity as f_ID even if it -produces, for example, both a scalar and vector. The doc pages for -various commands explain the details. +Note that commands and :doc:`variables ` which take fix +outputs as input typically do not allow for all styles and kinds of +data (e.g., a command may require global but not per-atom values, or +it may require a vector of values, not a scalar). This means there is +typically no ambiguity about referring to a fix output as c_ID even if +it produces, for example, both a scalar and vector. The doc pages for +various commands explain the details, including how any ambiguities +are resolved. ---------- From ab2b83f65430892d1f45a928248f01507b7ddfed Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 21 Aug 2023 10:54:42 -0600 Subject: [PATCH 060/417] clarify doc for fix ave/histo command --- doc/src/compute_reduce.rst | 26 +++--- doc/src/fix_ave_histo.rst | 42 +++++----- src/compute_reduce_region.cpp | 145 +++++++++++----------------------- src/fix_ave_histo.cpp | 2 +- 4 files changed, 86 insertions(+), 129 deletions(-) diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 31591d4419..4692e161b4 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -63,9 +63,11 @@ Description """"""""""" Define a calculation that "reduces" one or more vector inputs into -scalar values, one per listed input. The inputs can be per-atom or -local quantities and must all be the same kind (per-atom or local); -see discussion of the optional *inputs* keyword below. +scalar values, one per listed input. For the compute reduce command, +the inputs can be either per-atom or local quantities and must all be +of the same kind (per-atom or local); see discussion of the optional +*inputs* keyword below. The compute reduce/region command can only be +used with per-atom inputs. Atom attributes are per-atom quantities, :doc:`computes ` and :doc:`fixes ` can generate either per-atom or local quantities, @@ -92,13 +94,13 @@ values. Each listed input is operated on independently. For per-atom inputs, the group specified with this command means only atoms within the -group contribute to the result. For per-atom inputs, if the compute -reduce/region command is used, the atoms must also currently be within -the region. Note that an input that produces per-atom quantities may -define its own group which affects the quantities it returns. For -example, if a compute is used as an input which generates a per-atom -vector, it will generate values of 0.0 for atoms that are not in the -group specified for that compute. +group contribute to the result. Likewise for per-atom inputs, if the +compute reduce/region command is used, the atoms must also currently +be within the region. Note that an input that produces per-atom +quantities may define its own group which affects the quantities it +returns. For example, if a compute is used as an input which +generates a per-atom vector, it will generate values of 0.0 for atoms +that are not in the group specified for that compute. Each listed input can be an atom attribute (position, velocity, force component) or can be the result of a :doc:`compute ` or @@ -246,7 +248,9 @@ the quantities being reduced are in. Restrictions """""""""""" - none + +As noted above, the compute reduce/region command can only be used +with per-atom inputs. Related commands """""""""""""""" diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index 8bb66f0615..31e5476f9e 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -79,9 +79,10 @@ Description Use one or more values as inputs every few timesteps to create a single histogram. The histogram can then be averaged over longer -timescales. The resulting histogram can be used by other :doc:`output commands `, and can also be written to a file. The -fix ave/histo/weight command has identical syntax to fix ave/histo, -except that exactly two values must be specified. See details below. +timescales. The resulting histogram can be used by other :doc:`output +commands `, and can also be written to a file. The fix +ave/histo/weight command has identical syntax to fix ave/histo, except +that exactly two values must be specified. See details below. The group specified with this command is ignored for global and local input values. For per-atom input values, only atoms in the group @@ -96,14 +97,18 @@ different ways; see the discussion of the *beyond* keyword below. Each input value can be an atom attribute (position, velocity, force component) or can be the result of a :doc:`compute ` or -:doc:`fix ` or the evaluation of an equal-style or vector-style or -atom-style :doc:`variable `. The set of input values can be -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 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 disambiguate if necessary. +:doc:`fix ` or the evaluation of an equal-style or vector-style +or atom-style :doc:`variable `. The set of input values can +be 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 page for individual +"compute" and "fix" commands to see what kinds of quantities they +generate. + +Note that a compute or fix can produce multiple kinds of data (global, +per-atom, local). If LAMMPS cannot unambiguosly determine which kind +of data to use, the optional *kind* keyword discussed below can force +the desired disambiguation. Note that the output of this command is a single histogram for all input values combined together, not one histogram per input value. @@ -258,13 +263,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 *kind* keyword only needs to be used if any of the specfied input +computes or fixes produce more than one kind of output (global, +per-atom, local). If not, LAMMPS will determine the kind of data all +the inputs produce and verify it is all the same kind. If not, an +error will be triggered. 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 other 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* :math:`\le` value diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index 2f5a3de675..d0a32b8adf 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -35,13 +35,15 @@ static constexpr double BIG = 1.0e20; ComputeReduceRegion::ComputeReduceRegion(LAMMPS *lmp, int narg, char **arg) : ComputeReduce(lmp, narg, arg) { + if (input_mode == LOCAL) + error->all(FLERR,"Compute reduce/region cannot use local data as input"); } /* ---------------------------------------------------------------------- calculate reduced value for one input M and return it if flag = -1: sum/min/max/ave all values in vector - for per-atom quantities, limit to atoms in group and region + limit to atoms in group and region if mode = MIN or MAX, also set index to which vector value wins if flag >= 0: simply return vector[flag] ------------------------------------------------------------------------- */ @@ -59,6 +61,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) // initialization in case it has not yet been run, e.g. when // the compute was invoked right after it has been created + if ((val.which == ArgInfo::COMPUTE) || (val.which == ArgInfo::FIX)) { if (val.val.c == nullptr) init(); } @@ -99,52 +102,29 @@ double ComputeReduceRegion::compute_one(int m, int flag) // invoke compute if not previously invoked } else if (val.which == ArgInfo::COMPUTE) { - if (input_mode == PERATOM) { - if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { - val.val.c->compute_peratom(); - val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; - } - if (aidx == 0) { - double *compute_vector = val.val.c->vector_atom; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, compute_vector[i], i); - } else - one = compute_vector[flag]; - } else { - double **compute_array = val.val.c->array_atom; - int aidxm1 = aidx - 1; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, compute_array[i][aidxm1], i); - } else - one = compute_array[flag][aidxm1]; - } + if (!(val.val.c->invoked_flag & Compute::INVOKED_PERATOM)) { + val.val.c->compute_peratom(); + val.val.c->invoked_flag |= Compute::INVOKED_PERATOM; + } - } else if (input_mode == LOCAL) { - if (!(val.val.c->invoked_flag & Compute::INVOKED_LOCAL)) { - val.val.c->compute_local(); - val.val.c->invoked_flag |= Compute::INVOKED_LOCAL; - } - - if (aidx == 0) { - double *compute_vector = val.val.c->vector_local; - if (flag < 0) - for (int i = 0; i < val.val.c->size_local_rows; i++) combine(one, compute_vector[i], i); - else - one = compute_vector[flag]; - } else { - double **compute_array = val.val.c->array_local; - int aidxm1 = aidx - 1; - if (flag < 0) - for (int i = 0; i < val.val.c->size_local_rows; i++) + if (aidx == 0) { + double *compute_vector = val.val.c->vector_atom; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) + combine(one, compute_vector[i], i); + } else + one = compute_vector[flag]; + } else { + double **compute_array = val.val.c->array_atom; + int aidxm1 = aidx - 1; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) combine(one, compute_array[i][aidxm1], i); - else - one = compute_array[flag][aidxm1]; - } + } else + one = compute_array[flag][aidxm1]; } // check if fix frequency is a match @@ -153,45 +133,26 @@ double ComputeReduceRegion::compute_one(int m, int flag) if (update->ntimestep % val.val.f->peratom_freq) error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); - if (input_mode == PERATOM) { - if (aidx == 0) { - double *fix_vector = val.val.f->vector_atom; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, fix_vector[i], i); - } else - one = fix_vector[flag]; - } else { - double **fix_array = val.val.f->array_atom; - int aidxm1 = aidx - 1; - if (flag < 0) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) - combine(one, fix_array[i][aidxm1], i); - } else - one = fix_array[flag][aidxm1]; - } - - } else if (input_mode == LOCAL) { - if (aidx == 0) { - double *fix_vector = val.val.f->vector_local; - if (flag < 0) - for (int i = 0; i < val.val.f->size_local_rows; i++) combine(one, fix_vector[i], i); - else - one = fix_vector[flag]; - } else { - double **fix_array = val.val.f->array_local; - int aidxm1 = aidx - 1; - if (flag < 0) - for (int i = 0; i < val.val.f->size_local_rows; i++) + if (aidx == 0) { + double *fix_vector = val.val.f->vector_atom; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) + combine(one, fix_vector[i], i); + } else + one = fix_vector[flag]; + } else { + double **fix_array = val.val.f->array_atom; + int aidxm1 = aidx - 1; + if (flag < 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit && region->match(x[i][0], x[i][1], x[i][2])) combine(one, fix_array[i][aidxm1], i); - else - one = fix_array[flag][aidxm1]; - } + } else + one = fix_array[flag][aidxm1]; } - // evaluate atom-style variable + // evaluate atom-style variable } else if (val.which == ArgInfo::VARIABLE) { if (atom->nmax > maxatom) { @@ -220,25 +181,11 @@ bigint ComputeReduceRegion::count(int m) if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) return group->count(igroup, region); - else if (val.which == ArgInfo::COMPUTE) { - if (input_mode == PERATOM) { - return group->count(igroup, region); - } else if (input_mode == LOCAL) { - bigint ncount = val.val.c->size_local_rows; - bigint ncountall; - MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); - return ncountall; - } - } else if (val.which == ArgInfo::FIX) { - if (input_mode == PERATOM) { - return group->count(igroup, region); - } else if (input_mode == LOCAL) { - bigint ncount = val.val.f->size_local_rows; - bigint ncountall; - MPI_Allreduce(&ncount, &ncountall, 1, MPI_DOUBLE, MPI_SUM, world); - return ncountall; - } - } else if (val.which == ArgInfo::VARIABLE) + else if (val.which == ArgInfo::COMPUTE) + return group->count(igroup, region); + else if (val.which == ArgInfo::FIX) + return group->count(igroup, region); + else if (val.which == ArgInfo::VARIABLE) return group->count(igroup, region); bigint dummy = 0; diff --git a/src/fix_ave_histo.cpp b/src/fix_ave_histo.cpp index 0a2975bb2e..4503ad56f4 100644 --- a/src/fix_ave_histo.cpp +++ b/src/fix_ave_histo.cpp @@ -164,7 +164,7 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : } // check input args for kind consistency - // all inputs must all be global, per-atom, or local + // inputs must all be all either global, per-atom, or local if (nevery <= 0) error->all(FLERR,"Illegal {} nevery value: {}", mycmd, nevery); From aad232ffc64240a24f5421c46df0a5d84aceff0a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 22 Aug 2023 11:46:57 -0400 Subject: [PATCH 061/417] fix typo --- src/variable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variable.cpp b/src/variable.cpp index ce8f16cd68..f3c987f00c 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1997,7 +1997,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // scalar from internal-style variable // access value directly - if (style[ivar] = INTERNAL) { + if (style[ivar] == INTERNAL) { value1 = dvalue[ivar]; if (tree) { From 7d9c068da09d8135c2e672f2de21b1ed20f4510d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 22 Aug 2023 11:50:54 -0400 Subject: [PATCH 062/417] whitespace --- src/VORONOI/compute_voronoi_atom.cpp | 12 +++---- src/compute_reduce.cpp | 8 ++--- src/compute_reduce_region.cpp | 2 +- src/variable.cpp | 54 ++++++++++++++-------------- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/VORONOI/compute_voronoi_atom.cpp b/src/VORONOI/compute_voronoi_atom.cpp index eb4f53986f..b4f1aa3055 100644 --- a/src/VORONOI/compute_voronoi_atom.cpp +++ b/src/VORONOI/compute_voronoi_atom.cpp @@ -391,13 +391,13 @@ void ComputeVoronoi::checkOccupation() int i, j, k; double rx, ry, rz; - + int nlocal = atom->nlocal; int nall = atom->nghost + nlocal; double **x = atom->x; // prepare destination buffer for variable evaluation - + if (atom->nmax > lmax) { memory->destroy(lnext); lmax = atom->nmax; @@ -432,7 +432,7 @@ void ComputeVoronoi::checkOccupation() } // MPI sum occupation - + #ifdef NOTINPLACE memcpy(sendocc, occvec, oldnatoms*sizeof(*occvec)); MPI_Allreduce(sendocc, occvec, oldnatoms, MPI_INT, MPI_SUM, world); @@ -441,7 +441,7 @@ void ComputeVoronoi::checkOccupation() #endif // determine the total number of atoms in this atom's currently occupied cell - + int c; for (i=0; itag[i]; if (mytag > oldmaxtag) @@ -479,7 +479,7 @@ void ComputeVoronoi::checkOccupation() void ComputeVoronoi::loopCells() { // invoke voro++ and fetch results for owned atoms in group - + voronoicell_neighbor c; int i; if (faces_flag) nfaces = 0; diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 8565ddb1c9..24fdc4a991 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -40,7 +40,7 @@ enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduceRegion void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value - + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -55,7 +55,7 @@ void abs_max(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) void abs_min(void *in, void *inout, int * /*len*/, MPI_Datatype * /*type*/) { // r is the already reduced value, n is the new value - + double n = std::fabs(*(double *) in), r = *(double *) inout; double m; @@ -270,7 +270,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); - + } else if (input_mode == LOCAL) { if (!val.val.c->peratom_flag) error->all(FLERR, "Compute {} compute {} does not calculate local values", style, val.id); @@ -295,7 +295,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Compute {} fix {} does not calculate a per-atom array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); - + } else if (input_mode == LOCAL) { if (!val.val.f->local_flag) error->all(FLERR, "Compute {} fix {} does not calculate local values", style, val.id); diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index d0a32b8adf..15280af544 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -61,7 +61,7 @@ double ComputeReduceRegion::compute_one(int m, int flag) // initialization in case it has not yet been run, e.g. when // the compute was invoked right after it has been created - + if ((val.which == ArgInfo::COMPUTE) || (val.which == ArgInfo::FIX)) { if (val.val.c == nullptr) init(); } diff --git a/src/variable.cpp b/src/variable.cpp index f3c987f00c..264dcf6258 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1502,7 +1502,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // equal-style variable is being evaluated if (style[ivar] == EQUAL) { - + // c_ID = scalar from global scalar if (lowercase && nbracket == 0) { @@ -1588,7 +1588,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // C_ID[i][j] = scalar element of per-atom array, note uppercase "C" } else if (!lowercase && nbracket == 2) { - + if (!compute->peratom_flag) print_var_error(FLERR,"Mismatched compute in variable formula",ivar); if (!compute->size_peratom_cols) @@ -1612,13 +1612,13 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) tree,treestack,ntreestack,argstack,nargstack); // no other possibilities for equal-style variable, so error - + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // vector-style variable is being evaluated } else if (style[ivar] == VECTOR) { - + // c_ID = vector from global vector if (lowercase && nbracket == 0) { @@ -1641,7 +1641,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nvector = compute->size_vector; newtree->nstride = 1; treestack[ntreestack++] = newtree; - + // c_ID[i] = vector from global array } else if (lowercase && nbracket == 1) { @@ -1666,15 +1666,15 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nvector = compute->size_array_rows; newtree->nstride = compute->size_array_cols; treestack[ntreestack++] = newtree; - + // no other possibilities for vector-style variable, so error - + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // atom-style variable is being evaluated } else if (style[ivar] == ATOM) { - + // c_ID = vector from per-atom vector if (lowercase && nbracket == 0) { @@ -1696,7 +1696,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->array = compute->vector_atom; newtree->nstride = 1; treestack[ntreestack++] = newtree; - + // c_ID[i] = vector from per-atom array } else if (lowercase && nbracket == 1) { @@ -1724,10 +1724,10 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) treestack[ntreestack++] = newtree; // no other possibilities for atom-style variable, so error - + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); } - + // ---------------- // fix // ---------------- @@ -1770,7 +1770,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) // equal-style variable is being evaluated if (style[ivar] == EQUAL) { - + // f_ID = scalar from global scalar if (lowercase && nbracket == 0) { @@ -1826,14 +1826,14 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); - + peratom2global(1,nullptr,fix->vector_atom,1,index1,tree, treestack,ntreestack,argstack,nargstack); // F_ID[i][j] = scalar element of per-atom array, note uppercase "F" } else if (!lowercase && nbracket == 2) { - + if (!fix->peratom_flag) print_var_error(FLERR,"Mismatched fix in variable formula",ivar); if (!fix->size_peratom_cols) @@ -1852,13 +1852,13 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) tree,treestack,ntreestack,argstack,nargstack); // no other possibilities for equal-style variable, so error - + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // vector-style variable is being evaluated } else if (style[ivar] == VECTOR) { - + // f_ID = vector from global vector if (lowercase && nbracket == 0) { @@ -1875,7 +1875,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) memory->create(vec,nvec,"variable:values"); for (int m = 0; m < nvec; m++) vec[m] = fix->compute_vector(m); - + auto newtree = new Tree(); newtree->type = VECTORARRAY; newtree->array = vec; @@ -1883,7 +1883,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nstride = 1; newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - + // f_ID[i] = vector from global array } else if (lowercase && nbracket == 1) { @@ -1910,15 +1910,15 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nstride = 1; newtree->selfalloc = 1; treestack[ntreestack++] = newtree; - + // no other possibilities for vector-style variable, so error - + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // atom-style variable is being evaluated } else if (style[ivar] == ATOM) { - + // f_ID = vector from per-atom vector if (lowercase && nbracket == 0) { @@ -1935,7 +1935,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->array = fix->vector_atom; newtree->nstride = 1; treestack[ntreestack++] = newtree; - + // f_ID[i] = vector from per-atom array } else if (lowercase && nbracket == 1) { @@ -1958,7 +1958,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) treestack[ntreestack++] = newtree; // no other possibilities for atom-style variable, so error - + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); } @@ -2053,21 +2053,21 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Atom-style variable in equal-style variable formula",ivar); if (treetype == VECTOR) print_var_error(FLERR,"Atom-style variable in vector-style variable formula",ivar); - + Tree *newtree = nullptr; evaluate(data[ivar][0],&newtree,ivar); treestack[ntreestack++] = newtree; // vector from atomfile-style variable // point to the values in FixStore instance - + } else if (style[ivar] == ATOMFILE) { if (tree == nullptr) print_var_error(FLERR,"Atomfile-style variable in equal-style variable formula",ivar); if (treetype == VECTOR) print_var_error(FLERR,"Atomfile-style variable in vector-style variable formula",ivar); - + auto newtree = new Tree(); newtree->type = ATOMARRAY; newtree->array = reader[ivar]->fixstore->vstore; @@ -2121,7 +2121,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) tree,treestack,ntreestack,argstack,nargstack); // no other possibilities for variable with one bracket - + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); } From ffe291b7934188dc3901534b5ce9d75bf04042c6 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 22 Aug 2023 15:28:28 -0500 Subject: [PATCH 063/417] Fixed bugs with the memory allocation for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 20 ++++++++++++++------ src/KOKKOS/fix_spring_self_kokkos.h | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 8a576e2dea..e8aa07240f 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -39,19 +39,29 @@ FixSpringSelfKokkos::FixSpringSelfKokkos(LAMMPS *lmp, int narg, char { kokkosable = 1; exchange_comm_device = 1; - maxexchange = 6; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - memory->destroy(xoriginal); + xoriginal_tmp = xoriginal; + xoriginal = nullptr; int nmax = atom->nmax; grow_arrays(nmax); - d_count = typename AT::t_int_scalar("fix_shake:count"); + for (int i = 0; i < atom->nlocal; i++) { + k_xoriginal.h_view(i,0) = xoriginal_tmp[i][0]; + k_xoriginal.h_view(i,1) = xoriginal_tmp[i][1]; + k_xoriginal.h_view(i,2) = xoriginal_tmp[i][2]; + } + + k_xoriginal.modify_host(); + + d_count = typename AT::t_int_scalar("spring/self:count"); h_count = Kokkos::create_mirror_view(d_count); + + memory->destroy(xoriginal_tmp); } /* ---------------------------------------------------------------------- */ @@ -81,18 +91,16 @@ void FixSpringSelfKokkos::init() template void FixSpringSelfKokkos::post_force(int /*vflag*/) { - atomKK->sync(execution_space, X_MASK | F_MASK | MASK_MASK); + atomKK->sync(execution_space, X_MASK | F_MASK | IMAGE_MASK | MASK_MASK); x = atomKK->k_x.view(); f = atomKK->k_f.view(); image = atomKK->k_image.view(); mask = atomKK->k_mask.view(); - int nlocal = atom->nlocal; double espring_kk; - copymode = 1; //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this, espring_kk); { diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 30b9eaf40a..99fe435d88 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -84,6 +84,8 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { typename AT::t_int_scalar d_count; HAT::t_int_scalar h_count; + double **xoriginal_tmp; // original coords of atoms + }; template From dd6b847a5c6f88b24904c74f1a84ae4354400cb5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 22 Aug 2023 16:29:14 -0400 Subject: [PATCH 064/417] mention that "peratom" is no longer required and was removed --- doc/src/compute_voronoi_atom.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 3e67bb6cbf..37e5386341 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -190,6 +190,10 @@ Voro++ software in the src/VORONOI/README file. Output info """"""""""" +.. deprecated:: TBD + + The *peratom* keyword was removed as it is no longer required. + This compute calculates a per-atom array with two columns. In regular dynamic tessellation mode the first column is the Voronoi volume, the second is the neighbor count, as described above (read above for the From ad33a018f48f228f4d4b9f5815c85a93bd25663f Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 15:52:47 -0600 Subject: [PATCH 065/417] update variable syntax in several example input scripts --- examples/snap/in.snap.compute | 2 +- examples/snap/in.snap.compute.quadratic | 2 +- examples/voronoi/in.voronoi | 8 ++++---- examples/voronoi/in.voronoi.data | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/snap/in.snap.compute b/examples/snap/in.snap.compute index b0c7314882..8d2ffe8b96 100644 --- a/examples/snap/in.snap.compute +++ b/examples/snap/in.snap.compute @@ -70,7 +70,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_25 equal c_db[2][25] +variable db_2_25 equal C_db[2][25] # set up compute snap generating global array diff --git a/examples/snap/in.snap.compute.quadratic b/examples/snap/in.snap.compute.quadratic index e03d4af3bf..20d5ed3039 100644 --- a/examples/snap/in.snap.compute.quadratic +++ b/examples/snap/in.snap.compute.quadratic @@ -70,7 +70,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_100 equal c_db[2][100] +variable db_2_100 equal C_db[2][100] # set up compute snap generating global array diff --git a/examples/voronoi/in.voronoi b/examples/voronoi/in.voronoi index 5254969fbd..79b6c6efec 100644 --- a/examples/voronoi/in.voronoi +++ b/examples/voronoi/in.voronoi @@ -146,10 +146,10 @@ variable i2 equal 257 compute v1 all voronoi/atom occupation compute r0 all reduce sum c_v1[1] compute r1 all reduce sum c_v1[2] -variable d5a equal c_v1[${i1}][1] -variable d5b equal c_v1[${i2}][1] -variable d5c equal c_v1[${i1}][2] -variable d5d equal c_v1[${i2}][2] +variable d5a equal C_v1[${i1}][1] +variable d5b equal C_v1[${i2}][1] +variable d5c equal C_v1[${i1}][2] +variable d5d equal C_v1[${i2}][2] thermo_style custom c_r0 c_r1 v_d5a v_d5b v_d5c v_d5d run 0 diff --git a/examples/voronoi/in.voronoi.data b/examples/voronoi/in.voronoi.data index 853c2c2bd1..da00b44e09 100644 --- a/examples/voronoi/in.voronoi.data +++ b/examples/voronoi/in.voronoi.data @@ -67,7 +67,7 @@ undump dlocal # local and global quantities, but # not per-atom quantities -compute v2 all voronoi/atom neighbors yes edge_histo 6 peratom no +compute v2 all voronoi/atom neighbors yes edge_histo 6 # write voronoi local quantities to a file @@ -75,7 +75,7 @@ dump d2 all local 1 dump.neighbors2 index c_v2[1] c_v2[2] c_v2[3] # sum up a voronoi local quantity -compute sumarea all reduce sum c_v2[3] +compute sumarea all reduce sum c_v2[3] inputs local # output voronoi global quantities From 71ca6ee47ca24e0db97e0137b2ad293d33e95647 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 16:02:28 -0600 Subject: [PATCH 066/417] fix one more example input script --- examples/voronoi/in.voronoi.data | 7 +------ src/compute_reduce.cpp | 3 +-- src/compute_reduce.h | 2 +- src/compute_reduce_region.cpp | 2 -- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/examples/voronoi/in.voronoi.data b/examples/voronoi/in.voronoi.data index da00b44e09..e5d925c498 100644 --- a/examples/voronoi/in.voronoi.data +++ b/examples/voronoi/in.voronoi.data @@ -63,9 +63,7 @@ undump dlocal # TEST 2: # -# This compute voronoi generates -# local and global quantities, but -# not per-atom quantities +# This compute voronoi generates peratom and local and global quantities compute v2 all voronoi/atom neighbors yes edge_histo 6 @@ -83,6 +81,3 @@ thermo_style custom c_sumarea c_v2[3] c_v2[4] c_v2[5] c_v2[6] c_v2[7] thermo 1 run 0 - - - diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 24fdc4a991..5983445517 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -31,8 +31,6 @@ using namespace LAMMPS_NS; -enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduceRegion - #define BIG 1.0e20 //---------------------------------------------------------------- @@ -232,6 +230,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute {} inputs must be all peratom or all local"); input_mode = LOCAL; } + iarg += 2; } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); } diff --git a/src/compute_reduce.h b/src/compute_reduce.h index f8b652e00c..64322bc6ac 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class ComputeReduce : public Compute { public: enum { SUM, SUMSQ, SUMABS, MINN, MAXX, AVE, AVESQ, AVEABS, MINABS, MAXABS }; - enum { PERATOM, LOCAL }; + enum { UNDECIDED, PERATOM, LOCAL }; ComputeReduce(class LAMMPS *, int, char **); ~ComputeReduce() override; diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index 15280af544..bd850e902c 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -26,8 +26,6 @@ using namespace LAMMPS_NS; -enum{UNDECIDED,PERATOM,LOCAL}; // same as in ComputeReduce - static constexpr double BIG = 1.0e20; /* ---------------------------------------------------------------------- */ From 17dd04b4dea143fe271188b235edbe13e473956e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 16:22:57 -0600 Subject: [PATCH 067/417] tweak variable doc page --- doc/src/variable.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 4541de5fa2..f1a316da1f 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1179,7 +1179,7 @@ table: | equal | c_ID[I] | element of global vector | | equal | c_ID[I][J] | element of global array | | equal | C_ID[I] | element of per-atom vector (I = atom ID) | -| equal | C_ID{i}[J] | element of per-atom array (I = atom ID) | +| equal | C_ID[I][J] | element of per-atom array (I = atom ID) | +--------+------------+------------------------------------------+ | vector | c_ID | global vector | | vector | c_ID[I] | column of global array | @@ -1243,7 +1243,7 @@ and atom-style variables are listed in the following table: | equal | f_ID[I] | element of global vector | | equal | f_ID[I][J] | element of global array | | equal | F_ID[I] | element of per-atom vector (I = atom ID) | -| equal | F_ID{i}[J] | element of per-atom array (I = atom ID) | +| equal | F_ID[I][J] | element of per-atom array (I = atom ID) | +--------+------------+------------------------------------------+ | vector | f_ID | global vector | | vector | f_ID[I] | column of global array | From 3e22eb83555a484388a433b20be14203dcbb4269 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 22 Aug 2023 16:40:25 -0600 Subject: [PATCH 068/417] adjust version date --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 572a274053..35780aa785 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ -#define LAMMPS_VERSION "2 Aug 2023" +#define LAMMPS_VERSION "3 Aug 2023" #define LAMMPS_UPDATE "Development" From e6b98f5942856c11ec34b3206ee59cb175a8dc83 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 23 Aug 2023 09:47:36 -0600 Subject: [PATCH 069/417] fix logic issue in compute reduce --- src/compute_reduce.cpp | 23 ++++++----------------- src/compute_reduce.h | 2 +- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 5983445517..5385554f33 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -133,8 +133,6 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // parse values - input_mode = UNDECIDED; - values.clear(); nvalues = 0; for (int iarg = 0; iarg < nargnew; ++iarg) { @@ -144,41 +142,32 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : val.val.c = nullptr; if (strcmp(arg[iarg], "x") == 0) { - input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 0; } else if (strcmp(arg[iarg], "y") == 0) { - input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 1; } else if (strcmp(arg[iarg], "z") == 0) { - input_mode = PERATOM; val.which = ArgInfo::X; val.argindex = 2; } else if (strcmp(arg[iarg], "vx") == 0) { - input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 0; } else if (strcmp(arg[iarg], "vy") == 0) { - input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 1; } else if (strcmp(arg[iarg], "vz") == 0) { - input_mode = PERATOM; val.which = ArgInfo::V; val.argindex = 2; } else if (strcmp(arg[iarg], "fx") == 0) { - input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 0; } else if (strcmp(arg[iarg], "fy") == 0) { - input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 1; } else if (strcmp(arg[iarg], "fz") == 0) { - input_mode = PERATOM; val.which = ArgInfo::F; val.argindex = 2; @@ -203,6 +192,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : nvalues = values.size(); replace = new int[nvalues]; for (int i = 0; i < nvalues; ++i) replace[i] = -1; + input_mode = PERATOM; std::string mycmd = "compute "; mycmd += style; @@ -225,11 +215,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg], "inputs") == 0) { if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); if (strcmp(arg[iarg+1], "peratom") == 0) input_mode = PERATOM; - else if (strcmp(arg[iarg+1], "local") == 0) { - if (input_mode == PERATOM) - error->all(FLERR,"Compute {} inputs must be all peratom or all local"); - input_mode = LOCAL; - } + else if (strcmp(arg[iarg+1], "local") == 0) input_mode = LOCAL; iarg += 2; } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); @@ -255,7 +241,10 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // setup and error check for (auto &val : values) { - if (val.which == ArgInfo::COMPUTE) { + if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) { + if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); + + } else if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) error->all(FLERR, "Compute ID {} for compute {} does not exist", val.id, style); diff --git a/src/compute_reduce.h b/src/compute_reduce.h index 64322bc6ac..f8b652e00c 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class ComputeReduce : public Compute { public: enum { SUM, SUMSQ, SUMABS, MINN, MAXX, AVE, AVESQ, AVEABS, MINABS, MAXABS }; - enum { UNDECIDED, PERATOM, LOCAL }; + enum { PERATOM, LOCAL }; ComputeReduce(class LAMMPS *, int, char **); ~ComputeReduce() override; From b4e7d5f0b9a2a8ce329dc5ca9fb383b9b1390861 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 23 Aug 2023 20:11:32 -0400 Subject: [PATCH 070/417] fix whitespace (again) --- src/compute_reduce.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 5385554f33..3feabf2ec3 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -243,7 +243,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : for (auto &val : values) { if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) { if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); - + } else if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) From 6ccccb5d13bbb9f53033ba64c8beb646eba5ae3f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 24 Aug 2023 09:27:17 -0400 Subject: [PATCH 071/417] add versionadded tag to new inputs keyword docs --- doc/src/compute_reduce.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 4692e161b4..6820d2ee04 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -201,6 +201,8 @@ information in this context, the *replace* keywords will extract the atom IDs for the two atoms in the bond of maximum stretch. These atom IDs and the bond stretch will be printed with thermodynamic output. +.. versionadded:: TBD + The *inputs* keyword allows selection of whether all the inputs are per-atom or local quantities. As noted above, all the inputs must be the same kind (per-atom or local). Per-atom is the default setting. From 187bebb515081bf94e3e1b6ab431a8a4902ab3db Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 24 Aug 2023 12:17:37 -0500 Subject: [PATCH 072/417] Working on fix spring/self/kk, something with missing host-device sync that causes force blowup --- src/KOKKOS/fix_efield_kokkos.cpp | 6 +++--- src/KOKKOS/fix_spring_self_kokkos.cpp | 28 +++++++++++++++++++++------ src/KOKKOS/fix_spring_self_kokkos.h | 7 ++++--- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index bbf106f515..8c4469095f 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -218,11 +218,11 @@ void FixEfieldKokkos::post_force(int /*vflag*/) auto fx = qtmp * l_ex; auto fy = qtmp * l_ey; auto fz = qtmp * l_ez; - if (l_xstyle == ATOM) l_f(i,0) += l_d_efield(i,0); + if (l_xstyle == ATOM) l_f(i,0) += qtmp * l_d_efield(i,0); else if (l_xstyle) l_f(i,0) += fx; - if (l_ystyle == ATOM) l_f(i,1) += l_d_efield(i,1); + if (l_ystyle == ATOM) l_f(i,1) += qtmp * l_d_efield(i,1); else if (l_ystyle) l_f(i,1) += fy; - if (l_zstyle == ATOM) l_f(i,2) += l_d_efield(i,2); + if (l_zstyle == ATOM) l_f(i,2) += qtmp * l_d_efield(i,2); else if (l_zstyle) l_f(i,2) += fz; fsum_kk.d0 -= fx * unwrap[0] + fy * unwrap[1] + fz * unwrap[2]; fsum_kk.d1 += fx; diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index e8aa07240f..da1576f3ef 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -108,16 +108,17 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) auto prd = Few(domain->prd); auto h = Few(domain->h); auto triclinic = domain->triclinic; - auto l_xflag = xflag; - auto l_yflag = yflag; - auto l_zflag = zflag; auto l_k = k; - auto l_x = x; auto l_xoriginal = d_xoriginal; + + auto l_x = x; auto l_f = f; auto l_mask = mask; auto l_image = image; auto l_groupbit = groupbit; + auto l_xflag = xflag; + auto l_yflag = yflag; + auto l_zflag = zflag; Kokkos::parallel_reduce(nlocal, LAMMPS_LAMBDA(const int& i, double& espring_kk) { if (l_mask[i] & l_groupbit) { @@ -154,10 +155,25 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) template void FixSpringSelfKokkos::grow_arrays(int nmax) { - memoryKK->grow_kokkos(k_xoriginal,xoriginal,nmax,3,"spring/self:xoriginal"); + memoryKK->grow_kokkos(k_xoriginal,xoriginal,nmax,"spring/self:xoriginal"); d_xoriginal = k_xoriginal.view(); } +/* ---------------------------------------------------------------------- + copy values within local atom-based arrays +------------------------------------------------------------------------- */ + +template +void FixSpringSelfKokkos::copy_arrays(int i, int j, int delflag) +{ + k_xoriginal.sync_host(); + + FixSpringSelf::copy_arrays(i,j,delflag); + + k_xoriginal.modify_host(); +} + + /* ---------------------------------------------------------------------- */ template @@ -202,7 +218,7 @@ int FixSpringSelfKokkos::pack_exchange_kokkos( d_exchange_sendlist = k_exchange_sendlist.view(); this->nsend = nsend; - + k_xoriginal.template sync(); Kokkos::deep_copy(d_count,0); diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 99fe435d88..49233c4dcc 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -42,6 +42,7 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { ~FixSpringSelfKokkos() override; void init() override; void grow_arrays(int) override; + void copy_arrays(int, int, int) override; void post_force(int) override; KOKKOS_INLINE_FUNCTION @@ -64,14 +65,14 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { int unpack_exchange(int, double *) override; protected: - DAT::tdual_ffloat_2d k_xoriginal; - typename AT::t_ffloat_2d d_xoriginal; + DAT::tdual_x_array k_xoriginal; + typename AT::t_x_array d_xoriginal; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; - + int nsend; typename AT::t_int_2d d_sendlist; From 58d60dfea04b7d3d2012d0c8639bc07a3ca819e0 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 Aug 2023 16:08:59 -0500 Subject: [PATCH 073/417] Fixed bugs with device sync for xoriginal --- src/KOKKOS/fix_spring_self_kokkos.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index da1576f3ef..13ebb7de6f 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -101,8 +101,11 @@ void FixSpringSelfKokkos::post_force(int /*vflag*/) double espring_kk; + k_xoriginal.modify(); + k_xoriginal.sync(); + copymode = 1; - //Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this, espring_kk); + { // local variables for lambda capture auto prd = Few(domain->prd); @@ -173,7 +176,6 @@ void FixSpringSelfKokkos::copy_arrays(int i, int j, int delflag) k_xoriginal.modify_host(); } - /* ---------------------------------------------------------------------- */ template From 4ef9f70bfe0ef7a408eff0584c793e2fb3ba64dc Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 28 Aug 2023 09:43:00 -0500 Subject: [PATCH 074/417] Fixed whitespaces, added author info --- src/KOKKOS/fix_efield_kokkos.cpp | 4 ++++ src/KOKKOS/fix_spring_self_kokkos.cpp | 4 ++++ src/KOKKOS/fix_spring_self_kokkos.h | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index 8c4469095f..ffe1c34e97 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -12,6 +12,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author: Trung Nguyen (U Chicago) +------------------------------------------------------------------------- */ + #include "fix_efield_kokkos.h" #include "atom_kokkos.h" diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 13ebb7de6f..efd8a652ff 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -12,6 +12,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author: Trung Nguyen (U Chicago) +------------------------------------------------------------------------- */ + #include "fix_spring_self_kokkos.h" #include "atom_kokkos.h" diff --git a/src/KOKKOS/fix_spring_self_kokkos.h b/src/KOKKOS/fix_spring_self_kokkos.h index 49233c4dcc..b23e92249b 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.h +++ b/src/KOKKOS/fix_spring_self_kokkos.h @@ -72,7 +72,7 @@ class FixSpringSelfKokkos : public FixSpringSelf, public KokkosBase { typename AT::t_f_array f; typename AT::t_imageint_1d_randomread image; typename AT::t_int_1d_randomread mask; - + int nsend; typename AT::t_int_2d d_sendlist; From b08abd4a809df5b12bf9e9abca796873742e5d75 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 28 Aug 2023 11:06:07 -0500 Subject: [PATCH 075/417] Updated Install.sh and cleaned up --- src/KOKKOS/Install.sh | 4 ++++ src/KOKKOS/pair_yukawa_colloid_kokkos.cpp | 9 ++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 766daaff19..0a5bb398aa 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -127,6 +127,8 @@ action fix_dt_reset_kokkos.cpp action fix_dt_reset_kokkos.h action fix_enforce2d_kokkos.cpp action fix_enforce2d_kokkos.h +action fix_efield_kokkos.cpp +action fix_efield_kokkos.h action fix_eos_table_rx_kokkos.cpp fix_eos_table_rx.cpp action fix_eos_table_rx_kokkos.h fix_eos_table_rx.h action fix_freeze_kokkos.cpp fix_freeze.cpp @@ -171,6 +173,8 @@ action fix_shake_kokkos.cpp fix_shake.cpp action fix_shake_kokkos.h fix_shake.h action fix_shardlow_kokkos.cpp fix_shardlow.cpp action fix_shardlow_kokkos.h fix_shardlow.h +action fix_spring_self_kokkos.cpp +action fix_spring_self_kokkos.h action fix_viscous_kokkos.cpp action fix_viscous_kokkos.h action fix_wall_gran_kokkos.cpp fix_wall_gran.cpp diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp index ca491a3800..04eb5ab657 100644 --- a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp @@ -210,7 +210,7 @@ void PairYukawaColloidKokkos::compute(int eflag_in, int vflag_in) } } - +/* ---------------------------------------------------------------------- */ template template @@ -227,11 +227,10 @@ compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a : params(itype,jtype).a; - // U = a * exp(-kappa*r-(radi+radj)) / kappa - // f = a * exp(-kappa*r) + // U = a * exp(-kappa*(r-(radi+radj))) / kappa + // f = -dU/dr = a * exp(-kappa*r) // f/r = a * exp(-kappa*r) / r const F_FLOAT rinv = 1.0 / rr; - const F_FLOAT rinv2 = rinv*rinv; const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); const F_FLOAT forceyukawa = aa * screening; const F_FLOAT fpair = forceyukawa * rinv; @@ -255,7 +254,7 @@ compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, const F_FLOAT offset = STACKPARAMS ? m_params[itype][jtype].offset : params(itype,jtype).offset; - // U = a * exp(-kappa*r) / kappa + // U = a * exp(-kappa*(r-(radi+radj))) / kappa const F_FLOAT rinv = 1.0 / rr; const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); From 67bcf75b74f34b4bd0037d47fade1a77fabc073a Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 28 Aug 2023 23:18:05 -0500 Subject: [PATCH 076/417] Updated the corresponding doc pages with ".. index::" and added (k) to the commands in the overview pages --- doc/src/Commands_fix.rst | 4 ++-- doc/src/Commands_pair.rst | 2 +- doc/src/fix_efield.rst | 1 + doc/src/fix_spring_self.rst | 1 + doc/src/pair_yukawa_colloid.rst | 3 ++- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 6fe321e3c9..a15e24e3e5 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -69,7 +69,7 @@ OPT. * :doc:`drude/transform/inverse ` * :doc:`dt/reset (k) ` * :doc:`edpd/source ` - * :doc:`efield ` + * :doc:`efield (k) ` * :doc:`efield/tip4p ` * :doc:`ehex ` * :doc:`electrode/conp (i) ` @@ -233,7 +233,7 @@ OPT. * :doc:`spring ` * :doc:`spring/chunk ` * :doc:`spring/rg ` - * :doc:`spring/self ` + * :doc:`spring/self (k) ` * :doc:`srd ` * :doc:`store/force ` * :doc:`store/state ` diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index c45a1d778c..b3d40717da 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -305,5 +305,5 @@ OPT. * :doc:`wf/cut ` * :doc:`ylz ` * :doc:`yukawa (gko) ` - * :doc:`yukawa/colloid (go) ` + * :doc:`yukawa/colloid (gko) ` * :doc:`zbl (gko) ` diff --git a/doc/src/fix_efield.rst b/doc/src/fix_efield.rst index e38e1e6894..c6ac3a0722 100644 --- a/doc/src/fix_efield.rst +++ b/doc/src/fix_efield.rst @@ -1,4 +1,5 @@ .. index:: fix efield +.. index:: fix efield/kk .. index:: fix efield/tip4p fix efield command diff --git a/doc/src/fix_spring_self.rst b/doc/src/fix_spring_self.rst index 6cf0a9e0e7..0def6d51f0 100644 --- a/doc/src/fix_spring_self.rst +++ b/doc/src/fix_spring_self.rst @@ -1,4 +1,5 @@ .. index:: fix spring/self +.. index:: fix spring/self/kk fix spring/self command ======================= diff --git a/doc/src/pair_yukawa_colloid.rst b/doc/src/pair_yukawa_colloid.rst index 6611ea04e4..96893f8e37 100644 --- a/doc/src/pair_yukawa_colloid.rst +++ b/doc/src/pair_yukawa_colloid.rst @@ -1,11 +1,12 @@ .. index:: pair_style yukawa/colloid .. index:: pair_style yukawa/colloid/gpu +.. index:: pair_style yukawa/colloid/kk .. index:: pair_style yukawa/colloid/omp pair_style yukawa/colloid command ================================= -Accelerator Variants: *yukawa/colloid/gpu*, *yukawa/colloid/omp* +Accelerator Variants: *yukawa/colloid/gpu*, *yukawa/colloid/kk*, *yukawa/colloid/omp* Syntax """""" From 1c10d0d495501234d64db307ab6c43e6fa54ba20 Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Thu, 14 Sep 2023 17:11:51 -0400 Subject: [PATCH 077/417] Intel Package: Adding snap variant. --- src/INTEL/TEST/in.intel.snap | 70 ++ src/INTEL/TEST/run_benchmarks.sh | 2 +- src/INTEL/intel_simd.h | 161 ++++ src/INTEL/pair_snap_intel.cpp | 777 +++++++++++++++ src/INTEL/pair_snap_intel.h | 83 ++ src/INTEL/sna_intel.cpp | 1505 ++++++++++++++++++++++++++++++ src/INTEL/sna_intel.h | 187 ++++ 7 files changed, 2784 insertions(+), 1 deletion(-) create mode 100644 src/INTEL/TEST/in.intel.snap create mode 100644 src/INTEL/pair_snap_intel.cpp create mode 100644 src/INTEL/pair_snap_intel.h create mode 100644 src/INTEL/sna_intel.cpp create mode 100644 src/INTEL/sna_intel.h diff --git a/src/INTEL/TEST/in.intel.snap b/src/INTEL/TEST/in.intel.snap new file mode 100644 index 0000000000..4e45fe01f5 --- /dev/null +++ b/src/INTEL/TEST/in.intel.snap @@ -0,0 +1,70 @@ +# Toy demonstration of SNAP "scale" parameter, using fix/adapt and hybrid/overlay +# Mixing linear and quadratic SNAP Ni potentials by Zuo et al. JCPA 2020 + +variable w index 10 # Warmup Timesteps +variable t index 100 # Main Run Timesteps +variable m index 1 # Main Run Timestep Multiplier +variable n index 0 # Use NUMA Mapping for Multi-Node + +variable x index 4 +variable y index 2 +variable z index 2 + +variable rr equal floor($t*$m) +variable root getenv LMP_ROOT + +if "$n > 0" then "processors * * * grid numa" + +# mixing parameter + +variable lambda equal 0.2 + +# Initialize simulation + +variable a equal 3.52 +units metal + +# generate the box and atom positions using a FCC lattice +variable nx equal 20*$x +variable ny equal 20*$y +variable nz equal 20*$z + +boundary p p p + +lattice fcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 34. + +# choose bundled SNAP Ni potential from Zuo et al. JCPA 2020 +pair_style hybrid/overlay snap snap +pair_coeff * * snap 1 & + ${root}/examples/snap/Ni_Zuo_JPCA2020.snapcoeff & + ${root}/examples/snap/Ni_Zuo_JPCA2020.snapparam Ni +pair_coeff * * snap 2 & + ${root}/examples/snap/Ni_Zuo_JPCA2020.quadratic.snapcoeff & + ${root}/examples/snap/Ni_Zuo_JPCA2020.quadratic.snapparam Ni + +# scale according to mixing parameter +variable l1 equal ${lambda} +variable l2 equal 1.0-${lambda} +fix scale1 all adapt 1 pair snap:1 scale * * v_l1 +fix scale2 all adapt 1 pair snap:2 scale * * v_l2 + +# Setup output +thermo 1 +thermo_modify norm yes + +# Set up NVE run +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +# Run MD +velocity all create 300.0 4928459 loop geom +fix 1 all nve + +if "$w > 0" then "run $w" +run ${rr} diff --git a/src/INTEL/TEST/run_benchmarks.sh b/src/INTEL/TEST/run_benchmarks.sh index 82eb51c928..eeb9f07a11 100755 --- a/src/INTEL/TEST/run_benchmarks.sh +++ b/src/INTEL/TEST/run_benchmarks.sh @@ -35,7 +35,7 @@ export I_MPI_PIN_DOMAIN=core # End settings for your system ######################################################################### -export WORKLOADS="lj rhodo lc sw water eam airebo dpd tersoff" +export WORKLOADS="lj rhodo lc sw water eam airebo dpd tersoff snap" export LMP_ARGS="-pk intel 0 -sf intel -screen none -v d 1" export RLMP_ARGS="-pk intel 0 lrt yes -sf intel -screen none -v d 1" diff --git a/src/INTEL/intel_simd.h b/src/INTEL/intel_simd.h index 37842621dc..9f31580dd2 100644 --- a/src/INTEL/intel_simd.h +++ b/src/INTEL/intel_simd.h @@ -46,13 +46,38 @@ namespace ip_simd { typedef __mmask16 SIMD_mask; + inline bool any(const SIMD_mask &m) { return m != 0; } + struct SIMD_int { __m512i v; SIMD_int() {} SIMD_int(const __m512i in) : v(in) {} + inline int & operator[](const int i) { return ((int *)&(v))[i]; } + inline const int & operator[](const int i) const + { return ((int *)&(v))[i]; } operator __m512i() const { return v;} }; + struct SIMD256_int { + __m256i v; + SIMD256_int() {} + SIMD256_int(const __m256i in) : v(in) {} + SIMD256_int(const int in) : v(_mm256_set1_epi32(in)) {} + inline int & operator[](const int i) { return ((int *)&(v))[i]; } + inline const int & operator[](const int i) const + { return ((int *)&(v))[i]; } +#ifdef __INTEL_LLVM_COMPILER + inline SIMD256_int operator&=(const int i) + { v=_mm256_and_epi32(v, _mm256_set1_epi32(i)); return *this; }; +#else + inline SIMD256_int operator&=(const int i) + { v=_mm256_and_si256(v, _mm256_set1_epi32(i)); return *this; }; +#endif + inline SIMD256_int operator+=(const int i) + { v=_mm256_add_epi32(v, _mm256_set1_epi32(i)); return *this; }; + operator __m256i() const { return v;} + }; + struct SIMD_float { __m512 v; SIMD_float() {} @@ -64,7 +89,24 @@ namespace ip_simd { __m512d v; SIMD_double() {} SIMD_double(const __m512d in) : v(in) {} + SIMD_double(const double in) { v=_mm512_set1_pd(in); } + inline double & operator[](const int i) { return ((double *)&(v))[i]; } + inline const double & operator[](const int i) const + { return ((double *)&(v))[i]; } operator __m512d() const { return v;} + + SIMD_double & operator=(const double i) + { _mm512_set1_pd(i); return *this; } + SIMD_double &operator=(const SIMD_double &i) + { v = i.v; return *this; } + + SIMD_double operator-() { return _mm512_xor_pd(v, _mm512_set1_pd(-0.0)); } + SIMD_double & operator+=(const SIMD_double & two) + { v = _mm512_add_pd(v, two.v); return *this; } + SIMD_double & operator-=(const SIMD_double & two) + { v = _mm512_sub_pd(v, two.v); return *this; } + SIMD_double & operator*=(const SIMD_double & two) + { v = _mm512_mul_pd(v, two.v); return *this; } }; template @@ -99,6 +141,12 @@ namespace ip_simd { // ------- Set Operations + inline SIMD256_int SIMD256_set(const int l0, const int l1, const int l2, + const int l3, const int l4, const int l5, + const int l6, const int l7) { + return _mm256_setr_epi32(l0,l1,l2,l3,l4,l5,l6,l7); + } + inline SIMD_int SIMD_set(const int l0, const int l1, const int l2, const int l3, const int l4, const int l5, const int l6, const int l7, const int l8, @@ -109,6 +157,10 @@ namespace ip_simd { l8,l9,l10,l11,l12,l13,l14,l15); } + inline SIMD256_int SIMD256_set(const int l) { + return _mm256_set1_epi32(l); + } + inline SIMD_int SIMD_set(const int l) { return _mm512_set1_epi32(l); } @@ -121,6 +173,10 @@ namespace ip_simd { return _mm512_set1_pd(l); } + inline SIMD256_int SIMD256_count() { + return SIMD256_set(0,1,2,3,4,5,6,7); + } + inline SIMD_int SIMD_zero_masked(const SIMD_mask &m, const SIMD_int &one) { return _mm512_maskz_mov_epi32(m, one); } @@ -147,6 +203,10 @@ namespace ip_simd { // -------- Load Operations + inline SIMD256_int SIMD_load(const SIMD256_int *p) { + return _mm256_load_epi32((int *)p); + } + inline SIMD_int SIMD_load(const int *p) { return _mm512_load_epi32(p); } @@ -159,6 +219,10 @@ namespace ip_simd { return _mm512_load_pd(p); } + inline SIMD_double SIMD_load(const SIMD_double *p) { + return _mm512_load_pd((double *)p); + } + inline SIMD_int SIMD_loadz(const SIMD_mask &m, const int *p) { return _mm512_maskz_load_epi32(m, p); } @@ -171,6 +235,10 @@ namespace ip_simd { return _mm512_maskz_load_pd(m, p); } + inline SIMD256_int SIMD_gather(const int *p, const SIMD256_int &i) { + return _mm256_i32gather_epi32(p, i, _MM_SCALE_4); + } + inline SIMD_int SIMD_gather(const int *p, const SIMD_int &i) { return _mm512_i32gather_epi32(i, p, _MM_SCALE_4); } @@ -179,6 +247,10 @@ namespace ip_simd { return _mm512_i32gather_ps(i, p, _MM_SCALE_4); } + inline SIMD_double SIMD_gather(const double *p, const SIMD256_int &i) { + return _mm512_i32gather_pd(i, p, _MM_SCALE_8); + } + inline SIMD_double SIMD_gather(const double *p, const SIMD_int &i) { return _mm512_i32gather_pd(_mm512_castsi512_si256(i), p, _MM_SCALE_8); } @@ -201,6 +273,12 @@ namespace ip_simd { _mm512_castsi512_si256(i), p, _MM_SCALE_8); } + inline SIMD_double SIMD_gather(const SIMD_mask &m, const double *p, + const SIMD256_int &i) { + return _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + i, p, _MM_SCALE_8); + } + template inline SIMD_int SIMD_gatherz_offset(const SIMD_mask &m, const int *p, const SIMD_int &i) { @@ -252,6 +330,15 @@ namespace ip_simd { return _mm512_store_pd(p,one); } + inline void SIMD_store(SIMD_double *p, const SIMD_double &one) { + return _mm512_store_pd((double *)p,one); + } + + inline void SIMD_scatter(const SIMD_mask &m, int *p, + const SIMD256_int &i, const SIMD256_int &vec) { + _mm256_mask_i32scatter_epi32(p, m, i, vec, _MM_SCALE_4); + } + inline void SIMD_scatter(const SIMD_mask &m, int *p, const SIMD_int &i, const SIMD_int &vec) { _mm512_mask_i32scatter_epi32(p, m, i, vec, _MM_SCALE_4); @@ -268,8 +355,22 @@ namespace ip_simd { _MM_SCALE_8); } + inline void SIMD_scatter(const SIMD_mask &m, double *p, + const SIMD256_int &i, const SIMD_double &vec) { + _mm512_mask_i32scatter_pd(p, m, i, vec, _MM_SCALE_8); + } + + inline void SIMD_scatter(double *p, + const SIMD256_int &i, const SIMD_double &vec) { + _mm512_i32scatter_pd(p, i, vec, _MM_SCALE_8); + } + // ------- Arithmetic Operations + inline SIMD256_int operator+(const SIMD256_int &one, const SIMD256_int &two) { + return _mm256_add_epi32(one,two); + } + inline SIMD_int operator+(const SIMD_int &one, const SIMD_int &two) { return _mm512_add_epi32(one,two); } @@ -286,6 +387,10 @@ namespace ip_simd { return _mm512_add_epi32(one,SIMD_set(two)); } + inline SIMD256_int operator+(const SIMD256_int &one, const int two) { + return _mm256_add_epi32(one,SIMD256_set(two)); + } + inline SIMD_float operator+(const SIMD_float &one, const float two) { return _mm512_add_ps(one,SIMD_set(two)); } @@ -299,6 +404,11 @@ namespace ip_simd { return _mm512_mask_add_epi32(one,m,one,SIMD_set(two)); } + inline SIMD256_int SIMD_add(const SIMD_mask &m, + const SIMD256_int &one, const int two) { + return _mm256_mask_add_epi32(one,m,one,SIMD256_set(two)); + } + inline SIMD_float SIMD_add(const SIMD_mask &m, const SIMD_float &one, const float two) { return _mm512_mask_add_ps(one,m,one,SIMD_set(two)); @@ -309,6 +419,11 @@ namespace ip_simd { return _mm512_mask_add_pd(one,m,one,SIMD_set(two)); } + inline SIMD_double SIMD_add(const SIMD_mask &m, + const SIMD_double &one, const SIMD_double &two) { + return _mm512_mask_add_pd(one,m,one,two); + } + inline SIMD_int SIMD_add(const SIMD_int &s, const SIMD_mask &m, const SIMD_int &one, const SIMD_int &two) { return _mm512_mask_add_epi32(s,m,one,two); @@ -387,6 +502,10 @@ namespace ip_simd { return _mm512_mul_pd(one,two); } + inline SIMD256_int operator*(const SIMD256_int &one, const int two) { + return _mm256_mullo_epi32(one,SIMD256_set(two)); + } + inline SIMD_int operator*(const SIMD_int &one, const int two) { return _mm512_mullo_epi32(one,SIMD_set(two)); } @@ -417,6 +536,12 @@ namespace ip_simd { return _mm512_fmadd_pd(one,two,three); } + inline SIMD_double SIMD_fma(const SIMD_mask m, const SIMD_double &one, + const SIMD_double &two, + const SIMD_double &three) { + return _mm512_mask3_fmadd_pd(one,two,three,m); + } + inline SIMD_float SIMD_fms(const SIMD_float &one, const SIMD_float &two, const SIMD_float &three) { return _mm512_fmsub_ps(one,two,three); @@ -493,6 +618,10 @@ namespace ip_simd { return _mm512_pow_pd(one, two); } + inline SIMD_double SIMD_pow(const SIMD_double &one, const double two) { + return _mm512_pow_pd(one, SIMD_set(two)); + } + inline SIMD_float SIMD_exp(const SIMD_float &one) { return _mm512_exp_ps(one); } @@ -501,6 +630,18 @@ namespace ip_simd { return _mm512_exp_pd(one); } + inline SIMD_double SIMD_cos(const SIMD_double &one) { + return _mm512_cos_pd(one); + } + + inline SIMD_double SIMD_sin(const SIMD_double &one) { + return _mm512_sin_pd(one); + } + + inline SIMD_double SIMD_tan(const SIMD_double &one) { + return _mm512_tan_pd(one); + } + // ------- Comparison operations inline SIMD_mask SIMD_lt(SIMD_mask m, const SIMD_int &one, @@ -533,6 +674,14 @@ namespace ip_simd { return _mm512_mask_cmplt_pd_mask(m, SIMD_set(one), two); } + inline SIMD_mask operator<(const SIMD256_int &one, const SIMD256_int &two) { + return _mm256_cmplt_epi32_mask(one,two); + } + + inline SIMD_mask operator<(const int one, const SIMD256_int &two) { + return _mm256_cmplt_epi32_mask(SIMD256_set(one),two); + } + inline SIMD_mask operator<(const SIMD_int &one, const SIMD_int &two) { return _mm512_cmplt_epi32_mask(one,two); } @@ -577,6 +726,10 @@ namespace ip_simd { return _mm512_cmple_ps_mask(SIMD_set(one), two); } + inline SIMD_mask operator<=(const SIMD_double &one, const SIMD_double &two) { + return _mm512_cmple_pd_mask(one, two); + } + inline SIMD_mask operator<=(const double one, const SIMD_double &two) { return _mm512_cmple_pd_mask(SIMD_set(one), two); } @@ -593,6 +746,14 @@ namespace ip_simd { return _mm512_cmplt_pd_mask(two,one); } + inline SIMD_mask operator>(const SIMD_double &one, const double two) { + return _mm512_cmplt_pd_mask(SIMD_set(two),one); + } + + inline SIMD_mask operator==(const SIMD256_int &one, const int two) { + return _mm256_cmpeq_epi32_mask(one,_mm256_set1_epi32(two)); + } + inline SIMD_mask operator==(const SIMD_int &one, const SIMD_int &two) { return _mm512_cmpeq_epi32_mask(one,two); } diff --git a/src/INTEL/pair_snap_intel.cpp b/src/INTEL/pair_snap_intel.cpp new file mode 100644 index 0000000000..7417b08f9d --- /dev/null +++ b/src/INTEL/pair_snap_intel.cpp @@ -0,0 +1,777 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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. +------------------------------------------------------------------------- */ + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#include "pair_snap_intel.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "sna_intel.h" +#include "tokenizer.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace ip_simd; + +#define MAXLINE 1024 +#define MAXWORD 3 + +/* ---------------------------------------------------------------------- */ + +PairSNAPIntel::PairSNAPIntel(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + centroidstressflag = CENTROID_NOTAVAIL; + + radelem = nullptr; + wjelem = nullptr; + coeffelem = nullptr; + sinnerelem = nullptr; + dinnerelem = nullptr; + + beta = nullptr; + bispectrum = nullptr; + snaptr = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +PairSNAPIntel::~PairSNAPIntel() +{ + if (copymode) return; + + memory->destroy(radelem); + memory->destroy(wjelem); + memory->destroy(coeffelem); + memory->destroy(sinnerelem); + memory->destroy(dinnerelem); + + memory->destroy(beta); + memory->destroy(bispectrum); + + delete snaptr; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(scale); + } + +} + +/* ---------------------------------------------------------------------- + This version is a straightforward implementation + ---------------------------------------------------------------------- */ + +void PairSNAPIntel::compute(int eflag, int vflag) +{ + SNA_DVEC fij[3]; + int *jlist,*numneigh,**firstneigh; + + ev_init(eflag,vflag); + int tally_xyz = 0; + if (vflag_atom || (vflag && !vflag_fdotr)) tally_xyz = 1; + + double **x = atom->x; + double *_x = atom->x[0]; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + // compute dE_i/dB_i = beta_i for all i in list + + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + SNA_DVEC sevdwl(0); + + const int vw = snaptr->vector_width(); + for (int ii = 0; ii < list->inum; ii+=vw) { + SNA_IVEC i, jnum; + int max_jnum = 0; + for (int l = 0; l < vw; l++) { + if (ii + l < list->inum) { + i[l] = list->ilist[ii + l]; + jnum[l] = numneigh[i[l]]; + } else { + i[l] = list->ilist[0]; + jnum[l] = 0; + } + if (jnum[l] > max_jnum) max_jnum = jnum[l]; + } + + // ensure rij, inside, wj, and rcutij are of size jnum + + snaptr->grow_rij(max_jnum); + + SNA_IVEC zero_vec(0); + + const SNA_DVEC xtmp = SIMD_gather(_x, i * 3); + const SNA_DVEC ytmp = SIMD_gather(_x, i * 3 + 1); + const SNA_DVEC ztmp = SIMD_gather(_x, i * 3 + 2); + const SNA_IVEC itype = SIMD_gather(type, i); + const SNA_IVEC ielem = SIMD_gather(map, itype); + const SNA_DVEC radi = SIMD_gather(radelem, ielem); + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // wj = weights for neighbors of I within cutoff + // rcutij = cutoffs for neighbors of I within cutoff + // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi + + SNA_IVEC ninside(0); + for (int jj = 0; jj < max_jnum; jj++) { + SIMD_mask m(SIMD256_set(jj) < jnum); + + SNA_IVEC j; + SV_for (int l = 0; l < vw; l++) { + jlist = firstneigh[i[l]]; + if (jj < jnum[l]) j[l] = jlist[jj]; + else j[l] = 0; + } + j &= NEIGHMASK; + + const SNA_DVEC delx = SIMD_gather(m, _x, j * 3) - xtmp; + const SNA_DVEC dely = SIMD_gather(m, _x, j * 3 + 1) - ytmp; + const SNA_DVEC delz = SIMD_gather(m, _x, j * 3 + 2) - ztmp; + const SNA_IVEC jtype = SIMD_gather(type, j); + const SNA_DVEC rsq = delx*delx + dely*dely + delz*delz; + const SNA_DVEC vcut = SIMD_gather(m, cutsq[0], + itype * (atom->ntypes + 1) + jtype); + + m &= rsq < vcut; + m &= rsq > SIMD_set(1e-20); + const SNA_IVEC jelem = SIMD_gather(map, jtype); + const SNA_IVEC ni3 = ninside * vw * 3 + SIMD256_count(); + SIMD_scatter(m, (double *)(snaptr->rij[0]), ni3, delx); + SIMD_scatter(m, (double *)(snaptr->rij[0] + 1), ni3, dely); + SIMD_scatter(m, (double *)(snaptr->rij[0] + 2), ni3, delz); + const SNA_IVEC ni = ninside * vw + SIMD256_count(); + SIMD_scatter(m, (int *)(snaptr->inside), ni, j); + SIMD_scatter(m, (double *)(snaptr->wj), ni, + SIMD_gather(m, wjelem, jelem)); + SIMD_scatter(m, (double *)(snaptr->rcutij), ni, + (radi + SIMD_gather(m, radelem, jelem)) * rcutfac); + if (switchinnerflag) { + SIMD_scatter(m, (double *)(snaptr->sinnerij), ni, + (SIMD_gather(m, sinnerelem, ielem) + + SIMD_gather(m, sinnerelem, jelem)) * 0.5); + SIMD_scatter(m, (double *)(snaptr->dinnerij), ni, + (SIMD_gather(m, dinnerelem, ielem) + + SIMD_gather(m, dinnerelem, jelem)) * 0.5); + } + if (chemflag) + SIMD_scatter(m, (int *)(snaptr->element), ni, jelem); + ninside = SIMD_add(m, ninside, 1); + } // for jj + + // compute Ui, Yi for atom I + + if (chemflag) + snaptr->compute_ui(ninside, ielem, max_jnum); + else + snaptr->compute_ui(ninside, zero_vec, max_jnum); + + // Compute bispectrum + if (quadraticflag || eflag) { + snaptr->compute_zi_or_yi<0>(beta); + if (chemflag) + snaptr->compute_bi(ielem); + else + snaptr->compute_bi(zero_vec); + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + SIMD_store(bispectrum + icoeff, SIMD_load(snaptr->blist + icoeff)); + } + + // Compute beta + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + SIMD_store(beta + icoeff, SIMD_gather(coeffelem[0], + ielem * ncoeffall + icoeff + 1)); + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + SNA_DVEC bveci = SIMD_load(bispectrum + icoeff); + SNA_DVEC beta_i = SIMD_load(beta + icoeff) + + SIMD_gather(coeffelem[0], ielem * ncoeffall + k) * bveci; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + const SNA_DVEC ci = SIMD_gather(coeffelem[0], ielem * ncoeffall + k); + beta_i = beta_i + ci * SIMD_load(bispectrum + jcoeff); + SIMD_store(beta + jcoeff, ci * bveci + SIMD_load(beta + jcoeff)); + k++; + } + SIMD_store(beta + icoeff, beta_i); + } + } + + // for neighbors of I within cutoff: + // compute Fij = dEi/dRj = -dEi/dRi + // add to Fi, subtract from Fj + // scaling is that for type I + + if (quadraticflag || eflag) + snaptr->compute_yi_from_zi(beta); + else + snaptr->compute_zi_or_yi<1>(beta); + + SNA_DVEC fi_x(0.0), fi_y(0.0), fi_z(0.0); + SNA_DVEC scalev = SIMD_gather(scale[0], itype * (atom->ntypes+1) + itype); + for (int jj = 0; jj < max_jnum; jj++) { + snaptr->compute_duidrj(jj, ninside); + if (chemflag && nelements > 1) + snaptr->compute_deidrj_e(jj, ninside, fij); + else + snaptr->compute_deidrj(jj, ninside, fij); + + SNA_DVEC fijs_x = fij[0] * scalev; + SNA_DVEC fijs_y = fij[1] * scalev; + SNA_DVEC fijs_z = fij[2] * scalev; + + fi_x += fijs_x; + fi_y += fijs_y; + fi_z += fijs_z; + + for (int l = 0; l < vw; l++) { + if (jj < ninside[l]) { + int j = snaptr->inside[jj][l]; + f[j][0] -= fijs_x[l]; + f[j][1] -= fijs_y[l]; + f[j][2] -= fijs_z[l]; + + if (tally_xyz) + ev_tally_xyz(i[l],j,nlocal,newton_pair,0.0,0.0, + fij[0][l],fij[1][l],fij[2][l], + -snaptr->rij[jj][0][l],-snaptr->rij[jj][1][l], + -snaptr->rij[jj][2][l]); + } + } // for l + } // for jj + SIMD_mask m((SIMD256_count() + ii) < list->inum); + SNA_DVEC fix = SIMD_gather(m, f[0], i * 3) + fi_x; + SIMD_scatter(m, f[0], i * 3, fix); + SNA_DVEC fiy = SIMD_gather(m, f[0], i * 3 + 1) + fi_y; + SIMD_scatter(m, f[0], i * 3 + 1, fiy); + SNA_DVEC fiz = SIMD_gather(m, f[0], i * 3 + 2) + fi_z; + SIMD_scatter(m, f[0], i * 3 + 2, fiz); + + // tally energy contribution + + if (eflag) { + SNA_DVEC evdwl = SIMD_gather(coeffelem[0], ielem * ncoeffall); + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + evdwl += SIMD_gather(coeffelem[0], ielem * ncoeffall + icoeff +1) * + bispectrum[icoeff]; + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + SNA_DVEC bveci = SIMD_load(bispectrum + icoeff); + SNA_DVEC c = SIMD_gather(coeffelem[0], ielem * ncoeffall + k); + k++; + evdwl += c * 0.5 * bveci * bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + SNA_DVEC bvecj = SIMD_load(bispectrum + jcoeff); + SNA_DVEC cj = SIMD_gather(coeffelem[0], ielem * ncoeffall + k); + k++; + evdwl += cj * bveci * bvecj; + } + } + } + sevdwl += scalev * evdwl; + if (eatom) { + SNA_DVEC ea = SIMD_gather(m, eatom, i) + scalev * evdwl; + SIMD_scatter(m, eatom, i, ea); + } + } // if (eflag) + } // for ii + if (eflag) eng_vdwl += SIMD_sum(sevdwl); + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSNAPIntel::allocate() +{ + allocated = 1; + int n = atom->ntypes; + memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(scale,n+1,n+1,"pair:scale"); + map = new int[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSNAPIntel::settings(int narg, char ** /* arg */) +{ + if (narg > 0) + error->all(FLERR,"Illegal pair_style command"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSNAPIntel::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + if (narg != 4 + atom->ntypes) error->all(FLERR,"Incorrect args for pair coefficients"); + + map_element2type(narg-4,arg+4); + + // read snapcoeff and snapparam files + + read_files(arg[2],arg[3]); + + if (!quadraticflag) + ncoeff = ncoeffall - 1; + else { + + // ncoeffall should be (ncoeff+2)*(ncoeff+1)/2 + // so, ncoeff = floor(sqrt(2*ncoeffall))-1 + + ncoeff = sqrt(2.0*ncoeffall)-1; + ncoeffq = (ncoeff*(ncoeff+1))/2; + int ntmp = 1+ncoeff+ncoeffq; + if (ntmp != ncoeffall) { + error->all(FLERR,"Incorrect SNAP coeff file"); + } + } + + snaptr = new SNAIntel(lmp, rfac0, twojmax, + rmin0, switchflag, bzeroflag, + chemflag, bnormflag, wselfallflag, + nelements, switchinnerflag); + + if (ncoeff != snaptr->ncoeff) { + if (comm->me == 0) + printf("ncoeff = %d snancoeff = %d \n",ncoeff,snaptr->ncoeff); + error->all(FLERR,"Incorrect SNAP parameter file"); + } + + // Calculate maximum cutoff for all elements + rcutmax = 0.0; + for (int ielem = 0; ielem < nelements; ielem++) + rcutmax = MAX(2.0*radelem[ielem]*rcutfac,rcutmax); + + // set default scaling + int n = atom->ntypes; + for (int ii = 0; ii < n+1; ii++) + for (int jj = 0; jj < n+1; jj++) + scale[ii][jj] = 1.0; + +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSNAPIntel::init_style() +{ + if (force->newton_pair == 0) + error->all(FLERR,"Pair style SNAP requires newton pair on"); + + // need a full neighbor list + + neighbor->add_request(this, NeighConst::REQ_FULL); + + snaptr->init(); + + fix = static_cast(modify->get_fix_by_id("package_intel")); + if (!fix) error->all(FLERR, "The 'package intel' command is required for /intel styles"); + + fix->pair_init_check(); + + memory->create(bispectrum,ncoeff,"PairSNAP:bispectrum"); + memory->create(beta,ncoeff,"PairSNAP:beta"); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSNAPIntel::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + scale[j][i] = scale[i][j]; + return (radelem[map[i]] + + radelem[map[j]])*rcutfac; +} + +/* ---------------------------------------------------------------------- */ + +void PairSNAPIntel::read_files(char *coefffilename, char *paramfilename) +{ + + // open SNAP coefficient file on proc 0 + + FILE *fpcoeff; + if (comm->me == 0) { + fpcoeff = utils::open_potential(coefffilename,lmp,nullptr); + if (fpcoeff == nullptr) + error->one(FLERR,"Cannot open SNAP coefficient file {}: ", + coefffilename, utils::getsyserror()); + } + + char line[MAXLINE],*ptr; + int eof = 0; + int nwords = 0; + while (nwords == 0) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + nwords = utils::count_words(utils::trim_comment(line)); + } + if (nwords != 2) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + // strip single and double quotes from words + + int nelemtmp = 0; + try { + ValueTokenizer words(utils::trim_comment(line),"\"' \t\n\r\f"); + nelemtmp = words.next_int(); + ncoeffall = words.next_int(); + } catch (TokenizerException &e) { + error->all(FLERR,"Incorrect format in SNAP coefficient file: {}", e.what()); + } + + // clean out old arrays and set up element lists + + memory->destroy(radelem); + memory->destroy(wjelem); + memory->destroy(coeffelem); + memory->destroy(sinnerelem); + memory->destroy(dinnerelem); + memory->create(radelem,nelements,"pair:radelem"); + memory->create(wjelem,nelements,"pair:wjelem"); + memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); + memory->create(sinnerelem,nelements,"pair:sinnerelem"); + memory->create(dinnerelem,nelements,"pair:dinnerelem"); + + // initialize checklist for all required nelements + + int *elementflags = new int[nelements]; + for (int jelem = 0; jelem < nelements; jelem++) + elementflags[jelem] = 0; + + // loop over nelemtmp blocks in the SNAP coefficient file + + for (int ielem = 0; ielem < nelemtmp; ielem++) { + + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + std::vector words; + try { + words = Tokenizer(utils::trim_comment(line),"\"' \t\n\r\f").as_vector(); + } catch (TokenizerException &) { + // ignore + } + if (words.size() != 3) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + int jelem; + for (jelem = 0; jelem < nelements; jelem++) + if (words[0] == elements[jelem]) break; + + // if this element not needed, skip this block + + if (jelem == nelements) { + if (comm->me == 0) { + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + continue; + } + + if (elementflags[jelem] == 1) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + else + elementflags[jelem] = 1; + + radelem[jelem] = utils::numeric(FLERR,words[1],false,lmp); + wjelem[jelem] = utils::numeric(FLERR,words[2],false,lmp); + + if (comm->me == 0) + utils::logmesg(lmp,"SNAP Element = {}, Radius {}, Weight {}\n", + elements[jelem], radelem[jelem], wjelem[jelem]); + + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == nullptr) { + eof = 1; + fclose(fpcoeff); + } + } + + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + try { + ValueTokenizer coeff(utils::trim_comment(line)); + if (coeff.count() != 1) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + coeffelem[jelem][icoeff] = coeff.next_double(); + } catch (TokenizerException &e) { + error->all(FLERR,"Incorrect format in SNAP coefficient file: {}", e.what()); + } + } + } + + if (comm->me == 0) fclose(fpcoeff); + + for (int jelem = 0; jelem < nelements; jelem++) { + if (elementflags[jelem] == 0) + error->all(FLERR,"Element {} not found in SNAP coefficient file", elements[jelem]); + } + delete[] elementflags; + + // set flags for required keywords + + rcutfacflag = 0; + twojmaxflag = 0; + + // Set defaults for optional keywords + + rfac0 = 0.99363; + rmin0 = 0.0; + switchflag = 1; + bzeroflag = 1; + quadraticflag = 0; + chemflag = 0; + bnormflag = 0; + wselfallflag = 0; + switchinnerflag = 0; + chunksize = 32768; + parallel_thresh = 8192; + + // set local input checks + + int sinnerflag = 0; + int dinnerflag = 0; + + // open SNAP parameter file on proc 0 + + FILE *fpparam; + if (comm->me == 0) { + fpparam = utils::open_potential(paramfilename,lmp,nullptr); + if (fpparam == nullptr) + error->one(FLERR,"Cannot open SNAP parameter file {}: {}", + paramfilename, utils::getsyserror()); + } + + eof = 0; + while (true) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpparam); + if (ptr == nullptr) { + eof = 1; + fclose(fpparam); + } + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(line,MAXLINE,MPI_CHAR,0,world); + + // words = ptrs to all words in line + // strip single and double quotes from words + + std::vector words; + try { + words = Tokenizer(utils::trim_comment(line),"\"' \t\n\r\f").as_vector(); + } catch (TokenizerException &) { + // ignore + } + + if (words.size() == 0) continue; + + if (words.size() < 2) + error->all(FLERR,"Incorrect format in SNAP parameter file"); + + auto keywd = words[0]; + auto keyval = words[1]; + + // check for keywords with more than one value per element + + if (keywd == "sinner" || keywd == "dinner") { + + if ((int)words.size() != nelements+1) + error->all(FLERR,"Incorrect SNAP parameter file"); + + // innerlogstr collects all values of sinner or dinner for log output below + + std::string innerlogstr; + + int iword = 1; + + if (keywd == "sinner") { + for (int ielem = 0; ielem < nelements; ielem++) { + keyval = words[iword]; + sinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); + iword++; + innerlogstr += keyval + " "; + } + sinnerflag = 1; + } else if (keywd == "dinner") { + for (int ielem = 0; ielem < nelements; ielem++) { + keyval = words[iword]; + dinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); + iword++; + innerlogstr += keyval + " "; + } + dinnerflag = 1; + } + + if (comm->me == 0) + utils::logmesg(lmp,"SNAP keyword {} {} ... \n", keywd, innerlogstr); + + } else { + + // all other keywords take one value + + if (nwords != 2) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (comm->me == 0) + utils::logmesg(lmp,"SNAP keyword {} {}\n",keywd,keyval); + + if (keywd == "rcutfac") { + rcutfac = utils::numeric(FLERR,keyval,false,lmp); + rcutfacflag = 1; + } else if (keywd == "twojmax") { + twojmax = utils::inumeric(FLERR,keyval,false,lmp); + twojmaxflag = 1; + } else if (keywd == "rfac0") + rfac0 = utils::numeric(FLERR,keyval,false,lmp); + else if (keywd == "rmin0") + rmin0 = utils::numeric(FLERR,keyval,false,lmp); + else if (keywd == "switchflag") + switchflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "bzeroflag") + bzeroflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "quadraticflag") + quadraticflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "chemflag") + chemflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "bnormflag") + bnormflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "wselfallflag") + wselfallflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "switchinnerflag") + switchinnerflag = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "chunksize") + chunksize = utils::inumeric(FLERR,keyval,false,lmp); + else if (keywd == "parallelthresh") + parallel_thresh = utils::inumeric(FLERR,keyval,false,lmp); + else + error->all(FLERR,"Unknown parameter '{}' in SNAP parameter file", keywd); + } + } + + if (rcutfacflag == 0 || twojmaxflag == 0) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (chemflag && nelemtmp != nelements) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (switchinnerflag && !(sinnerflag && dinnerflag)) + error->all(FLERR,"Incorrect SNAP parameter file"); + + if (!switchinnerflag && (sinnerflag || dinnerflag)) + error->all(FLERR,"Incorrect SNAP parameter file"); +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +double PairSNAPIntel::memory_usage() +{ + double bytes = Pair::memory_usage(); + + int n = atom->ntypes+1; + bytes += (double)n*n*sizeof(int); // setflag + bytes += (double)n*n*sizeof(double); // cutsq + bytes += (double)n*n*sizeof(double); // scale + bytes += (double)n*sizeof(int); // map + bytes += (double)ncoeff*sizeof(SNA_DVEC); // bispectrum + bytes += (double)ncoeff*sizeof(SNA_DVEC); // beta + + bytes += snaptr->memory_usage(); // SNA object + + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void *PairSNAPIntel::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"scale") == 0) return (void *) scale; + return nullptr; +} + +#endif +#endif diff --git a/src/INTEL/pair_snap_intel.h b/src/INTEL/pair_snap_intel.h new file mode 100644 index 0000000000..2dc758f244 --- /dev/null +++ b/src/INTEL/pair_snap_intel.h @@ -0,0 +1,83 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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. +------------------------------------------------------------------------- */ + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#ifdef PAIR_CLASS +// clang-format off +PairStyle(snap/intel,PairSNAPIntel); +// clang-format on +#else + +#ifndef LMP_PAIR_SNAP_INTEL_H +#define LMP_PAIR_SNAP_INTEL_H + +#include "fix_intel.h" +#include "pair.h" + +namespace ip_simd { class SIMD_double; class SIMD_int; }; +#define SNA_DVEC ip_simd::SIMD_double +#define SNA_IVEC ip_simd::SIMD256_int + +namespace LAMMPS_NS { + +class PairSNAPIntel : public Pair { + public: + PairSNAPIntel(class LAMMPS *); + ~PairSNAPIntel() override; + void compute(int, int) override; + void settings(int, char **) override; + void coeff(int, char **) override; + void init_style() override; + double init_one(int, int) override; + double memory_usage() override; + void *extract(const char *, int &) override; + + double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 + int ncoeff; // compiler bug, manifest in KOKKOS package + + protected: + FixIntel *fix; + + int ncoeffq, ncoeffall; + class SNAIntel *snaptr; + virtual void allocate(); + void read_files(char *, char *); + inline int equal(double *x, double *y); + inline double dist2(double *x, double *y); + + double rcutmax; // max cutoff for all elements + double *radelem; // element radii + double *wjelem; // elements weights + double **coeffelem; // element bispectrum coefficients + SNA_DVEC *beta; // betas for all atoms in list + SNA_DVEC *bispectrum; // bispectrum components for all atoms in list + double **scale; // for thermodynamic integration + int twojmax, switchflag, bzeroflag, bnormflag; + int chemflag, wselfallflag; + int switchinnerflag; // inner cutoff switch + double *sinnerelem; // element inner cutoff midpoint + double *dinnerelem; // element inner cutoff half-width + int chunksize, parallel_thresh; + double rfac0, rmin0, wj1, wj2; + int rcutfacflag, twojmaxflag; // flags for required parameters +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +#endif +#endif diff --git a/src/INTEL/sna_intel.cpp b/src/INTEL/sna_intel.cpp new file mode 100644 index 0000000000..b83c90688d --- /dev/null +++ b/src/INTEL/sna_intel.cpp @@ -0,0 +1,1505 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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: W. Michael Brown, Intel +------------------------------------------------------------------------- */ + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#include "sna_intel.h" + +#include "comm.h" +#include "error.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" + +#include + +using namespace std; +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; +using namespace ip_simd; + +/* ---------------------------------------------------------------------- + + this implementation is based on the method outlined + in Bartok[1], using formulae from VMK[2]. + + for the Clebsch-Gordan coefficients, we + convert the VMK half-integral labels + a, b, c, alpha, beta, gamma + to array offsets j1, j2, j, m1, m2, m + using the following relations: + + j1 = 2*a + j2 = 2*b + j = 2*c + + m1 = alpha+a 2*alpha = 2*m1 - j1 + m2 = beta+b or 2*beta = 2*m2 - j2 + m = gamma+c 2*gamma = 2*m - j + + in this way: + + -a <= alpha <= a + -b <= beta <= b + -c <= gamma <= c + + becomes: + + 0 <= m1 <= j1 + 0 <= m2 <= j2 + 0 <= m <= j + + and the requirement that + a+b+c be integral implies that + j1+j2+j must be even. + The requirement that: + + gamma = alpha+beta + + becomes: + + 2*m - j = 2*m1 - j1 + 2*m2 - j2 + + Similarly, for the Wigner U-functions U(J,m,m') we + convert the half-integral labels J,m,m' to + array offsets j,ma,mb: + + j = 2*J + ma = J+m + mb = J+m' + + so that: + + 0 <= j <= 2*Jmax + 0 <= ma, mb <= j. + + For the bispectrum components B(J1,J2,J) we convert to: + + j1 = 2*J1 + j2 = 2*J2 + j = 2*J + + and the requirement: + + |J1-J2| <= J <= J1+J2, for j1+j2+j integral + + becomes: + + |j1-j2| <= j <= j1+j2, for j1+j2+j even integer + + or + + j = |j1-j2|, |j1-j2|+2,...,j1+j2-2,j1+j2 + + [1] Albert Bartok-Partay, "Gaussian Approximation..." + Doctoral Thesis, Cambridge University, (2009) + + [2] D. A. Varshalovich, A. N. Moskalev, and V. K. Khersonskii, + "Quantum Theory of Angular Momentum," World Scientific (1988) + +------------------------------------------------------------------------- */ + +SNAIntel::SNAIntel(LAMMPS* lmp, double rfac0_in, int twojmax_in, + double rmin0_in, int switch_flag_in, int bzero_flag_in, + int chem_flag_in, int bnorm_flag_in, int wselfall_flag_in, + int nelements_in, int switch_inner_flag_in) : Pointers(lmp) +{ + wself = 1.0; + + rfac0 = rfac0_in; + rmin0 = rmin0_in; + switch_flag = switch_flag_in; + switch_inner_flag = switch_inner_flag_in; + bzero_flag = bzero_flag_in; + chem_flag = chem_flag_in; + bnorm_flag = bnorm_flag_in; + wselfall_flag = wselfall_flag_in; + + if (bnorm_flag != chem_flag) + lmp->error->warning(FLERR, "bnormflag and chemflag are not equal." + "This is probably not what you intended"); + + if (chem_flag) + nelements = nelements_in; + else + nelements = 1; + + twojmax = twojmax_in; + + compute_ncoeff(); + + rij = nullptr; + inside = nullptr; + wj = nullptr; + rcutij = nullptr; + sinnerij = nullptr; + dinnerij = nullptr; + element = nullptr; + nmax = 0; + idxz = nullptr; + idxb = nullptr; + ulist_r_ij = nullptr; + ulist_i_ij = nullptr; + + build_indexlist(); + create_twojmax_arrays(); + + if (bzero_flag) { + double www = wself*wself*wself; + for (int j = 0; j <= twojmax; j++) + if (bnorm_flag) + bzero[j] = www; + else + bzero[j] = www*(j+1); + } + +} + +/* ---------------------------------------------------------------------- */ + +SNAIntel::~SNAIntel() +{ + memory->destroy(rij); + memory->destroy(inside); + memory->destroy(wj); + memory->destroy(rcutij); + memory->destroy(sinnerij); + memory->destroy(dinnerij); + if (chem_flag) memory->destroy(element); + memory->destroy(ulist_r_ij); + memory->destroy(ulist_i_ij); + delete[] idxz; + delete[] idxb; + destroy_twojmax_arrays(); +} + +void SNAIntel::build_indexlist() +{ + + // index list for cglist + + int jdim = twojmax + 1; + memory->create(idxcg_block, jdim, jdim, jdim, + "sna:idxcg_block"); + + int idxcg_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + idxcg_block[j1][j2][j] = idxcg_count; + for (int m1 = 0; m1 <= j1; m1++) + for (int m2 = 0; m2 <= j2; m2++) + idxcg_count++; + } + idxcg_max = idxcg_count; + + // index list for uarray + // need to include both halves + + memory->create(idxu_block, jdim, + "sna:idxu_block"); + + int idxu_count = 0; + + for (int j = 0; j <= twojmax; j++) { + idxu_block[j] = idxu_count; + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) + idxu_count++; + } + idxu_max = idxu_count; + + // index list for beta and B + + int idxb_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) idxb_count++; + + idxb_max = idxb_count; + idxb = new SNA_BINDICES[idxb_max]; + + idxb_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) { + idxb[idxb_count].j1 = j1; + idxb[idxb_count].j2 = j2; + idxb[idxb_count].j = j; + idxb_count++; + } + + // reverse index list for beta and b + + memory->create(idxb_block, jdim, jdim, jdim, + "sna:idxb_block"); + idxb_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + if (j >= j1) { + idxb_block[j1][j2][j] = idxb_count; + idxb_count++; + } + } + + // index list for zlist + + int idxz_count = 0; + + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) + idxz_count++; + + idxz_max = idxz_count; + idxz = new SNA_ZINDICES[idxz_max]; + + memory->create(idxz_block, jdim, jdim, jdim, + "sna:idxz_block"); + + idxz_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + idxz_block[j1][j2][j] = idxz_count; + + // find right beta[jjb] entry + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + idxz[idxz_count].j1 = j1; + idxz[idxz_count].j2 = j2; + idxz[idxz_count].j = j; + idxz[idxz_count].ma1min = MAX(0, (2 * ma - j - j2 + j1) / 2); + idxz[idxz_count].ma2max = (2 * ma - j - (2 * idxz[idxz_count].ma1min - j1) + j2) / 2; + idxz[idxz_count].na = MIN(j1, (2 * ma - j + j2 + j1) / 2) - idxz[idxz_count].ma1min + 1; + idxz[idxz_count].mb1min = MAX(0, (2 * mb - j - j2 + j1) / 2); + idxz[idxz_count].mb2max = (2 * mb - j - (2 * idxz[idxz_count].mb1min - j1) + j2) / 2; + idxz[idxz_count].nb = MIN(j1, (2 * mb - j + j2 + j1) / 2) - idxz[idxz_count].mb1min + 1; + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + + const int jju = idxu_block[j] + (j+1)*mb + ma; + idxz[idxz_count].jju = jju; + + idxz_count++; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::init() +{ + init_clebsch_gordan(); + // print_clebsch_gordan(); + init_rootpqarray(); +} + +void SNAIntel::grow_rij(int newnmax) +{ + if (newnmax <= nmax) return; + + nmax = newnmax; + + memory->destroy(rij); + memory->destroy(inside); + memory->destroy(wj); + memory->destroy(rcutij); + memory->destroy(sinnerij); + memory->destroy(dinnerij); + if (chem_flag) memory->destroy(element); + memory->destroy(ulist_r_ij); + memory->destroy(ulist_i_ij); + memory->create(rij, nmax, 3, "pair:rij"); + memory->create(inside, nmax, "pair:inside"); + memory->create(wj, nmax, "pair:wj"); + memory->create(rcutij, nmax, "pair:rcutij"); + memory->create(sinnerij, nmax, "pair:sinnerij"); + memory->create(dinnerij, nmax, "pair:dinnerij"); + if (chem_flag) memory->create(element, nmax, "sna:element"); + memory->create(ulist_r_ij, nmax, idxu_max, "sna:ulist_ij"); + memory->create(ulist_i_ij, nmax, idxu_max, "sna:ulist_ij"); +} + +/* ---------------------------------------------------------------------- + compute Ui by summing over neighbors j +------------------------------------------------------------------------- */ + +void SNAIntel::compute_ui(const SNA_IVEC &jnum, const SNA_IVEC &ielem, + const int max_jnum) +{ + // utot(j,ma,mb) = 0 for all j,ma,ma + // utot(j,ma,ma) = 1 for all j,ma + // for j in neighbors of i: + // compute r0 = (x,y,z,z0) + // utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb + + zero_uarraytot(ielem); + + for (int j = 0; j < max_jnum; j++) { + const SNA_DVEC x = rij[j][0]; + const SNA_DVEC y = rij[j][1]; + const SNA_DVEC z = rij[j][2]; + const SNA_DVEC rcut = rcutij[j]; + const SNA_DVEC rsq = x * x + y * y + z * z; + const SNA_DVEC r = SIMD_sqrt(rsq); + const SNA_DVEC rscale0 = SIMD_rcp(rcut - rmin0) * rfac0 * MY_PI; + const SNA_DVEC theta0 = (r - rmin0) * rscale0; + const SNA_DVEC z0 = r * SIMD_rcp(SIMD_tan(theta0)); + + compute_uarray(x, y, z, z0, r, j, jnum); + add_uarraytot(r, j, jnum); + } + +} + +/* ---------------------------------------------------------------------- + pick out right beta value +------------------------------------------------------------------------- */ + +double SNAIntel::choose_beta(const int j, const int j1, const int j2, + const int elem1, const int elem2, const int elem3, + int &itriple) +{ + double bfactor; + if (j >= j1) { + const int jjb = idxb_block[j1][j2][j]; + itriple = ((elem1 * nelements + elem2) * nelements + elem3) * + idxb_max + jjb; + if (j1 == j) { + if (j2 == j) + bfactor = 3.0; + else + bfactor = 2.0; + } else + bfactor = 1.0; + } else if (j >= j2) { + const int jjb = idxb_block[j][j2][j1]; + itriple = ((elem3 * nelements + elem2) * nelements + elem1) * + idxb_max + jjb; + if (j2 == j) + bfactor = 2.0; + else + bfactor = 1.0; + } else { + const int jjb = idxb_block[j2][j][j1]; + itriple = ((elem2 * nelements + elem3) * nelements + elem1) * + idxb_max + jjb; + bfactor = 1.0; + } + + if (!bnorm_flag && j1 > j) + bfactor *= (1.0 + j1) / (1.0 + j); + + return bfactor; +} + +/* ---------------------------------------------------------------------- + compute Yi from Ui without storing Zi, looping over zlist indices +------------------------------------------------------------------------- */ + +template +void SNAIntel::compute_zi_or_yi(const SNA_DVEC* beta) +{ + if (COMPUTE_YI) { + memset(ylist_r,0,idxu_max*nelements*sizeof(SNA_DVEC)); + memset(ylist_i,0,idxu_max*nelements*sizeof(SNA_DVEC)); + } + + double *zlist_rp = (double *)zlist_r; + double *zlist_ip = (double *)zlist_i; + + int zlist_i = 0; + + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int jjz = 0; jjz < idxz_max; jjz++) { + const int j1 = idxz[jjz].j1; + const int j2 = idxz[jjz].j2; + const int j = idxz[jjz].j; + const int ma1min = idxz[jjz].ma1min; + const int ma2max = idxz[jjz].ma2max; + const int na = idxz[jjz].na; + const int mb1min = idxz[jjz].mb1min; + const int mb2max = idxz[jjz].mb2max; + const int nb = idxz[jjz].nb; + + const double *cgblock = cglist + idxcg_block[j1][j2][j]; + + SNA_DVEC ztmp_r = 0.0; + SNA_DVEC ztmp_i = 0.0; + + const double *u_r = (double *)ulisttot_r; + const double *u_i = (double *)ulisttot_i; + + int jju1 = elem1 * idxu_max + idxu_block[j1] + (j1 + 1) * mb1min; + int jju2 = elem2 * idxu_max + idxu_block[j2] + (j2 + 1) * mb2max; + jju1 *= vector_width(); + jju2 *= vector_width(); + int icgb = mb1min * (j2 + 1) + mb2max; + for (int ib = 0; ib < nb; ib++) { + + SNA_DVEC suma1_r = 0.0; + SNA_DVEC suma1_i = 0.0; + + int ma1 = ma1min * vector_width(); + int ma2 = ma2max * vector_width(); + int icga = ma1min * (j2 + 1) + ma2max; + + for (int ia = 0; ia < na; ia++) { + const SNA_DVEC u1_r = SIMD_load(u_r + jju1 + ma1); + const SNA_DVEC u2_r = SIMD_load(u_r + jju2 + ma2); + const SNA_DVEC u1_i = SIMD_load(u_i + jju1 + ma1); + const SNA_DVEC u2_i = SIMD_load(u_i + jju2 + ma2); + suma1_r += (u1_r*u2_r - u1_i*u2_i) * cgblock[icga]; + suma1_i += (u1_r*u2_i + u1_i*u2_r) * cgblock[icga]; + ma1+= vector_width(); + ma2-= vector_width(); + icga += j2; + } // end loop over ia + + ztmp_r += suma1_r * cgblock[icgb]; + ztmp_i += suma1_i * cgblock[icgb]; + + jju1 += (j1 + 1) * vector_width(); + jju2 -= (j2 + 1) * vector_width(); + icgb += j2; + } // end loop over ib + + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + // find right y_list[jju] and beta[jjb] entries + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + + if (bnorm_flag) { + ztmp_i *= SIMD_rcp(SIMD_set(static_cast(j+1))); + ztmp_r *= SIMD_rcp(SIMD_set(static_cast(j+1))); + } + + if (COMPUTE_YI) { + int jju = idxz[jjz].jju; + for (int elem3 = 0; elem3 < nelements; elem3++) { + int itriple; + double bfactor = choose_beta(j, j1, j2, elem1, elem2, elem3, + itriple); + const SNA_DVEC betaj = beta[itriple] * bfactor; + const int i = elem3 * idxu_max + jju; + SIMD_store(&(ylist_r[i]), SIMD_load(ylist_r + i) + betaj * ztmp_r); + SIMD_store(&(ylist_i[i]), SIMD_load(ylist_i + i) + betaj * ztmp_i); + } + } else { + SIMD_store(zlist_rp + zlist_i, ztmp_r); + SIMD_store(zlist_ip + zlist_i, ztmp_i); + zlist_i += vector_width(); + } + }// end loop over jjz + } +} + +/* ---------------------------------------------------------------------- + compute Yi from Zi +------------------------------------------------------------------------- */ + +void SNAIntel::compute_yi_from_zi(const SNA_DVEC* beta) +{ + memset(ylist_r,0,idxu_max*nelements*sizeof(SNA_DVEC)); + memset(ylist_i,0,idxu_max*nelements*sizeof(SNA_DVEC)); + + double *zlist_rp = (double *)zlist_r; + double *zlist_ip = (double *)zlist_i; + + int zlist_i = 0; + + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int jjz = 0; jjz < idxz_max; jjz++) { + const int j1 = idxz[jjz].j1; + const int j2 = idxz[jjz].j2; + const int j = idxz[jjz].j; + + const SNA_DVEC ztmp_r = SIMD_load(zlist_rp + zlist_i); + const SNA_DVEC ztmp_i = SIMD_load(zlist_ip + zlist_i); + zlist_i += vector_width(); + + int jju = idxz[jjz].jju; + for (int elem3 = 0; elem3 < nelements; elem3++) { + int itriple; + double bfactor = choose_beta(j, j1, j2, elem1, elem2, elem3, + itriple); + const SNA_DVEC betaj = beta[itriple] * bfactor; + const int i = elem3 * idxu_max + jju; + SIMD_store(&(ylist_r[i]), SIMD_load(ylist_r + i) + betaj * ztmp_r); + SIMD_store(&(ylist_i[i]), SIMD_load(ylist_i + i) + betaj * ztmp_i); + } + } // end loop over jjz + } +} + +/* ---------------------------------------------------------------------- + compute dEidRj +------------------------------------------------------------------------- */ + +void SNAIntel::compute_deidrj_e(const int jj, const SNA_IVEC &jnum, + SNA_DVEC* dedr) +{ + double *ylist_rp = (double *)ylist_r; + double *ylist_ip = (double *)ylist_i; + double *dulist_rp = (double *)(dulist_r[0]); + double *dulist_ip = (double *)(dulist_i[0]); + + for (int k = 0; k < 3; k++) + dedr[k] = SIMD_set(0.0); + + SNA_IVEC jelem; + if (chem_flag) jelem = SIMD_load(element + jj); + else jelem = SIMD256_set(0); + + SIMD_mask m(jj < jnum); + + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jju3 = jju * 3; + SNA_IVEC i = jelem*idxu_max*vector_width() + jju + SIMD256_count(); + + for (int mb = 0; 2*mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_gather(m, ylist_rp, i); + SNA_DVEC jjjmambyarray_i = SIMD_gather(m, ylist_ip, i); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + i = i + vector_width(); + } + + if (j%2 == 0) { + int mb = j / 2; + for (int ma = 0; ma < mb; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_gather(m, ylist_rp, i); + SNA_DVEC jjjmambyarray_i = SIMD_gather(m, ylist_ip, i); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + i = i + vector_width(); + } + + SNA_DVEC jjjmambyarray_r = SIMD_gather(m, ylist_rp, i); + SNA_DVEC jjjmambyarray_i = SIMD_gather(m, ylist_ip, i); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_fma(m, SIMD_set(0.5), du, dedr[k]); + jju3 += vector_width(); + } + } // if j%2 + } // for j + + for (int k = 0; k < 3; k++) + dedr[k] = dedr[k] * 2.0; +} + +/* ---------------------------------------------------------------------- + compute dEidRj +------------------------------------------------------------------------- */ + +void SNAIntel::compute_deidrj(const int jj, const SNA_IVEC &jnum, + SNA_DVEC* dedr) +{ + double *ylist_rp = (double *)ylist_r; + double *ylist_ip = (double *)ylist_i; + double *dulist_rp = (double *)(dulist_r[0]); + double *dulist_ip = (double *)(dulist_i[0]); + + for (int k = 0; k < 3; k++) + dedr[k] = SIMD_set(0.0); + + SIMD_mask m(jj < jnum); + + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jju3 = jju * 3; + + for (int mb = 0; 2*mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_load(ylist_rp + jju); + SNA_DVEC jjjmambyarray_i = SIMD_load(ylist_ip + jju); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + jju += vector_width(); + } + + if (j%2 == 0) { + int mb = j / 2; + for (int ma = 0; ma < mb; ma++) { + SNA_DVEC jjjmambyarray_r = SIMD_load(ylist_rp + jju); + SNA_DVEC jjjmambyarray_i = SIMD_load(ylist_ip + jju); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_add(m, dedr[k], du); + jju3 += vector_width(); + } + jju += vector_width(); + } + + SNA_DVEC jjjmambyarray_r = SIMD_load(ylist_rp + jju); + SNA_DVEC jjjmambyarray_i = SIMD_load(ylist_ip + jju); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + SNA_DVEC du = du_r * jjjmambyarray_r + du_i * jjjmambyarray_i; + dedr[k] = SIMD_fma(m, SIMD_set(0.5), du, dedr[k]); + jju3 += vector_width(); + } + } // if j%2 + } // for j + + for (int k = 0; k < 3; k++) + dedr[k] = dedr[k] * 2.0; +} + +/* ---------------------------------------------------------------------- + compute Bi by summing conj(Ui)*Zi +------------------------------------------------------------------------- */ + +void SNAIntel::compute_bi(const SNA_IVEC &ielem) { + // for j1 = 0,...,twojmax + // for j2 = 0,twojmax + // for j = |j1-j2|,Min(twojmax,j1+j2),2 + // b(j1,j2,j) = 0 + // for mb = 0,...,jmid + // for ma = 0,...,j + // b(j1,j2,j) += + // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) + + double *ulisttot_rp = (double *)ulisttot_r; + double *ulisttot_ip = (double *)ulisttot_i; + double *blistp = (double *)blist; + + int itriple = 0; + int idouble = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + + double *zlist_rp = (double *)(zlist_r + idouble*idxz_max); + double *zlist_ip = (double *)(zlist_i + idouble*idxz_max); + + for (int elem3 = 0; elem3 < nelements; elem3++) { + for (int jjb = 0; jjb < idxb_max; jjb++) { + const int j1 = idxb[jjb].j1; + const int j2 = idxb[jjb].j2; + const int j = idxb[jjb].j; + + int jjz = idxz_block[j1][j2][j] * vector_width(); + int jju = (elem3 * idxu_max + idxu_block[j]) * vector_width(); + SNA_DVEC sumzu(0.0); + for (int mb = 0; 2 * mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + const SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + const SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + const SNA_DVEC z_r = SIMD_load(zlist_rp + jjz); + const SNA_DVEC z_i = SIMD_load(zlist_ip + jjz); + sumzu = sumzu + utot_r * z_r + utot_i * z_i; + jjz += vector_width(); + jju += vector_width(); + } // end loop over ma, mb + + // For j even, handle middle column + + if (j % 2 == 0) { + int mb = j / 2; + for (int ma = 0; ma < mb; ma++) { + const SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + const SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + const SNA_DVEC z_r = SIMD_load(zlist_rp + jjz); + const SNA_DVEC z_i = SIMD_load(zlist_ip + jjz); + sumzu = sumzu + utot_r * z_r + utot_i * z_i; + jjz += vector_width(); + jju += vector_width(); + } + + const SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + const SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + const SNA_DVEC z_r = SIMD_load(zlist_rp + jjz); + const SNA_DVEC z_i = SIMD_load(zlist_ip + jjz); + sumzu = sumzu + (utot_r * z_r + utot_i * z_i) * 0.5; + } // end if jeven + + SIMD_store(blistp + (itriple*idxb_max+jjb) * vector_width(), + sumzu * 2.0); + } + itriple++; + } + idouble++; + } + + // apply bzero shift + + if (bzero_flag) { + if (!wselfall_flag) { + SNA_IVEC itriplev = (ielem*nelements+ielem)*nelements+ielem; + for (int jjb = 0; jjb < idxb_max; jjb++) { + const int j = idxb[jjb].j; + SNA_IVEC i = (itriplev*idxb_max+jjb) * vector_width() + SIMD256_count(); + SIMD_scatter(blistp, i, SIMD_gather(blistp, i) - bzero[j]); + } // end loop over JJ + } else { + int itriple = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int elem3 = 0; elem3 < nelements; elem3++) { + for (int jjb = 0; jjb < idxb_max; jjb++) { + const int j = idxb[jjb].j; + int i = (itriple*idxb_max+jjb) * vector_width(); + SIMD_store(blistp + i, SIMD_load(blistp + i) - bzero[j]); + } // end loop over JJ + itriple++; + } // end loop over elem3 + } // end loop over elem1,elem2 + } + } +} + +/* ---------------------------------------------------------------------- + calculate derivative of Ui w.r.t. atom j +------------------------------------------------------------------------- */ + +void SNAIntel::compute_duidrj(const int jj, const SNA_IVEC &jnum) +{ + const SNA_DVEC x = rij[jj][0]; + const SNA_DVEC y = rij[jj][1]; + const SNA_DVEC z = rij[jj][2]; + const SNA_DVEC rcut = rcutij[jj]; + const SNA_DVEC rsq = x * x + y * y + z * z; + const SNA_DVEC r = SIMD_sqrt(rsq); + const SNA_DVEC rscale0 = SIMD_rcp(rcut - rmin0) * rfac0 * MY_PI; + const SNA_DVEC theta0 = (r - rmin0) * rscale0; + const SNA_DVEC z0 = r * SIMD_rcp(SIMD_tan(theta0)); + const SNA_DVEC dz0dr = z0 * SIMD_rcp(r) - (r*rscale0) * (rsq + z0 * z0) * + SIMD_rcp(rsq); + compute_duarray(x, y, z, z0, r, dz0dr, wj[jj], rcut, jj, jnum); +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::zero_uarraytot(const SNA_IVEC &ielem) +{ + double *ulisttot_rp = (double *)ulisttot_r; + double *ulisttot_ip = (double *)ulisttot_i; + for (int jelem = 0; jelem < nelements; jelem++) + for (int j = 0; j <= twojmax; j++) { + int jju = (jelem * idxu_max + idxu_block[j]) * vector_width(); + for (int mb = 0; mb <= j; mb++) { + for (int ma = 0; ma <= j; ma++) { + SIMD_store(ulisttot_rp + jju, SIMD_set(0.0)); + SIMD_store(ulisttot_ip + jju, SIMD_set(0.0)); + + // utot(j,ma,ma) = wself, sometimes + if (ma == mb) { + if (wselfall_flag || nelements == 1) + SIMD_store(ulisttot_rp + jju, SIMD_set(wself)); + else { + SIMD_mask m(ielem == jelem); + SIMD_store(ulisttot_rp + jju, + SIMD_zero_masked(~m, SIMD_set(wself))); + } + } + jju += vector_width(); + } + } + } +} + + + +/* ---------------------------------------------------------------------- + add Wigner U-functions for one neighbor to the total +------------------------------------------------------------------------- */ + +void SNAIntel::add_uarraytot(const SNA_DVEC &r, const int jj, + const SNA_IVEC &jnum) +{ + SNA_DVEC sfac = compute_sfac(r, rcutij[jj], sinnerij[jj], dinnerij[jj]); + sfac *= wj[jj]; + + double *ulisttot_rp = (double *)ulisttot_r; + double *ulisttot_ip = (double *)ulisttot_i; + const double* ulist_r = (double *)(ulist_r_ij[jj]); + const double* ulist_i = (double *)(ulist_i_ij[jj]); + + SIMD_mask m(jj < jnum); + + if (chem_flag && nelements > 1) { + SNA_IVEC jelem = SIMD_load(element+jj); + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + SNA_IVEC i = jelem*idxu_max*vector_width() + jju + SIMD256_count(); + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC utot_r = SIMD_gather(m, ulisttot_rp, i); + SNA_DVEC utot_i = SIMD_gather(m, ulisttot_ip, i); + utot_r = SIMD_fma(m, sfac, SIMD_load(ulist_r + jju), utot_r); + utot_i = SIMD_fma(m, sfac, SIMD_load(ulist_i + jju), utot_i); + SIMD_scatter(m, ulisttot_rp, i, utot_r); + SIMD_scatter(m, ulisttot_ip, i, utot_i); + jju += vector_width(); + i = i + vector_width(); + } + } + } else { + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + SNA_DVEC utot_r = SIMD_load(ulisttot_rp + jju); + SNA_DVEC utot_i = SIMD_load(ulisttot_ip + jju); + utot_r = SIMD_fma(m, sfac, SIMD_load(ulist_r + jju), utot_r); + utot_i = SIMD_fma(m, sfac, SIMD_load(ulist_i + jju), utot_i); + SIMD_store(ulisttot_rp + jju, utot_r); + SIMD_store(ulisttot_ip + jju, utot_i); + jju += vector_width(); + } + } + } +} + +/* ---------------------------------------------------------------------- + compute Wigner U-functions for one neighbor +------------------------------------------------------------------------- */ + +void SNAIntel::compute_uarray(const SNA_DVEC &x, const SNA_DVEC &y, + const SNA_DVEC &z, const SNA_DVEC &z0, + const SNA_DVEC &r, const int jj, + const SNA_IVEC &jnum) +{ + // compute Cayley-Klein parameters for unit quaternion + + const SNA_DVEC r0inv = SIMD_invsqrt(r * r + z0 * z0); + const SNA_DVEC a_r = z0 * r0inv; + const SNA_DVEC a_i = -z * r0inv; + const SNA_DVEC b_r = y * r0inv; + const SNA_DVEC b_i = -x * r0inv; + + // VMK Section 4.8.2 + + double *ulist_rp = (double *)(ulist_r_ij[jj]); + double *ulist_ip = (double *)(ulist_i_ij[jj]); + + SIMD_store(ulist_rp, SIMD_set(1.0)); + SIMD_store(ulist_ip, SIMD_set(0.0)); + + for (int j = 1; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jjup = idxu_block[j-1] * vector_width(); + + // fill in left side of matrix layer from previous layer + + for (int mb = 0; 2*mb <= j; mb++) { + SIMD_store(ulist_rp + jju, SIMD_set(0.0)); + SIMD_store(ulist_ip + jju, SIMD_set(0.0)); + + for (int ma = 0; ma < j; ma++) { + double rootpq = rootpqarray[j - ma][j - mb]; + SNA_DVEC u_r = SIMD_load(ulist_rp + jju); + SNA_DVEC u_i = SIMD_load(ulist_ip + jju); + const SNA_DVEC up_r = SIMD_load(ulist_rp + jjup); + const SNA_DVEC up_i = SIMD_load(ulist_ip + jjup); + + SNA_DVEC u_ro, u_io; + + u_ro = a_r * up_r + a_i * up_i; + u_r = SIMD_fma(SIMD_set(rootpq), u_ro, u_r); + SIMD_store(ulist_rp + jju, u_r); + u_io = a_r * up_i - a_i * up_r; + u_i = SIMD_fma(SIMD_set(rootpq), u_io, u_i); + SIMD_store(ulist_ip + jju, u_i); + + jju += vector_width(); + + rootpq = -rootpqarray[ma + 1][j - mb]; + u_r = (b_r * up_r + b_i * up_i) * rootpq; + SIMD_store(ulist_rp + jju, u_r); + u_i = (b_r * up_i - b_i * up_r) * rootpq; + SIMD_store(ulist_ip + jju, u_i); + + jjup += vector_width(); + } + jju += vector_width(); + } + + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) + + jju = idxu_block[j]; + jjup = (jju+(j+1)*(j+1)-1) * vector_width(); + jju *= vector_width(); + int mbpar = 1; + for (int mb = 0; 2*mb <= j; mb++) { + int mapar = mbpar; + for (int ma = 0; ma <= j; ma++) { + if (mapar == 1) { + SIMD_store(ulist_rp + jjup, SIMD_load(ulist_rp + jju)); + SIMD_store(ulist_ip + jjup, -SIMD_load(ulist_ip + jju)); + } else { + SIMD_store(ulist_rp + jjup, -SIMD_load(ulist_rp + jju)); + SIMD_store(ulist_ip + jjup, SIMD_load(ulist_ip + jju)); + } + mapar = -mapar; + jju += vector_width(); + jjup -= vector_width(); + } + mbpar = -mbpar; + } + } +} + +/* ---------------------------------------------------------------------- + Compute derivatives of Wigner U-functions for one neighbor + see comments in compute_uarray() +------------------------------------------------------------------------- */ + +void SNAIntel::compute_duarray(const SNA_DVEC &x, const SNA_DVEC &y, + const SNA_DVEC &z, const SNA_DVEC &z0, + const SNA_DVEC &r, const SNA_DVEC &dz0dr, + const SNA_DVEC &wj, const SNA_DVEC &rcut, + const int jj, const SNA_IVEC &jnum) +{ + const SNA_DVEC rinv = SIMD_rcp(r); + const SNA_DVEC r0inv = SIMD_invsqrt(r * r + z0 * z0); + SNA_DVEC up[3]; + up[0] = x * rinv; + up[1] = y * rinv; + up[2] = z * rinv; + const SNA_DVEC a_r = z0 * r0inv; + const SNA_DVEC a_i = -z * r0inv; + const SNA_DVEC b_r = y * r0inv; + const SNA_DVEC b_i = -x * r0inv; + const SNA_DVEC dr0invdr = -SIMD_pow(r0inv, 3.0) * (r + z0 * dz0dr); + + SNA_DVEC dr0inv[3], da_r[3], da_i[3]; + for (int k = 0; k < 3; k++) { + dr0inv[k] = dr0invdr * up[k]; + da_r[k] = dz0dr * up[k] * r0inv + z0 * dr0inv[k]; + da_i[k] = -z * dr0inv[k]; + } + da_i[2] += -r0inv; + + double *ulist_rp = (double *)(ulist_r_ij[jj]); + double *ulist_ip = (double *)(ulist_i_ij[jj]); + double *dulist_rp = (double *)(dulist_r[0]); + double *dulist_ip = (double *)(dulist_i[0]); + + SNA_DVEC db_r[3], db_i[3]; + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + k * vector_width(), SIMD_set(0.0)); + SIMD_store(dulist_ip + k * vector_width(), SIMD_set(0.0)); + db_r[k] = y * dr0inv[k]; + db_i[k] = -x * dr0inv[k]; + } + db_i[0] -= r0inv; + db_r[1] += r0inv; + + for (int j = 1; j <= twojmax; j++) { + int jju3 = idxu_block[j] * 3 * vector_width(); + int jjup = idxu_block[j-1] * vector_width(); + int jjup3 = jjup * 3; + for (int mb = 0; 2*mb <= j; mb++) { + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + jju3 + k * vector_width(), SIMD_set(0.0)); + SIMD_store(dulist_ip + jju3 + k * vector_width(), SIMD_set(0.0)); + } + + for (int ma = 0; ma < j; ma++) { + const double rootpq = rootpqarray[j - ma][j - mb]; + const double mrootpq = -rootpqarray[ma + 1][j - mb]; + const SNA_DVEC up_r = SIMD_load(ulist_rp + jjup); + const SNA_DVEC up_i = SIMD_load(ulist_ip + jjup); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = SIMD_load(dulist_rp + jju3); + SNA_DVEC du_i = SIMD_load(dulist_ip + jju3); + const SNA_DVEC dup_r = SIMD_load(dulist_rp + jjup3); + const SNA_DVEC dup_i = SIMD_load(dulist_ip + jjup3); + + SNA_DVEC du_ro, du_io; + + du_ro = (da_r[k]*up_r + da_i[k]*up_i + a_r*dup_r + a_i*dup_i); + du_r = SIMD_fma(SIMD_set(rootpq), du_ro, du_r); + SIMD_store(dulist_rp + jju3, du_r); + + du_io = (da_r[k]*up_i - da_i[k]*up_r + a_r*dup_i - a_i*dup_r); + du_i = SIMD_fma(SIMD_set(rootpq), du_io, du_i); + SIMD_store(dulist_ip + jju3, du_i); + + du_r = (db_r[k]*up_r + db_i[k]*up_i + b_r*dup_r + b_i*dup_i); + SIMD_store(dulist_rp + jju3 + 3 * vector_width(), du_r * mrootpq); + + du_i = (db_r[k]*up_i - db_i[k]*up_r + b_r*dup_i - b_i*dup_r); + SIMD_store(dulist_ip + jju3 + 3 * vector_width(), du_i * mrootpq); + + jju3 += vector_width(); + jjup3 += vector_width(); + } + jjup += vector_width(); + } // for ma + jju3 += 3 * vector_width(); + } // for mb + + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) + + SNA_DVEC *du_r_p = dulist_r[0]; + SNA_DVEC *du_i_p = dulist_i[0]; + + int jju = idxu_block[j]; + jjup = (jju+(j+1)*(j+1)-1) * 3 * vector_width(); + jju *= 3 * vector_width(); + int mbpar = 1; + for (int mb = 0; 2*mb <= j; mb++) { + int mapar = mbpar; + for (int ma = 0; ma <= j; ma++) { + if (mapar == 1) { + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + jjup, SIMD_load(dulist_rp + jju)); + SIMD_store(dulist_ip + jjup, -SIMD_load(dulist_ip + jju)); + jju += vector_width(); + jjup += vector_width(); + } + } else { + for (int k = 0; k < 3; k++) { + SIMD_store(dulist_rp + jjup, -SIMD_load(dulist_rp + jju)); + SIMD_store(dulist_ip + jjup, SIMD_load(dulist_ip + jju)); + jju += vector_width(); + jjup += vector_width(); + } + } + mapar = -mapar; + jjup -= 6 * vector_width(); + } // for ma + mbpar = -mbpar; + } // for mb + } // for j + + SNA_DVEC dsfac; + SNA_DVEC sfac = compute_sfac_dsfac(r, rcut, sinnerij[jj], dinnerij[jj], + dsfac); + sfac = sfac * wj; + dsfac = dsfac * wj; + + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j] * vector_width(); + int jju3 = jju * 3; + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + const SNA_DVEC ur_dsfac = dsfac * SIMD_load(ulist_rp + jju); + const SNA_DVEC ui_dsfac = dsfac * SIMD_load(ulist_ip + jju); + jju += vector_width(); + for (int k = 0; k < 3; k++) { + SNA_DVEC du_r = ur_dsfac * up[k] + sfac * SIMD_load(dulist_rp+jju3); + SIMD_store(dulist_rp + jju3, du_r); + SNA_DVEC du_i = ui_dsfac * up[k] + sfac * SIMD_load(dulist_ip+jju3); + SIMD_store(dulist_ip + jju3, du_i); + jju3 += vector_width(); + } + } + } +} + +/* ---------------------------------------------------------------------- + memory usage of arrays +------------------------------------------------------------------------- */ + +double SNAIntel::memory_usage() +{ + int jdimpq = twojmax + 2; + int jdim = twojmax + 1; + double bytes; + + bytes = 0; + + bytes += (double)jdimpq*jdimpq * sizeof(double); // pqarray + bytes += (double)idxcg_max * sizeof(double); // cglist + + bytes += (double)nmax * idxu_max * sizeof(SNA_DVEC) * 2; // ulist_ij + bytes += (double)idxu_max * nelements * sizeof(SNA_DVEC) * 2; // ulisttot + bytes += (double)idxu_max * 3 * sizeof(SNA_DVEC) * 2; // dulist + + bytes += (double)idxz_max * ndoubles * sizeof(SNA_DVEC) * 2; // zlist + bytes += (double)idxb_max * ntriples * sizeof(SNA_DVEC); // blist + bytes += (double)idxb_max * ntriples * 3 * sizeof(double); // dblist + bytes += (double)idxu_max * nelements * sizeof(SNA_DVEC) * 2; // ylist + + bytes += (double)jdim * jdim * jdim * sizeof(int); // idxcg_block + bytes += (double)jdim * sizeof(int); // idxu_block + bytes += (double)jdim * jdim * jdim * sizeof(int); // idxz_block + bytes += (double)jdim * jdim * jdim * sizeof(int); // idxb_block + + bytes += (double)idxz_max * sizeof(SNA_ZINDICES); // idxz + bytes += (double)idxb_max * sizeof(SNA_BINDICES); // idxb + + if (bzero_flag) + bytes += (double)jdim * sizeof(double); // bzero + + bytes += (double)nmax * 3 * sizeof(SNA_DVEC); // rij + bytes += (double)nmax * sizeof(SNA_IVEC); // inside + bytes += (double)nmax * sizeof(SNA_DVEC); // wj + bytes += (double)nmax * sizeof(SNA_DVEC); // rcutij + bytes += (double)nmax * sizeof(SNA_DVEC); // sinnerij + bytes += (double)nmax * sizeof(SNA_DVEC); // dinnerij + if (chem_flag) bytes += (double)nmax * sizeof(SNA_IVEC); // element + + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::create_twojmax_arrays() +{ + int jdimpq = twojmax + 2; + memory->create(rootpqarray, jdimpq, jdimpq, + "sna:rootpqarray"); + memory->create(cglist, idxcg_max, "sna:cglist"); + memory->create(ulisttot_r, idxu_max*nelements, "sna:ulisttot"); + memory->create(ulisttot_i, idxu_max*nelements, "sna:ulisttot"); + memory->create(dulist_r, idxu_max, 3, "sna:dulist"); + memory->create(dulist_i, idxu_max, 3, "sna:dulist"); + memory->create(zlist_r, idxz_max*ndoubles, "sna:zlist"); + memory->create(zlist_i, idxz_max*ndoubles, "sna:zlist"); + memory->create(blist, idxb_max*ntriples, "sna:blist"); + memory->create(dblist, idxb_max*ntriples, 3, "sna:dblist"); + memory->create(ylist_r, idxu_max*nelements, "sna:ylist"); + memory->create(ylist_i, idxu_max*nelements, "sna:ylist"); + + if (bzero_flag) + memory->create(bzero, twojmax+1,"sna:bzero"); + else + bzero = nullptr; + +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::destroy_twojmax_arrays() +{ + memory->destroy(rootpqarray); + memory->destroy(cglist); + memory->destroy(ulisttot_r); + memory->destroy(ulisttot_i); + memory->destroy(dulist_r); + memory->destroy(dulist_i); + memory->destroy(zlist_r); + memory->destroy(zlist_i); + memory->destroy(blist); + memory->destroy(dblist); + memory->destroy(ylist_r); + memory->destroy(ylist_i); + + memory->destroy(idxcg_block); + memory->destroy(idxu_block); + memory->destroy(idxz_block); + memory->destroy(idxb_block); + + if (bzero_flag) + memory->destroy(bzero); + +} + +/* ---------------------------------------------------------------------- + the function delta given by VMK Eq. 8.2(1) +------------------------------------------------------------------------- */ + +double SNAIntel::deltacg(int j1, int j2, int j) +{ + double sfaccg = factorial((j1 + j2 + j) / 2 + 1); + return sqrt(factorial((j1 + j2 - j) / 2) * + factorial((j1 - j2 + j) / 2) * + factorial((-j1 + j2 + j) / 2) / sfaccg); +} + +/* ---------------------------------------------------------------------- + assign Clebsch-Gordan coefficients using + the quasi-binomial formula VMK 8.2.1(3) +------------------------------------------------------------------------- */ + +void SNAIntel::init_clebsch_gordan() +{ + double sum,dcg,sfaccg; + int m, aa2, bb2, cc2; + int ifac; + + int idxcg_count = 0; + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { + for (int m1 = 0; m1 <= j1; m1++) { + aa2 = 2 * m1 - j1; + + for (int m2 = 0; m2 <= j2; m2++) { + + // -c <= cc <= c + + bb2 = 2 * m2 - j2; + m = (aa2 + bb2 + j) / 2; + + if (m < 0 || m > j) { + cglist[idxcg_count] = 0.0; + idxcg_count++; + continue; + } + + sum = 0.0; + + for (int z = MAX(0, MAX(-(j - j2 + aa2) + / 2, -(j - j1 - bb2) / 2)); + z <= MIN((j1 + j2 - j) / 2, + MIN((j1 - aa2) / 2, (j2 + bb2) / 2)); + z++) { + ifac = z % 2 ? -1 : 1; + sum += ifac / + (factorial(z) * + factorial((j1 + j2 - j) / 2 - z) * + factorial((j1 - aa2) / 2 - z) * + factorial((j2 + bb2) / 2 - z) * + factorial((j - j2 + aa2) / 2 + z) * + factorial((j - j1 - bb2) / 2 + z)); + } + + cc2 = 2 * m - j; + dcg = deltacg(j1, j2, j); + sfaccg = sqrt(factorial((j1 + aa2) / 2) * + factorial((j1 - aa2) / 2) * + factorial((j2 + bb2) / 2) * + factorial((j2 - bb2) / 2) * + factorial((j + cc2) / 2) * + factorial((j - cc2) / 2) * + (j + 1)); + + cglist[idxcg_count] = sum * dcg * sfaccg; + idxcg_count++; + } + } + } +} + +/* ---------------------------------------------------------------------- + print out values of Clebsch-Gordan coefficients + format and notation follows VMK Table 8.11 +------------------------------------------------------------------------- */ + +void SNAIntel::print_clebsch_gordan() +{ + if (comm->me) return; + + int aa2, bb2, cc2; + for (int j = 0; j <= twojmax; j += 1) { + printf("c = %g\n",j/2.0); + printf("a alpha b beta C_{a alpha b beta}^{c alpha+beta}\n"); + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + if (j1-j2 <= j && j1+j2 >= j && (j1+j2+j)%2 == 0) { + int idxcg_count = idxcg_block[j1][j2][j]; + for (int m1 = 0; m1 <= j1; m1++) { + aa2 = 2*m1-j1; + for (int m2 = 0; m2 <= j2; m2++) { + bb2 = 2*m2-j2; + double cgtmp = cglist[idxcg_count]; + cc2 = aa2+bb2; + if (cc2 >= -j && cc2 <= j) + if (j1 != j2 || (aa2 > bb2 && aa2 >= -bb2) || (aa2 == bb2 && aa2 >= 0)) + printf("%4g %4g %4g %4g %10.6g\n", + j1/2.0,aa2/2.0,j2/2.0,bb2/2.0,cgtmp); + idxcg_count++; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + pre-compute table of sqrt[p/m2], p, q = 1,twojmax + the p = 0, q = 0 entries are allocated and skipped for convenience. +------------------------------------------------------------------------- */ + +void SNAIntel::init_rootpqarray() +{ + for (int p = 1; p <= twojmax; p++) + for (int q = 1; q <= twojmax; q++) + rootpqarray[p][q] = sqrt(static_cast(p)/q); +} + +/* ---------------------------------------------------------------------- */ + +void SNAIntel::compute_ncoeff() +{ + int ncount; + + ncount = 0; + + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= j1; j2++) + for (int j = j1 - j2; + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) ncount++; + + ndoubles = nelements*nelements; + ntriples = nelements*nelements*nelements; + if (chem_flag) + ncoeff = ncount*ntriples; + else + ncoeff = ncount; +} + +/* ---------------------------------------------------------------------- */ + +double SNAIntel::compute_sfac(double r, double rcut, double sinner, double dinner) +{ + double sfac; + + // calculate sfac = sfac_outer + + if (switch_flag == 0) sfac = 1.0; + else if (r <= rmin0) sfac = 1.0; + else if (r > rcut) sfac = 0.0; + else { + double rcutfac = MY_PI / (rcut - rmin0); + sfac = 0.5 * (cos((r - rmin0) * rcutfac) + 1.0); + } + + // calculate sfac *= sfac_inner, rarely visited + + if (switch_inner_flag == 1 && r < sinner + dinner) { + if (r > sinner - dinner) { + double rcutfac = MY_PI2 / dinner; + sfac *= 0.5 * (1.0 - cos(MY_PI2 + (r - sinner) * rcutfac)); + } else sfac = 0.0; + } + + return sfac; +} + +/* ---------------------------------------------------------------------- */ + +SNA_DVEC SNAIntel::compute_sfac(const SNA_DVEC &r, const SNA_DVEC &rcut, + const SNA_DVEC &sinner, const SNA_DVEC &dinner) +{ + // calculate sfac = sfac_outer + + // if (switch_flag == 0 || r <= rmin0) + SNA_DVEC sfac = SIMD_set(1.0); + if (switch_flag != 0) { + // r <= rcut && r > rmin0 + const SIMD_mask i(r > rmin0); + const SIMD_mask m(r <= rcut); + const SNA_DVEC rcutfac = SIMD_rcp(rcut - rmin0) * MY_PI; + const SNA_DVEC sfac_m = (SIMD_cos((r - rmin0) * rcutfac) + 1.0) * 0.5; + sfac = SIMD_set(sfac, m & i, sfac_m); + // (r > rcut) && (r> rmin0) + sfac = SIMD_zero_masked(m | i, sfac); + } + + // calculate sfac *= sfac_inner, rarely visited + + if (switch_inner_flag == 1) { + const SIMD_mask m(r < sinner + dinner); + // if any(m) + const SIMD_mask i(r > sinner - dinner); + const SNA_DVEC rcutfac = SIMD_rcp(dinner) * MY_PI2; + const SNA_DVEC sfac_m = (SIMD_set(1.0) - SIMD_cos((r-sinner) * rcutfac + + MY_PI2)) * 0.5; + sfac = SIMD_set(sfac, m & i, sfac_m); + sfac = SIMD_zero_masked((~m) | i, sfac); + } + + return sfac; +} + +/* ---------------------------------------------------------------------- */ + +SNA_DVEC SNAIntel::compute_sfac_dsfac(const SNA_DVEC & r, + const SNA_DVEC & rcut, + const SNA_DVEC & sinner, + const SNA_DVEC & dinner, + SNA_DVEC &dsfac) +{ + // calculate sfac = sfac_outer + + // if (switch_flag == 0 || r <= rmin0) + SNA_DVEC sfac = SIMD_set(1.0); + dsfac = SIMD_set(0.0); + if (switch_flag != 0) { + // r <= rcut && r > rmin0 + const SIMD_mask i(r > rmin0); + const SIMD_mask m(r <= rcut); + const SNA_DVEC rcutfac = SIMD_rcp(rcut - rmin0) * MY_PI; + const SNA_DVEC trig_arg = (r - rmin0) * rcutfac; + const SNA_DVEC sfac_m = (SIMD_cos(trig_arg) + 1.0) * 0.5; + const SNA_DVEC dsfac_m = SIMD_sin(trig_arg) * rcutfac * -0.5; + sfac = SIMD_set(sfac, m & i, sfac_m); + dsfac = SIMD_set(dsfac, m & i, dsfac_m); + // (r > rcut) && (r> rmin0) + sfac = SIMD_zero_masked(m | i, sfac); + } + + // calculate sfac *= sfac_inner, rarely visited + + if (switch_inner_flag == 1) { + const SIMD_mask m(r < sinner + dinner); + const SIMD_mask i(r > sinner - dinner); + if (any(m & i)) { + const SNA_DVEC rcutfac = SIMD_rcp(dinner) * MY_PI2; + const SNA_DVEC trig_arg = (r - sinner) * rcutfac + MY_PI2; + const SNA_DVEC sfac_inner = (SIMD_set(1.0) - SIMD_cos(trig_arg)) * 0.5; + const SNA_DVEC dsfac_inner = rcutfac * 0.5 * SIMD_sin(trig_arg); + dsfac = SIMD_set(dsfac, m & i, dsfac * sfac_inner + + sfac * dsfac_inner); + sfac = SIMD_set(sfac, m & i, sfac_inner); + } + sfac = SIMD_zero_masked((~m) | i, sfac); + dsfac = SIMD_zero_masked((~m) | i, dsfac); + } + + return sfac; +} + +template void SNAIntel::compute_zi_or_yi<1>(const SNA_DVEC *); +template void SNAIntel::compute_zi_or_yi<0>(const SNA_DVEC *); + +#endif +#endif diff --git a/src/INTEL/sna_intel.h b/src/INTEL/sna_intel.h new file mode 100644 index 0000000000..7900dee51b --- /dev/null +++ b/src/INTEL/sna_intel.h @@ -0,0 +1,187 @@ +/* -*- c++ -*- ------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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: W. Michael Brown, Intel +------------------------------------------------------------------------- */ + +#ifndef LMP_SNA_INTEL_H +#define LMP_SNA_INTEL_H + +#if defined(__AVX512F__) +#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER) + +#include "pointers.h" +#include "intel_buffers.h" +#include "intel_simd.h" + +#define SVW 8 + +#if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) +#define SV_for _Pragma("omp simd") _Pragma("vector aligned") for +#else +#define SV_for _Pragma("simd assert") _Pragma("vector aligned") for +#endif +#else +#define SV_for for +#endif + +namespace LAMMPS_NS { + +struct SNA_ZINDICES { + int j1, j2, j, ma1min, ma2max, mb1min; + int mb2max, na, nb, jju; +}; + +struct SNA_BINDICES { + int j1, j2, j; +}; + +#define SNA_DVEC ip_simd::SIMD_double +#define SNA_IVEC ip_simd::SIMD256_int + +class SNAIntel : protected Pointers { + + public: + SNAIntel(LAMMPS *, double, int, double, int, int, int, int, int, int, int); + + SNAIntel(LAMMPS *lmp) : Pointers(lmp){}; + ~SNAIntel() override; + void build_indexlist(); + void init(); + double memory_usage(); + + int ncoeff; + + inline int vector_width() const { return SVW; } + + // functions for bispectrum coefficients + + void compute_ui(const SNA_IVEC &, const SNA_IVEC &, const int max_jnum); + template void compute_zi_or_yi(const SNA_DVEC *); + void compute_yi_from_zi(const SNA_DVEC *); + void compute_yterm(int, int, int, const double *); + void compute_bi(const SNA_IVEC &); + + // functions for derivatives + + void compute_duidrj(const int, const SNA_IVEC &); + void compute_deidrj_e(const int, const SNA_IVEC &, SNA_DVEC *); + void compute_deidrj(const int, const SNA_IVEC &, SNA_DVEC *); + double compute_sfac(double, double, double, double); + SNA_DVEC compute_sfac(const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &); + inline SNA_DVEC compute_sfac_dsfac(const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, + SNA_DVEC &); + + // public bispectrum data + + int twojmax; + SNA_DVEC *blist; + double **dblist; + + // short neighbor list data + + void grow_rij(int); + int nmax; // allocated size of short lists + + SNA_DVEC **rij; // short rij list + SNA_IVEC *inside; // short neighbor list + SNA_DVEC *wj; // short weight list + SNA_DVEC *rcutij; // short cutoff list + + // only allocated for switch_inner_flag=1 + + SNA_DVEC *sinnerij; // short inner cutoff midpoint list + SNA_DVEC *dinnerij; // short inner half-width list + + // only allocated for chem_flag=1 + + SNA_IVEC *element; // short element list [0,nelements) + + private: + double rmin0, rfac0; + + // data for bispectrum coefficients + + SNA_ZINDICES *idxz; + SNA_BINDICES *idxb; + + double **rootpqarray; + double *cglist; + int ***idxcg_block; + + SNA_DVEC *ulisttot_r, *ulisttot_i; + SNA_DVEC **ulist_r_ij, **ulist_i_ij; // short u list + int *idxu_block; + + SNA_DVEC *zlist_r, *zlist_i; + int ***idxz_block; + + int ***idxb_block; + + SNA_DVEC **dulist_r, **dulist_i; + + SNA_DVEC *ylist_r, *ylist_i; + int idxcg_max, idxu_max, idxz_max, idxb_max; + + void create_twojmax_arrays(); + void destroy_twojmax_arrays(); + void init_clebsch_gordan(); + void print_clebsch_gordan(); + void init_rootpqarray(); + void zero_uarraytot(const SNA_IVEC &); + void add_uarraytot(const SNA_DVEC &, const int, const SNA_IVEC &); + void compute_uarray(const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, const int, + const SNA_IVEC &); + double deltacg(int, int, int); + void compute_ncoeff(); + void compute_duarray(const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, const SNA_DVEC &, + const SNA_DVEC &, const SNA_DVEC &, int, + const SNA_IVEC &); + inline double choose_beta(const int, const int, const int, + const int, const int, const int, int &); + + // Sets the style for the switching function + // 0 = none + // 1 = cosine + int switch_flag; + + // Sets the style for the inner switching function + // 0 = none + // 1 = cosine + int switch_inner_flag; + + // Self-weight + double wself; + + int bzero_flag; // 1 if bzero subtracted from barray + double *bzero; // array of B values for isolated atoms + int bnorm_flag; // 1 if barray divided by j+1 + int chem_flag; // 1 for multi-element bispectrum components + int wselfall_flag; // 1 for adding wself to all element labelings + int nelements; // number of elements + int ndoubles; // number of multi-element pairs + int ntriples; // number of multi-element triplets +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +#endif From 5e657e5adbd624a5d50829cc1f6406b332f0d663 Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Thu, 14 Sep 2023 18:01:55 -0400 Subject: [PATCH 078/417] Intel Package: Adding documentation changes for snap variant. --- doc/src/pair_snap.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst index ebedb288c1..df8cb9ad6c 100644 --- a/doc/src/pair_snap.rst +++ b/doc/src/pair_snap.rst @@ -1,10 +1,11 @@ .. index:: pair_style snap +.. index:: pair_style snap/intel .. index:: pair_style snap/kk pair_style snap command ======================= -Accelerator Variants: *snap/kk* +Accelerator Variants: *snap/intel*, *snap/kk* Syntax """""" @@ -258,7 +259,15 @@ Restrictions This style is part of the ML-SNAP package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` page for more info. +` page for more info. The *intel* accelerator variant +will only be available LAMMPS is built with Intel compilers for CPUs +with AVX-512 support. While the *intel* package allows multiple floating +point precision modes to be selected, snap will currently use full +double precision regardless of the precision mode selected. +Additionally, the *intel* variant of snap will not use multiple threads +with OpenMP. + + Related commands """""""""""""""" From 7b4ca086a8692b2989e7279d7e18c94944ee801e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 14 Sep 2023 19:08:15 -0400 Subject: [PATCH 079/417] documentation updates, clarifications, and corrections --- doc/src/Commands_pair.rst | 2 +- doc/src/pair_snap.rst | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index c45a1d778c..0d54913bd7 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -265,7 +265,7 @@ OPT. * :doc:`smd/tri_surface ` * :doc:`smd/ulsph ` * :doc:`smtbq ` - * :doc:`snap (k) ` + * :doc:`snap (ik) ` * :doc:`soft (go) ` * :doc:`sph/heatconduction ` * :doc:`sph/idealgas ` diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst index df8cb9ad6c..ffc43c712a 100644 --- a/doc/src/pair_snap.rst +++ b/doc/src/pair_snap.rst @@ -259,15 +259,15 @@ Restrictions This style is part of the ML-SNAP package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` page for more info. The *intel* accelerator variant -will only be available LAMMPS is built with Intel compilers for CPUs -with AVX-512 support. While the *intel* package allows multiple floating -point precision modes to be selected, snap will currently use full -double precision regardless of the precision mode selected. -Additionally, the *intel* variant of snap will not use multiple threads -with OpenMP. - +` page for more info. +The *snap/intel* accelerator variant will *only* be available if LAMMPS +is built with Intel *compilers* and for CPUs with AVX-512 support. +While the INTEL package in general allows multiple floating point +precision modes to be selected, *snap/intel* will currently always use +full double precision regardless of the precision mode selected. +Additionally, the *intel* variant of snap will **NOT** use multiple +threads with OpenMP. Related commands """""""""""""""" From d1e405e83f0fc1dec8583064eb2505983447a1c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 14 Sep 2023 19:08:38 -0400 Subject: [PATCH 080/417] ML-SNAP now also has INTEL as dependent package --- src/Depend.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Depend.sh b/src/Depend.sh index 4004f12686..b88c527b55 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -185,6 +185,7 @@ fi if (test $1 = "ML-SNAP") then depend ML-IAP depend KOKKOS + depend INTEL fi if (test $1 = "CG-SPICA") then From 508dbb74c58c252a7833c959e1802618de43cb24 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Sep 2023 08:37:32 -0400 Subject: [PATCH 081/417] print warning when using threads that snap/intel will not use them --- src/INTEL/pair_snap_intel.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/INTEL/pair_snap_intel.cpp b/src/INTEL/pair_snap_intel.cpp index 7417b08f9d..d91f0adc36 100644 --- a/src/INTEL/pair_snap_intel.cpp +++ b/src/INTEL/pair_snap_intel.cpp @@ -336,6 +336,8 @@ void PairSNAPIntel::settings(int narg, char ** /* arg */) { if (narg > 0) error->all(FLERR,"Illegal pair_style command"); + if ((comm->me == 0) && (comm->nthreads > 1)) + error->warning(FLERR, "Pair style snap/intel does not use OpenMP threads"); } /* ---------------------------------------------------------------------- From cf8b1577027f5c236000e227571213814cc383ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 19:38:53 -0400 Subject: [PATCH 082/417] use QtRegExp for QT 5.12 on Ubuntu 20.04LTS --- tools/lammps-gui/lammpsgui.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 1f997f53b8..6e3cae8cca 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1106,7 +1106,11 @@ void LammpsGui::render_image() // add a run 0 and thus create the state of the initial system without running. // this will allow us to create a snapshot image. auto saved = ui->textEdit->textCursor(); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + if (ui->textEdit->find(QRegExp(QStringLiteral("^\\s*(run|minimize)\\s+")))) { +#else if (ui->textEdit->find(QRegularExpression(QStringLiteral("^\\s*(run|minimize)\\s+")))) { +#endif auto cursor = ui->textEdit->textCursor(); cursor.movePosition(QTextCursor::PreviousBlock); cursor.movePosition(QTextCursor::EndOfLine); From 20be9e64cfd69efb0c36fcc5837eec100c4cd633 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 19:39:31 -0400 Subject: [PATCH 083/417] use split_line convenience function for better consistency and backward compatibility --- tools/lammps-gui/codeeditor.cpp | 26 +++++++++++++------------- tools/lammps-gui/lammpsgui.cpp | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 6c7ae33283..07cb63bc98 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -173,7 +173,7 @@ CodeEditor::CodeEditor(QWidget *parent) : if (help_index.open(QIODevice::ReadOnly | QIODevice::Text)) { while (!help_index.atEnd()) { auto line = QString(help_index.readLine()); - auto words = line.trimmed().split(' '); + auto words = line.trimmed().replace('\t', ' ').split(' '); if (words.size() > 2) { if (words.at(1) == "pair_style") { pair_map[words.at(2)] = words.at(0); @@ -396,8 +396,8 @@ void CodeEditor::setGroupList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(groupcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); - if ((words.size() > 1) && !groups.contains(words[1])) groups << words[1]; + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); + if ((words.size() > 1) && !groups.contains(words[1].c_str())) groups << words[1].c_str(); } groups.sort(); groups.prepend(QStringLiteral("all")); @@ -426,13 +426,13 @@ void CodeEditor::setVarNameList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(varcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); if ((words.size() > 1)) { - QString w = QString("$%1").arg(words[1]); + QString w = QString("$%1").arg(words[1].c_str()); if ((words[1].size() == 1) && !vars.contains(w)) vars << w; - w = QString("${%1}").arg(words[1]); + w = QString("${%1}").arg(words[1].c_str()); if (!vars.contains(w)) vars << w; - w = QString("v_%1").arg(words[1]); + w = QString("v_%1").arg(words[1].c_str()); if (!vars.contains(w)) vars << w; } } @@ -452,11 +452,11 @@ void CodeEditor::setComputeIDList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(compcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); if ((words.size() > 1)) { - QString w = QString("c_%1").arg(words[1]); + QString w = QString("c_%1").arg(words[1].c_str()); if (!compid.contains(w)) compid << w; - w = QString("C_%1").arg(words[1]); + w = QString("C_%1").arg(words[1].c_str()); if (!compid.contains(w)) compid << w; } } @@ -476,11 +476,11 @@ void CodeEditor::setFixIDList() cursor.movePosition(QTextCursor::Start); setTextCursor(cursor); while (find(fixcmd)) { - auto words = textCursor().block().text().replace('\t', ' ').split(' ', Qt::SkipEmptyParts); + auto words = split_line(textCursor().block().text().replace('\t', ' ').toStdString()); if ((words.size() > 1)) { - QString w = QString("f_%1").arg(words[1]); + QString w = QString("f_%1").arg(words[1].c_str()); if (!fixid.contains(w)) fixid << w; - w = QString("F_%1").arg(words[1]); + w = QString("F_%1").arg(words[1].c_str()); if (!fixid.contains(w)) fixid << w; } } diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 6e3cae8cca..7fff307ed3 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -528,7 +528,7 @@ void LammpsGui::update_recents(const QString &filename) void LammpsGui::update_variables() { - const auto doc = ui->textEdit->toPlainText().split('\n'); + const auto doc = ui->textEdit->toPlainText().replace('\t', ' ').split('\n'); QStringList known; QRegularExpression indexvar("^\\s*variable\\s+(\\w+)\\s+index\\s+(.*)"); QRegularExpression anyvar("^\\s*variable\\s+(\\w+)\\s+(\\w+)\\s+(.*)"); From 7f4de6b8b9e8e0a216555ad7293c9873cc6be8c6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 19:52:00 -0400 Subject: [PATCH 084/417] more use of QRegExp instead of QRegularExpression for QT version < 5.15 --- tools/lammps-gui/codeeditor.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 07cb63bc98..84026b9f7a 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -389,7 +389,11 @@ COMPLETER_INIT_FUNC(units, Units) void CodeEditor::setGroupList() { QStringList groups; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp groupcmd(QStringLiteral("^\\s*group\\s+(\\S+)(\\s+|$)")); +#else QRegularExpression groupcmd(QStringLiteral("^\\s*group\\s+(\\S+)(\\s+|$)")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); @@ -419,7 +423,11 @@ void CodeEditor::setVarNameList() vars << QString("v_%1").arg(buffer); } +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp varcmd(QStringLiteral("^\\s*variable\\s+(\\S+)(\\s+|$)")); +#else QRegularExpression varcmd(QStringLiteral("^\\s*variable\\s+(\\S+)(\\s+|$)")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); @@ -445,7 +453,11 @@ void CodeEditor::setVarNameList() void CodeEditor::setComputeIDList() { QStringList compid; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp compcmd(QStringLiteral("^\\s*compute\\s+(\\S+)\\s+")); +#else QRegularExpression compcmd(QStringLiteral("^\\s*compute\\s+(\\S+)\\s+")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); @@ -469,7 +481,11 @@ void CodeEditor::setComputeIDList() void CodeEditor::setFixIDList() { QStringList fixid; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QRegExp fixcmd(QStringLiteral("^\\s*fix\\s+(\\S+)\\s+")); +#else QRegularExpression fixcmd(QStringLiteral("^\\s*fix\\s+(\\S+)\\s+")); +#endif auto saved = textCursor(); // reposition cursor to beginning of text and search for group commands auto cursor = textCursor(); From 70a8aff56119324ad93e306337f96e72cc0623de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Sep 2023 20:45:02 -0400 Subject: [PATCH 085/417] update todo list --- tools/lammps-gui/TODO.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index e2ff9cb42f..8f752ac43a 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -1,15 +1,13 @@ LAMMPS-GUI TODO list: -# Short term goals +# Short term goals (v1.x) -- add "syntax check" with enabled "-skiprun" flag -- implement "static" completion for fix/compute/styles/region etc... -- implement "dynamic" completion for variable names, group names, molecule names, compute/dump/fix/region/group IDs - implement indenting regions for (nested) loops? -# Long term ideas +# Long term ideas (v2.x) - rewrite entire application to build the App and its layout manually -- port to Qt6 +- port to Qt6 (with compatibility to Qt5?) - also a rewrite should establish consistent naming conventions. now we have a mix of LAMMPS style, Qt style, and others. - add option to attach a debugger to the running program (highly non-portable, need customization support in preferences) - write a "wizard" dialog that can be used for beginners to create an input file template for a few typical use scenarios + (could perhaps use some LLM based KI to look up suggestions for answers?). From 7467a058ee0a2589e1cd282751490f8669dedf8f Mon Sep 17 00:00:00 2001 From: Nick Curtis Date: Mon, 18 Sep 2023 11:21:02 -0500 Subject: [PATCH 086/417] Apply fix for hipfft paths in ROCm >= 6.0 --- src/KOKKOS/fftdata_kokkos.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/fftdata_kokkos.h b/src/KOKKOS/fftdata_kokkos.h index 8f7bf7d234..a3812a1cf0 100644 --- a/src/KOKKOS/fftdata_kokkos.h +++ b/src/KOKKOS/fftdata_kokkos.h @@ -114,7 +114,7 @@ typedef cufftDoubleComplex FFT_DATA; #endif #elif defined(FFT_HIPFFT) - #include "hipfft.h" + #include #if defined(FFT_SINGLE) #define hipfftExec hipfftExecC2C #define HIPFFT_TYPE HIPFFT_C2C From e52eb81839336a980aa4bebda2270463e993efad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 18 Sep 2023 16:51:19 -0400 Subject: [PATCH 087/417] make use of std::swap() --- src/EXTRA-COMPUTE/compute_ackland_atom.cpp | 54 ++++++++----------- src/EXTRA-COMPUTE/compute_basal_atom.cpp | 54 ++++++++----------- src/EXTRA-COMPUTE/compute_hexorder_atom.cpp | 32 ++++++----- src/KSPACE/fix_tune_kspace.cpp | 9 ++-- src/compute_centro_atom.cpp | 52 ++++++++---------- src/compute_orientorder_atom.cpp | 59 +++++++-------------- 6 files changed, 105 insertions(+), 155 deletions(-) diff --git a/src/EXTRA-COMPUTE/compute_ackland_atom.cpp b/src/EXTRA-COMPUTE/compute_ackland_atom.cpp index fd7a5fb05c..dfa7cfae22 100644 --- a/src/EXTRA-COMPUTE/compute_ackland_atom.cpp +++ b/src/EXTRA-COMPUTE/compute_ackland_atom.cpp @@ -33,6 +33,7 @@ #include #include +#include using namespace LAMMPS_NS; @@ -346,35 +347,24 @@ void ComputeAcklandAtom::compute_peratom() 2nd routine sorts auxiliary array at same time ------------------------------------------------------------------------- */ -#define SWAP(a,b) tmp = a; (a) = b; (b) = tmp; -#define ISWAP(a,b) itmp = a; (a) = b; (b) = itmp; - void ComputeAcklandAtom::select(int k, int n, double *arr) { int i,ir,j,l,mid; - double a,tmp; + double a; arr--; l = 1; ir = n; while (true) { if (ir <= l+1) { - if (ir == l+1 && arr[ir] < arr[l]) { - SWAP(arr[l],arr[ir]) - } + if (ir == l+1 && arr[ir] < arr[l]) std::swap(arr[l],arr[ir]); return; } else { mid=(l+ir) >> 1; - SWAP(arr[mid],arr[l+1]) - if (arr[l] > arr[ir]) { - SWAP(arr[l],arr[ir]) - } - if (arr[l+1] > arr[ir]) { - SWAP(arr[l+1],arr[ir]) - } - if (arr[l] > arr[l+1]) { - SWAP(arr[l],arr[l+1]) - } + std::swap(arr[mid],arr[l+1]); + if (arr[l] > arr[ir]) std::swap(arr[l],arr[ir]); + if (arr[l+1] > arr[ir]) std::swap(arr[l+1],arr[ir]); + if (arr[l] > arr[l+1]) std::swap(arr[l],arr[l+1]); i = l+1; j = ir; a = arr[l+1]; @@ -382,7 +372,7 @@ void ComputeAcklandAtom::select(int k, int n, double *arr) do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i],arr[j]) + std::swap(arr[i],arr[j]); } arr[l+1] = arr[j]; arr[j] = a; @@ -396,8 +386,8 @@ void ComputeAcklandAtom::select(int k, int n, double *arr) void ComputeAcklandAtom::select2(int k, int n, double *arr, int *iarr) { - int i,ir,j,l,mid,ia,itmp; - double a,tmp; + int i,ir,j,l,mid,ia; + double a; arr--; iarr--; @@ -406,25 +396,25 @@ void ComputeAcklandAtom::select2(int k, int n, double *arr, int *iarr) while (true) { if (ir <= l+1) { if (ir == l+1 && arr[ir] < arr[l]) { - SWAP(arr[l],arr[ir]) - ISWAP(iarr[l],iarr[ir]) + std::swap(arr[l],arr[ir]); + std::swap(iarr[l],iarr[ir]); } return; } else { mid=(l+ir) >> 1; - SWAP(arr[mid],arr[l+1]) - ISWAP(iarr[mid],iarr[l+1]) + std::swap(arr[mid],arr[l+1]); + std::swap(iarr[mid],iarr[l+1]); if (arr[l] > arr[ir]) { - SWAP(arr[l],arr[ir]) - ISWAP(iarr[l],iarr[ir]) + std::swap(arr[l],arr[ir]); + std::swap(iarr[l],iarr[ir]); } if (arr[l+1] > arr[ir]) { - SWAP(arr[l+1],arr[ir]) - ISWAP(iarr[l+1],iarr[ir]) + std::swap(arr[l+1],arr[ir]); + std::swap(iarr[l+1],iarr[ir]); } if (arr[l] > arr[l+1]) { - SWAP(arr[l],arr[l+1]) - ISWAP(iarr[l],iarr[l+1]) + std::swap(arr[l],arr[l+1]); + std::swap(iarr[l],iarr[l+1]); } i = l+1; j = ir; @@ -434,8 +424,8 @@ void ComputeAcklandAtom::select2(int k, int n, double *arr, int *iarr) do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i],arr[j]) - ISWAP(iarr[i],iarr[j]) + std::swap(arr[i],arr[j]); + std::swap(iarr[i],iarr[j]); } arr[l+1] = arr[j]; arr[j] = a; diff --git a/src/EXTRA-COMPUTE/compute_basal_atom.cpp b/src/EXTRA-COMPUTE/compute_basal_atom.cpp index 8b65917111..e16cf9db45 100644 --- a/src/EXTRA-COMPUTE/compute_basal_atom.cpp +++ b/src/EXTRA-COMPUTE/compute_basal_atom.cpp @@ -31,6 +31,7 @@ #include "update.h" #include +#include using namespace LAMMPS_NS; @@ -431,35 +432,24 @@ void ComputeBasalAtom::compute_peratom() 2nd routine sorts auxiliary array at same time ------------------------------------------------------------------------- */ -#define SWAP(a,b) tmp = a; (a) = b; (b) = tmp; -#define ISWAP(a,b) itmp = a; (a) = b; (b) = itmp; - void ComputeBasalAtom::select(int k, int n, double *arr) { int i,ir,j,l,mid; - double a,tmp; + double a; arr--; l = 1; ir = n; while (true) { if (ir <= l+1) { - if (ir == l+1 && arr[ir] < arr[l]) { - SWAP(arr[l],arr[ir]) - } + if (ir == l+1 && arr[ir] < arr[l]) std::swap(arr[l],arr[ir]); return; } else { mid=(l+ir) >> 1; - SWAP(arr[mid],arr[l+1]) - if (arr[l] > arr[ir]) { - SWAP(arr[l],arr[ir]) - } - if (arr[l+1] > arr[ir]) { - SWAP(arr[l+1],arr[ir]) - } - if (arr[l] > arr[l+1]) { - SWAP(arr[l],arr[l+1]) - } + std::swap(arr[mid],arr[l+1]); + if (arr[l] > arr[ir]) std::swap(arr[l],arr[ir]); + if (arr[l+1] > arr[ir]) std::swap(arr[l+1],arr[ir]); + if (arr[l] > arr[l+1]) std::swap(arr[l],arr[l+1]); i = l+1; j = ir; a = arr[l+1]; @@ -467,7 +457,7 @@ void ComputeBasalAtom::select(int k, int n, double *arr) do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i],arr[j]) + std::swap(arr[i],arr[j]); } arr[l+1] = arr[j]; arr[j] = a; @@ -481,8 +471,8 @@ void ComputeBasalAtom::select(int k, int n, double *arr) void ComputeBasalAtom::select2(int k, int n, double *arr, int *iarr) { - int i,ir,j,l,mid,ia,itmp; - double a,tmp; + int i,ir,j,l,mid,ia; + double a; arr--; iarr--; @@ -491,25 +481,25 @@ void ComputeBasalAtom::select2(int k, int n, double *arr, int *iarr) while (true) { if (ir <= l+1) { if (ir == l+1 && arr[ir] < arr[l]) { - SWAP(arr[l],arr[ir]) - ISWAP(iarr[l],iarr[ir]) + std::swap(arr[l],arr[ir]); + std::swap(iarr[l],iarr[ir]); } return; } else { mid=(l+ir) >> 1; - SWAP(arr[mid],arr[l+1]) - ISWAP(iarr[mid],iarr[l+1]) + std::swap(arr[mid],arr[l+1]); + std::swap(iarr[mid],iarr[l+1]); if (arr[l] > arr[ir]) { - SWAP(arr[l],arr[ir]) - ISWAP(iarr[l],iarr[ir]) + std::swap(arr[l],arr[ir]); + std::swap(iarr[l],iarr[ir]); } if (arr[l+1] > arr[ir]) { - SWAP(arr[l+1],arr[ir]) - ISWAP(iarr[l+1],iarr[ir]) + std::swap(arr[l+1],arr[ir]); + std::swap(iarr[l+1],iarr[ir]); } if (arr[l] > arr[l+1]) { - SWAP(arr[l],arr[l+1]) - ISWAP(iarr[l],iarr[l+1]) + std::swap(arr[l],arr[l+1]); + std::swap(iarr[l],iarr[l+1]); } i = l+1; j = ir; @@ -519,8 +509,8 @@ void ComputeBasalAtom::select2(int k, int n, double *arr, int *iarr) do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i],arr[j]) - ISWAP(iarr[i],iarr[j]) + std::swap(arr[i],arr[j]); + std::swap(iarr[i],iarr[j]); } arr[l+1] = arr[j]; arr[j] = a; diff --git a/src/EXTRA-COMPUTE/compute_hexorder_atom.cpp b/src/EXTRA-COMPUTE/compute_hexorder_atom.cpp index dc04c6b650..11e65ea9c5 100644 --- a/src/EXTRA-COMPUTE/compute_hexorder_atom.cpp +++ b/src/EXTRA-COMPUTE/compute_hexorder_atom.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #ifdef DBL_EPSILON #define MY_EPSILON (10.0*DBL_EPSILON) @@ -267,15 +268,12 @@ inline void ComputeHexOrderAtom::calc_qn_trig(double delx, double dely, double & sort auxiliary array at same time ------------------------------------------------------------------------- */ -#define SWAP(a,b) tmp = a; (a) = b; (b) = tmp; -#define ISWAP(a,b) itmp = a; (a) = b; (b) = itmp; - /* ---------------------------------------------------------------------- */ void ComputeHexOrderAtom::select2(int k, int n, double *arr, int *iarr) { - int i,ir,j,l,mid,ia,itmp; - double a,tmp; + int i,ir,j,l,mid,ia; + double a; arr--; iarr--; @@ -284,25 +282,25 @@ void ComputeHexOrderAtom::select2(int k, int n, double *arr, int *iarr) while (true) { if (ir <= l+1) { if (ir == l+1 && arr[ir] < arr[l]) { - SWAP(arr[l],arr[ir]) - ISWAP(iarr[l],iarr[ir]) + std::swap(arr[l],arr[ir]); + std::swap(iarr[l],iarr[ir]); } return; } else { mid=(l+ir) >> 1; - SWAP(arr[mid],arr[l+1]) - ISWAP(iarr[mid],iarr[l+1]) + std::swap(arr[mid],arr[l+1]); + std::swap(iarr[mid],iarr[l+1]); if (arr[l] > arr[ir]) { - SWAP(arr[l],arr[ir]) - ISWAP(iarr[l],iarr[ir]) + std::swap(arr[l],arr[ir]); + std::swap(iarr[l],iarr[ir]); } if (arr[l+1] > arr[ir]) { - SWAP(arr[l+1],arr[ir]) - ISWAP(iarr[l+1],iarr[ir]) + std::swap(arr[l+1],arr[ir]); + std::swap(iarr[l+1],iarr[ir]); } if (arr[l] > arr[l+1]) { - SWAP(arr[l],arr[l+1]) - ISWAP(iarr[l],iarr[l+1]) + std::swap(arr[l],arr[l+1]); + std::swap(iarr[l],iarr[l+1]); } i = l+1; j = ir; @@ -312,8 +310,8 @@ void ComputeHexOrderAtom::select2(int k, int n, double *arr, int *iarr) do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i],arr[j]) - ISWAP(iarr[i],iarr[j]) + std::swap(arr[i],arr[j]); + std::swap(iarr[i],iarr[j]); } arr[l+1] = arr[j]; arr[j] = a; diff --git a/src/KSPACE/fix_tune_kspace.cpp b/src/KSPACE/fix_tune_kspace.cpp index 7b68deeeb9..6a9510acfd 100644 --- a/src/KSPACE/fix_tune_kspace.cpp +++ b/src/KSPACE/fix_tune_kspace.cpp @@ -33,8 +33,8 @@ #include #include #include +#include -#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;} #define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) static constexpr double GOLD = 1.618034; @@ -302,8 +302,7 @@ void FixTuneKspace::adjust_rcut(double time) if (utils::strmatch(force->kspace_style,"^msm")) return; if (converged) return; - double temp; - const double TINY = 1.0e-20; + constexpr double TINY = 1.0e-20; // get the current cutoff int itmp; @@ -328,8 +327,8 @@ void FixTuneKspace::adjust_rcut(double time) bx_brent = current_cutoff; fb_brent = time; if (fb_brent > fa_brent) { - SWAP(ax_brent,bx_brent); - SWAP(fb_brent,fa_brent); + std::swap(ax_brent,bx_brent); + std::swap(fb_brent,fa_brent); pair_cut_coul /= 4; } else { pair_cut_coul *= 2; diff --git a/src/compute_centro_atom.cpp b/src/compute_centro_atom.cpp index 10d2a79c45..dfd38d7368 100644 --- a/src/compute_centro_atom.cpp +++ b/src/compute_centro_atom.cpp @@ -30,6 +30,7 @@ #include "update.h" #include +#include using namespace LAMMPS_NS; @@ -319,33 +320,24 @@ void ComputeCentroAtom::compute_peratom() 2nd routine sorts auxiliary array at same time ------------------------------------------------------------------------- */ -#define SWAP(a, b) \ - tmp = a; \ - (a) = b; \ - (b) = tmp; -#define ISWAP(a, b) \ - itmp = a; \ - (a) = b; \ - (b) = itmp; - void ComputeCentroAtom::select(int k, int n, double *arr) { int i, ir, j, l, mid; - double a, tmp; + double a; arr--; l = 1; ir = n; while (true) { if (ir <= l + 1) { - if (ir == l + 1 && arr[ir] < arr[l]) { SWAP(arr[l], arr[ir]) } + if (ir == l + 1 && arr[ir] < arr[l]) std::swap(arr[l], arr[ir]); return; } else { mid = (l + ir) >> 1; - SWAP(arr[mid], arr[l + 1]) - if (arr[l] > arr[ir]) { SWAP(arr[l], arr[ir]) } - if (arr[l + 1] > arr[ir]) { SWAP(arr[l + 1], arr[ir]) } - if (arr[l] > arr[l + 1]) { SWAP(arr[l], arr[l + 1]) } + std::swap(arr[mid], arr[l + 1]); + if (arr[l] > arr[ir]) std::swap(arr[l], arr[ir]); + if (arr[l + 1] > arr[ir]) std::swap(arr[l + 1], arr[ir]); + if (arr[l] > arr[l + 1]) std::swap(arr[l], arr[l + 1]); i = l + 1; j = ir; a = arr[l + 1]; @@ -355,7 +347,7 @@ void ComputeCentroAtom::select(int k, int n, double *arr) do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i], arr[j]) + std::swap(arr[i], arr[j]); } arr[l + 1] = arr[j]; arr[j] = a; @@ -369,8 +361,8 @@ void ComputeCentroAtom::select(int k, int n, double *arr) void ComputeCentroAtom::select2(int k, int n, double *arr, int *iarr) { - int i, ir, j, l, mid, ia, itmp; - double a, tmp; + int i, ir, j, l, mid, ia; + double a; arr--; iarr--; @@ -379,25 +371,25 @@ void ComputeCentroAtom::select2(int k, int n, double *arr, int *iarr) while (true) { if (ir <= l + 1) { if (ir == l + 1 && arr[ir] < arr[l]) { - SWAP(arr[l], arr[ir]) - ISWAP(iarr[l], iarr[ir]) + std::swap(arr[l], arr[ir]); + std::swap(iarr[l], iarr[ir]); } return; } else { mid = (l + ir) >> 1; - SWAP(arr[mid], arr[l + 1]) - ISWAP(iarr[mid], iarr[l + 1]) + std::swap(arr[mid], arr[l + 1]); + std::swap(iarr[mid], iarr[l + 1]); if (arr[l] > arr[ir]) { - SWAP(arr[l], arr[ir]) - ISWAP(iarr[l], iarr[ir]) + std::swap(arr[l], arr[ir]); + std::swap(iarr[l], iarr[ir]); } if (arr[l + 1] > arr[ir]) { - SWAP(arr[l + 1], arr[ir]) - ISWAP(iarr[l + 1], iarr[ir]) + std::swap(arr[l + 1], arr[ir]); + std::swap(iarr[l + 1], iarr[ir]); } if (arr[l] > arr[l + 1]) { - SWAP(arr[l], arr[l + 1]) - ISWAP(iarr[l], iarr[l + 1]) + std::swap(arr[l], arr[l + 1]); + std::swap(iarr[l], iarr[l + 1]); } i = l + 1; j = ir; @@ -409,8 +401,8 @@ void ComputeCentroAtom::select2(int k, int n, double *arr, int *iarr) do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i], arr[j]) - ISWAP(iarr[i], iarr[j]) + std::swap(arr[i], arr[j]); + std::swap(iarr[i], iarr[j]); } arr[l + 1] = arr[j]; arr[j] = a; diff --git a/src/compute_orientorder_atom.cpp b/src/compute_orientorder_atom.cpp index 6f1b2b4036..f6c0589a33 100644 --- a/src/compute_orientorder_atom.cpp +++ b/src/compute_orientorder_atom.cpp @@ -36,6 +36,7 @@ #include #include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -331,39 +332,19 @@ double ComputeOrientOrderAtom::memory_usage() // Use no-op do while to create single statement -#define SWAP(a, b) \ - do { \ - tmp = a; \ - (a) = b; \ - (b) = tmp; \ - } while (0) - -#define ISWAP(a, b) \ - do { \ - itmp = a; \ - (a) = b; \ - (b) = itmp; \ - } while (0) - -#define SWAP3(a, b) \ - do { \ - tmp = (a)[0]; \ - (a)[0] = (b)[0]; \ - (b)[0] = tmp; \ - tmp = (a)[1]; \ - (a)[1] = (b)[1]; \ - (b)[1] = tmp; \ - tmp = (a)[2]; \ - (a)[2] = (b)[2]; \ - (b)[2] = tmp; \ +#define SWAP3(a, b) \ + do { \ + std::swap((a)[0], (b)[0]); \ + std::swap((a)[1], (b)[1]); \ + std::swap((a)[2], (b)[2]); \ } while (0) /* ---------------------------------------------------------------------- */ void ComputeOrientOrderAtom::select3(int k, int n, double *arr, int *iarr, double **arr3) { - int i, ir, j, l, mid, ia, itmp; - double a, tmp, a3[3]; + int i, ir, j, l, mid, ia; + double a, a3[3]; arr--; iarr--; @@ -373,29 +354,29 @@ void ComputeOrientOrderAtom::select3(int k, int n, double *arr, int *iarr, doubl while (true) { if (ir <= l + 1) { if (ir == l + 1 && arr[ir] < arr[l]) { - SWAP(arr[l], arr[ir]); - ISWAP(iarr[l], iarr[ir]); + std::swap(arr[l], arr[ir]); + std::swap(iarr[l], iarr[ir]); SWAP3(arr3[l], arr3[ir]); } return; } else { mid = (l + ir) >> 1; - SWAP(arr[mid], arr[l + 1]); - ISWAP(iarr[mid], iarr[l + 1]); + std::swap(arr[mid], arr[l + 1]); + std::swap(iarr[mid], iarr[l + 1]); SWAP3(arr3[mid], arr3[l + 1]); if (arr[l] > arr[ir]) { - SWAP(arr[l], arr[ir]); - ISWAP(iarr[l], iarr[ir]); + std::swap(arr[l], arr[ir]); + std::swap(iarr[l], iarr[ir]); SWAP3(arr3[l], arr3[ir]); } if (arr[l + 1] > arr[ir]) { - SWAP(arr[l + 1], arr[ir]); - ISWAP(iarr[l + 1], iarr[ir]); + std::swap(arr[l + 1], arr[ir]); + std::swap(iarr[l + 1], iarr[ir]); SWAP3(arr3[l + 1], arr3[ir]); } if (arr[l] > arr[l + 1]) { - SWAP(arr[l], arr[l + 1]); - ISWAP(iarr[l], iarr[l + 1]); + std::swap(arr[l], arr[l + 1]); + std::swap(iarr[l], iarr[l + 1]); SWAP3(arr3[l], arr3[l + 1]); } i = l + 1; @@ -411,8 +392,8 @@ void ComputeOrientOrderAtom::select3(int k, int n, double *arr, int *iarr, doubl do j--; while (arr[j] > a); if (j < i) break; - SWAP(arr[i], arr[j]); - ISWAP(iarr[i], iarr[j]); + std::swap(arr[i], arr[j]); + std::swap(iarr[i], iarr[j]); SWAP3(arr3[i], arr3[j]); } arr[l + 1] = arr[j]; From 934055601b43b0a9f174d74cdd02c817f47846cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 18 Sep 2023 18:03:27 -0400 Subject: [PATCH 088/417] change insertion function to always replace partial word with completion Also change popup mode to always display all possible completions and only highlight the current selection. This seems more beginner friendly. --- tools/lammps-gui/codeeditor.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 84026b9f7a..01e71d087c 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -138,7 +138,7 @@ CodeEditor::CodeEditor(QWidget *parent) : // set up completer class (without a model currently) #define COMPLETER_SETUP(completer) \ - completer->setCompletionMode(QCompleter::PopupCompletion); \ + completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); \ completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); \ completer->setWidget(this); \ completer->setMaxVisibleItems(16); \ @@ -940,10 +940,8 @@ void CodeEditor::insertCompletedCommand(const QString &completion) auto *completer = qobject_cast(sender()); if (completer->widget() != this) return; auto cursor = textCursor(); - int extra = completion.length() - completer->completionPrefix().length(); - cursor.movePosition(QTextCursor::Left); - cursor.movePosition(QTextCursor::EndOfWord); - cursor.insertText(completion.right(extra)); + cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); + cursor.insertText(completion); setTextCursor(cursor); } From d371550f5fbaade20abbd2482cf2efc3e14bd262 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 18 Sep 2023 19:19:37 -0400 Subject: [PATCH 089/417] step lammps-gui version patch number --- tools/lammps-gui/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 8c59ec7dc2..50eaee4d85 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.4 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.5 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) From c3cc4974d12876862e57d32e990adf97a9e07679 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 07:33:03 -0400 Subject: [PATCH 090/417] silence uninitialized access valgrind warning --- lib/colvars/colvar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 700d3752ac..0cb5c1ebdb 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -30,6 +30,7 @@ colvar::colvar() after_restart = false; kinetic_energy = 0.0; potential_energy = 0.0; + period = 0.0; #ifdef LEPTON dev_null = 0.0; From a46399564614f9c2d8184a1a658475efe489a644 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:09:04 -0400 Subject: [PATCH 091/417] add dependencies for building dmg bundle --- tools/lammps-gui/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 50eaee4d85..305e9872d2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -165,7 +165,7 @@ if(APPLE) COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAMMPS_DIR}/doc/lammps.1 ${APP_CONTENTS}/share/lammps/man/man1/ COMMAND ${CMAKE_COMMAND} -E create_symlink lammps.1 ${APP_CONTENTS}/share/lammps/man/man1/lmp.1 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAMMPS_DIR}/doc/msi2lmp.1 ${APP_CONTENTS}/share/lammps/man/man1 - DEPENDS lammps-gui lammps + DEPENDS lammps-gui lammps lmp binary2txt stl_bin2txt msi2lmp phana COMMENT "Copying additional files into macOS app bundle tree" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) From 57b3b74bcddf356fd9e8e301cd60d25801fe8f0d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:09:26 -0400 Subject: [PATCH 092/417] link gui to jpeg and png libs --- tools/lammps-gui/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 305e9872d2..47406fd4cb 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -132,6 +132,12 @@ if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) endif() +if(WITH_JPEG) + target_link_libraries(lammps-gui PRIVATE JPEG::JPEG) +endif() +if(WITH_PNG) + target_link_libraries(lammps-gui PRIVATE PNG::PNG ZLIB::ZLIB) +endif() # when compiling on macOS, create an "app bundle" if(APPLE) From a9f15f6a297a724ebb1cb5734cdf7de8ea710467 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:09:57 -0400 Subject: [PATCH 093/417] update preset --- cmake/presets/macos-multiarch.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/presets/macos-multiarch.cmake b/cmake/presets/macos-multiarch.cmake index 58ef013f68..8ceaec11f8 100644 --- a/cmake/presets/macos-multiarch.cmake +++ b/cmake/presets/macos-multiarch.cmake @@ -10,5 +10,3 @@ set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) set(BUILD_MPI FALSE CACHE BOOL "" FORCE) -set(BUILD_SHARED_LIBS FALSE CACHE BOOL "" FORCE) -set(LAMMPS_EXCEPTIONS TRUE CACHE BOOL "" FORCE) From 70d6518eace704c49113cdda5194c691cbe044c3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:10:36 -0400 Subject: [PATCH 094/417] minor updates for using presets. mention macos multi-arch preset --- doc/src/Build_cmake.rst | 14 +++++++------- doc/src/Build_extras.rst | 7 ++++--- doc/src/Build_package.rst | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/doc/src/Build_cmake.rst b/doc/src/Build_cmake.rst index 6c46f6d672..e622f9f208 100644 --- a/doc/src/Build_cmake.rst +++ b/doc/src/Build_cmake.rst @@ -177,13 +177,13 @@ configuration is selected with the *-C* flag: ctest -C Debug -The CMake scripts in LAMMPS have basic support for being compiled using a -multi-config build system, but not all of it has been ported. This is in -particular applicable to compiling packages that require additional libraries -that would be downloaded and compiled by CMake. The "windows" preset file -tries to keep track of which packages can be compiled natively with the -MSVC compilers out-of-the box. Not all of those external libraries are -portable to Windows, either. +The CMake scripts in LAMMPS have basic support for being compiled using +a multi-config build system, but not all of it has been ported. This is +in particular applicable to compiling packages that require additional +libraries that would be downloaded and compiled by CMake. The +``windows.cmake`` preset file tries to keep track of which packages can +be compiled natively with the MSVC compilers out-of-the box. Not all of +the external libraries are portable to Windows, either. Installing CMake diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 117af4b3a3..393d7e1c20 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -722,9 +722,10 @@ This list was last updated for version 4.0.1 of the Kokkos library. ``cmake/presets`` folder, ``kokkos-serial.cmake``, ``kokkos-openmp.cmake``, ``kokkos-cuda.cmake``, ``kokkos-hip.cmake``, and ``kokkos-sycl.cmake``. They will enable - the KOKKOS package and enable some hardware choice. So to compile - with CUDA device parallelization (for GPUs with CC 5.0 and up) - with some common packages enabled, you can do the following: + the KOKKOS package and enable some hardware choices. For GPU + support those preset files must be customized to match the + hardware used. So to compile with CUDA device parallelization with + some common packages enabled, you can do the following: .. code-block:: bash diff --git a/doc/src/Build_package.rst b/doc/src/Build_package.rst index bc6445f813..63ccac534d 100644 --- a/doc/src/Build_package.rst +++ b/doc/src/Build_package.rst @@ -182,6 +182,7 @@ make a copy of one of them and modify it to suit 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 mingw64-cmake -C ../cmake/presets/mingw-cross.cmake [OPTIONS] ../cmake # compile with MinGW cross-compilers + cmake -C ../cmake/presets/macos-multiarch.cmake [OPTIONS] ../cmake # compile serial multi-arch binaries on macOS Presets that have names starting with "windows" are specifically for compiling LAMMPS :doc:`natively on Windows ` and From 8b40e16ebd86e9a8d3aa1488371075b1391218a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:16:54 -0400 Subject: [PATCH 095/417] Revert "link gui to jpeg and png libs" This reverts commit 57b3b74bcddf356fd9e8e301cd60d25801fe8f0d. --- tools/lammps-gui/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 47406fd4cb..305e9872d2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -132,12 +132,6 @@ if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) endif() -if(WITH_JPEG) - target_link_libraries(lammps-gui PRIVATE JPEG::JPEG) -endif() -if(WITH_PNG) - target_link_libraries(lammps-gui PRIVATE PNG::PNG ZLIB::ZLIB) -endif() # when compiling on macOS, create an "app bundle" if(APPLE) From 6f79918babb9dddb47ee5639725fc4555372fe38 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Sep 2023 19:43:53 -0400 Subject: [PATCH 096/417] copy FFMpeg binary into app bundle --- tools/lammps-gui/CMakeLists.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 305e9872d2..504b5c6f60 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -169,9 +169,17 @@ if(APPLE) COMMENT "Copying additional files into macOS app bundle tree" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) + if(FFMPEG_EXECUTABLE) + add_custom_target(copy-ffmpeg + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FFMPEG_EXECUTABLE} ${APP_CONTENTS}/bin/ + COMMENT "Copying FFMpeg into macOS app bundle tree" + DEPENDS complete-bundle + ) + set(FFMPEG_TARGET copy-ffmpeg) + endif() add_custom_target(dmg COMMAND ${LAMMPS_DIR}/cmake/packaging/build_macos_dmg.sh - DEPENDS complete-bundle + DEPENDS complete-bundle ${FFMPEG_TARGET} COMMENT "Create Drag-n-Drop installer disk image from app bundle" BYPRODUCT LAMMPS-macOS-multiarch.dmg WORKING_DIRECTORY ${CMAKE_BINARY_DIR} From fb55fc3277e43e15cd22c7e26c46e0e82686ba01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Sep 2023 07:51:07 -0400 Subject: [PATCH 097/417] we don't need a lattice for creating atoms from a STL mesh --- src/create_atoms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 32be85e647..0734939eaa 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -358,7 +358,7 @@ void CreateAtoms::command(int narg, char **arg) // lattice to box, but not consistent with other uses of units=lattice // triclinic remapping occurs in add_single() - if ((style == BOX) || (style == REGION) || (style == MESH)) { + if ((style == BOX) || (style == REGION)) { if (nbasis == 0) error->all(FLERR, "Cannot create atoms with undefined lattice"); } else if (scaleflag == 1) { xone[0] *= domain->lattice->xlattice; From 12acd346b78e2c8c120aa5f00b65561ba4b79905 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Sep 2023 07:51:16 -0400 Subject: [PATCH 098/417] plug memory leak --- src/create_atoms.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 0734939eaa..cdd290772e 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -1153,6 +1153,7 @@ void CreateAtoms::add_mesh(const char *filename) utils::logmesg(lmp, " read {} triangles with {:.2f} atoms per triangle added in {} mode\n", ntriangle, ratio, mesh_name[mesh_style]); } + if (fp) fclose(fp); } /* ---------------------------------------------------------------------- From afa8501d20c56b9e9466c155423d59b78baabcc4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Sep 2023 07:51:58 -0400 Subject: [PATCH 099/417] recognize STL files starting with "solid binary" as binary files --- src/create_atoms.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index cdd290772e..75c30bd0b8 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -1055,6 +1055,9 @@ void CreateAtoms::add_mesh(const char *filename) throw TokenizerException("Invalid STL mesh file format", ""); line += 6; + if (utils::strmatch(line, "^binary")) + throw TokenizerException("Invalid STL mesh file format", ""); + if (comm->me == 0) utils::logmesg(lmp, "Reading STL object {} from text file {}\n", utils::trim(line), filename); From c50dcf61298596dfa0f0fa703e1725add6fd6217 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 12:53:14 -0400 Subject: [PATCH 100/417] move helper functions to separate file. add overloads to mystrdup() --- tools/lammps-gui/CMakeLists.txt | 3 +- tools/lammps-gui/helpers.cpp | 71 ++++++++++++++++++++++++++++++++ tools/lammps-gui/helpers.h | 31 ++++++++++++++ tools/lammps-gui/lammpsgui.cpp | 47 +++------------------ tools/lammps-gui/preferences.cpp | 17 +++----- 5 files changed, 115 insertions(+), 54 deletions(-) create mode 100644 tools/lammps-gui/helpers.cpp create mode 100644 tools/lammps-gui/helpers.h diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 504b5c6f60..f6d532f891 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.5 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.6 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) @@ -84,6 +84,7 @@ set(PROJECT_SOURCES chartviewer.h codeeditor.cpp codeeditor.h + helpers.cpp highlighter.cpp highlighter.h imageviewer.cpp diff --git a/tools/lammps-gui/helpers.cpp b/tools/lammps-gui/helpers.cpp new file mode 100644 index 0000000000..8db7cd0d68 --- /dev/null +++ b/tools/lammps-gui/helpers.cpp @@ -0,0 +1,71 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "helpers.h" + +#include +#include +#include +#include + +// duplicate string, STL version +char *mystrdup(const std::string &text) +{ + auto tmp = new char[text.size() + 1]; + memcpy(tmp, text.c_str(), text.size() + 1); + return tmp; +} + +// duplicate string, pointer version +char *mystrdup(const char *text) +{ + return mystrdup(std::string(text)); +} + +// duplicate string, Qt version +char *mystrdup(const QString &text) +{ + return mystrdup(text.toStdString()); +} + +// find if executable is in path +// https://stackoverflow.com/a/51041497 + +bool has_exe(const QString &exe) +{ + QProcess findProcess; + QStringList arguments; + arguments << exe; +#if defined(_WIN32) + findProcess.start("where", arguments); +#else + findProcess.start("which", arguments); +#endif + findProcess.setReadChannel(QProcess::ProcessChannel::StandardOutput); + + if (!findProcess.waitForFinished()) return false; // Not found or which does not work + + QString retStr(findProcess.readAll()); + retStr = retStr.trimmed(); + + QFile file(retStr); + QFileInfo check_file(file); + if (check_file.exists() && check_file.isFile()) + return true; // Found! + else + return false; // Not found! +} + +// Local Variables: +// c-basic-offset: 4 +// End: diff --git a/tools/lammps-gui/helpers.h b/tools/lammps-gui/helpers.h new file mode 100644 index 0000000000..a88233b0f3 --- /dev/null +++ b/tools/lammps-gui/helpers.h @@ -0,0 +1,31 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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. +------------------------------------------------------------------------- */ + +#ifndef HELPERS_H +#define HELPERS_H + +#include +#include + +// duplicate string +extern char *mystrdup(const std::string &text); +extern char *mystrdup(const char *text); +extern char *mystrdup(const QString &text); + +// find if executable is in path +extern bool has_exe(const QString &exe); + +#endif +// Local Variables: +// c-basic-offset: 4 +// End: diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 7fff307ed3..16e9f50e87 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -14,6 +14,7 @@ #include "lammpsgui.h" #include "chartviewer.h" +#include "helpers.h" #include "highlighter.h" #include "imageviewer.h" #include "lammpsrunner.h" @@ -59,42 +60,6 @@ static const QString blank(" "); static constexpr int MAXRECENT = 5; static constexpr int BUFLEN = 128; -// duplicate string -static char *mystrdup(const std::string &text) -{ - auto tmp = new char[text.size() + 1]; - memcpy(tmp, text.c_str(), text.size() + 1); - return tmp; -} - -// find if executable is in path -// https://stackoverflow.com/a/51041497 - -static bool has_exe(const QString &exe) -{ - QProcess findProcess; - QStringList arguments; - arguments << exe; -#if defined(_WIN32) - findProcess.start("where", arguments); -#else - findProcess.start("which", arguments); -#endif - findProcess.setReadChannel(QProcess::ProcessChannel::StandardOutput); - - if (!findProcess.waitForFinished()) return false; // Not found or which does not work - - QString retStr(findProcess.readAll()); - retStr = retStr.trimmed(); - - QFile file(retStr); - QFileInfo check_file(file); - if (check_file.exists() && check_file.isFile()) - return true; // Found! - else - return false; // Not found! -} - LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), status(nullptr), logwindow(nullptr), imagewindow(nullptr), chartwindow(nullptr), @@ -1025,11 +990,11 @@ void LammpsGui::do_run(bool use_buffer) runner = new LammpsRunner(this); is_running = true; if (use_buffer) { - // always add final newline since the text edit widget does not - char *input = mystrdup(ui->textEdit->toPlainText().toStdString() + "\n"); + // always add final newline since the text edit widget does not do it + char *input = mystrdup(ui->textEdit->toPlainText() + "\n"); runner->setup_run(&lammps, input, nullptr); } else { - char *fname = mystrdup(current_file.toStdString()); + char *fname = mystrdup(current_file); runner->setup_run(&lammps, nullptr, fname); } @@ -1418,9 +1383,9 @@ void LammpsGui::start_lammps() QString value = var.second; if (!name.isEmpty() && !value.isEmpty()) { lammps_args.push_back(mystrdup("-var")); - lammps_args.push_back(mystrdup(name.toStdString())); + lammps_args.push_back(mystrdup(name)); for (const auto &v : value.split(' ')) - lammps_args.push_back(mystrdup(v.toStdString())); + lammps_args.push_back(mystrdup(v)); } } diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index c4711dac30..b6224d452e 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -13,6 +13,7 @@ #include "preferences.h" +#include "helpers.h" #include "lammpsgui.h" #include "lammpswrapper.h" #include "ui_lammpsgui.h" @@ -55,14 +56,6 @@ #include #endif -// duplicate string -static char *mystrdup(const std::string &text) -{ - auto tmp = new char[text.size() + 1]; - memcpy(tmp, text.c_str(), text.size() + 1); - return tmp; -} - Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) : QDialog(parent), tabWidget(new QTabWidget), buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)), @@ -176,8 +169,8 @@ void Preferences::accept() "LAMMPS-GUI must be relaunched."), QMessageBox::Ok); msg.exec(); - const char *path = mystrdup(QCoreApplication::applicationFilePath().toStdString()); - const char *arg0 = mystrdup(QCoreApplication::arguments().at(0).toStdString()); + const char *path = mystrdup(QCoreApplication::applicationFilePath()); + const char *arg0 = mystrdup(QCoreApplication::arguments().at(0)); execl(path, arg0, (char *)NULL); } @@ -258,8 +251,8 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa connect(gettextfont, &QPushButton::released, this, &GeneralTab::newtextfont); auto *freqlayout = new QHBoxLayout; - auto *freqlabel = new QLabel("GUI update interval (ms)"); - auto *freqval = new QSpinBox; + auto *freqlabel = new QLabel("GUI update interval (ms)"); + auto *freqval = new QSpinBox; freqval->setRange(1, 1000); freqval->setStepType(QAbstractSpinBox::AdaptiveDecimalStepType); freqval->setValue(settings->value("updfreq", "100").toInt()); From 5588c121f4d619a46b5062375dcb6323ea6ca5f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 15:09:14 -0400 Subject: [PATCH 101/417] add support to export slide show animation to movie file via ffmpeg --- doc/src/Howto_lammps_gui.rst | 12 ++++--- tools/lammps-gui/export-movie.png | Bin 0 -> 5162 bytes tools/lammps-gui/lammpsgui.cpp | 1 + tools/lammps-gui/lammpsgui.qrc | 1 + tools/lammps-gui/slideshow.cpp | 52 ++++++++++++++++++++++++++++++ tools/lammps-gui/slideshow.h | 1 + 6 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 tools/lammps-gui/export-movie.png diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index ee190b540e..fb0c0e80d4 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -225,11 +225,13 @@ displays the images created by LAMMPS as they are written. :align: center :scale: 50% -The various buttons at the bottom right of the window allow either -single stepping through the sequence of images or playing an animation -(as a continuous loop or once from first to last). It is also possible -to zoom in or zoom out of the displayed images. The slide show window -will be closed when a new file is loaded. +The various buttons at the bottom right of the window allow single +stepping through the sequence of images or playing an animation (as a +continuous loop or once from first to last). It is also possible to +zoom in or zoom out of the displayed images, and to export the slide +show animation to a movie file, if `ffmpeg `_ is +installed. The slide show window will be closed when a new file is +loaded. Variable Info ------------- diff --git a/tools/lammps-gui/export-movie.png b/tools/lammps-gui/export-movie.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ab58b0b50830647a9fefadb6878babe9fe1853 GIT binary patch literal 5162 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 YRPz7s!_knxPuvGE(7C6Lzw3xqW}N^ literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 16e9f50e87..599b9d5097 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -858,6 +858,7 @@ void LammpsGui::logupdate() slideshow->hide(); } else { slideshow->setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + current_file); + if (QSettings().value("viewslide", true).toBool()) slideshow->show(); } slideshow->add_image(imagefile); } diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index bb23d559ee..0baca37aac 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -24,6 +24,7 @@ edit-undo.png emblem-photos.png expand-text.png + export-movie.png format-indent-less-3.png go-first.png go-last.png diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index a42a67f8a2..e92bfdc2d5 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -13,7 +13,11 @@ #include "slideshow.h" +#include "helpers.h" + #include +#include +#include #include #include #include @@ -21,11 +25,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -58,6 +64,10 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : auto *dummy = new QPushButton(QIcon(), ""); dummy->hide(); + auto *tomovie = new QPushButton(QIcon(":/export-movie.png"), ""); + tomovie->setToolTip("Export to movie file"); + tomovie->setEnabled(has_exe("ffmpeg")); + auto *gofirst = new QPushButton(QIcon(":/go-first.png"), ""); gofirst->setToolTip("Go to first Image"); auto *goprev = new QPushButton(QIcon(":/go-previous-2.png"), ""); @@ -83,6 +93,7 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : auto *normal = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); normal->setToolTip("Reset zoom to normal"); + connect(tomovie, &QPushButton::released, this, &SlideShow::movie); connect(gofirst, &QPushButton::released, this, &SlideShow::first); connect(goprev, &QPushButton::released, this, &SlideShow::prev); connect(goplay, &QPushButton::released, this, &SlideShow::play); @@ -96,6 +107,7 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : navLayout->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum)); navLayout->addWidget(dummy); + navLayout->addWidget(tomovie); navLayout->addWidget(gofirst); navLayout->addWidget(goprev); navLayout->addWidget(goplay); @@ -178,6 +190,46 @@ void SlideShow::loadImage(int idx) } while (idx >= 0); } +void SlideShow::movie() +{ + QString fileName = QFileDialog::getSaveFileName(this, "Export to Movie File", ".", + "Movie Files (*.mpg *.mp4 *.mkv *.avi *.mpeg)"); + if (fileName.isEmpty()) return; + + QDir curdir("."); + QTemporaryFile concatfile; + concatfile.open(); + for (auto image : imagefiles) { + concatfile.write("file '"); + concatfile.write(curdir.absoluteFilePath(image).toLocal8Bit()); + concatfile.write("'\n"); + } + concatfile.close(); + + QStringList args; + args << "-y"; + args << "-safe" + << "0"; + args << "-r" + << "10"; + args << "-f" + << "concat"; + args << "-i" << concatfile.fileName(); + if (scaleFactor != 1.0) { + args << "-vf" << QString("scale=iw*%1:-1").arg(scaleFactor); + } + args << "-b:v" + << "2000k"; + args << "-r" + << "24"; + args << fileName; + + auto *ffmpeg = new QProcess(this); + ffmpeg->start("ffmpeg", args); + ffmpeg->waitForFinished(-1); + delete ffmpeg; +} + void SlideShow::first() { current = 0; diff --git a/tools/lammps-gui/slideshow.h b/tools/lammps-gui/slideshow.h index fe357ec564..176bb9f030 100644 --- a/tools/lammps-gui/slideshow.h +++ b/tools/lammps-gui/slideshow.h @@ -32,6 +32,7 @@ public: void clear(); private slots: + void movie(); void first(); void last(); void next(); From 934269e4564a7a956b70a4a92a42c09f27c96225 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 15:55:14 -0400 Subject: [PATCH 102/417] move all icon files to the icons folder --- tools/lammps-gui/chartviewer.cpp | 8 +- tools/lammps-gui/codeeditor.cpp | 10 +- tools/lammps-gui/{ => icons}/antialias.png | Bin .../{ => icons}/application-calc.png | Bin .../{ => icons}/application-exit.png | Bin .../{ => icons}/application-plot.png | Bin tools/lammps-gui/{ => icons}/axes-img.png | Bin tools/lammps-gui/{ => icons}/document-new.png | Bin .../{ => icons}/document-open-recent.png | Bin .../lammps-gui/{ => icons}/document-open.png | Bin .../{ => icons}/document-revert.png | Bin .../{ => icons}/document-save-as.png | Bin .../lammps-gui/{ => icons}/document-save.png | Bin tools/lammps-gui/{ => icons}/edit-copy.png | Bin tools/lammps-gui/{ => icons}/edit-cut.png | Bin tools/lammps-gui/{ => icons}/edit-delete.png | Bin tools/lammps-gui/{ => icons}/edit-paste.png | Bin tools/lammps-gui/{ => icons}/edit-redo.png | Bin tools/lammps-gui/{ => icons}/edit-undo.png | Bin .../lammps-gui/{ => icons}/emblem-photos.png | Bin tools/lammps-gui/{ => icons}/expand-text.png | Bin tools/lammps-gui/{ => icons}/export-movie.png | Bin .../{ => icons}/format-indent-less-3.png | Bin tools/lammps-gui/{ => icons}/go-first.png | Bin tools/lammps-gui/{ => icons}/go-last.png | Bin tools/lammps-gui/{ => icons}/go-next-2.png | Bin .../lammps-gui/{ => icons}/go-previous-2.png | Bin tools/lammps-gui/{ => icons}/gtk-go-down.png | Bin tools/lammps-gui/{ => icons}/gtk-go-up.png | Bin tools/lammps-gui/{ => icons}/gtk-zoom-fit.png | Bin tools/lammps-gui/{ => icons}/gtk-zoom-in.png | Bin tools/lammps-gui/{ => icons}/gtk-zoom-out.png | Bin tools/lammps-gui/{ => icons}/hd-img.png | Bin tools/lammps-gui/{ => icons}/help-about.png | Bin tools/lammps-gui/{ => icons}/help-browser.png | Bin tools/lammps-gui/{ => icons}/help-faq.png | Bin .../{ => icons}/image-x-generic.png | Bin .../{ => icons}/lammps-icon-128x128.png | Bin .../{ => icons}/media-playback-start-2.png | Bin .../{ => icons}/media-playlist-repeat.png | Bin .../{ => icons}/object-rotate-left.png | Bin .../{ => icons}/object-rotate-right.png | Bin tools/lammps-gui/{ => icons}/ovito.png | Bin .../{ => icons}/preferences-desktop-font.png | Bin .../preferences-desktop-personal.png | Bin .../{ => icons}/preferences-desktop.png | Bin tools/lammps-gui/{ => icons}/process-stop.png | Bin tools/lammps-gui/{ => icons}/run-file.png | Bin tools/lammps-gui/{ => icons}/system-box.png | Bin tools/lammps-gui/{ => icons}/system-help.png | Bin tools/lammps-gui/{ => icons}/system-run.png | Bin .../{ => icons}/utilities-terminal.png | Bin tools/lammps-gui/{ => icons}/vdw-style.png | Bin tools/lammps-gui/{ => icons}/vmd.png | Bin tools/lammps-gui/{ => icons}/window-close.png | Bin .../{ => icons}/x-office-drawing.png | Bin tools/lammps-gui/imageviewer.cpp | 34 +++--- tools/lammps-gui/lammpsgui.cpp | 24 ++-- tools/lammps-gui/lammpsgui.qrc | 108 +++++++++--------- tools/lammps-gui/lammpsgui.ui | 66 +++++------ tools/lammps-gui/preferences.cpp | 6 +- tools/lammps-gui/setvariables.cpp | 6 +- tools/lammps-gui/slideshow.cpp | 22 ++-- 63 files changed, 142 insertions(+), 142 deletions(-) rename tools/lammps-gui/{ => icons}/antialias.png (100%) rename tools/lammps-gui/{ => icons}/application-calc.png (100%) rename tools/lammps-gui/{ => icons}/application-exit.png (100%) rename tools/lammps-gui/{ => icons}/application-plot.png (100%) rename tools/lammps-gui/{ => icons}/axes-img.png (100%) rename tools/lammps-gui/{ => icons}/document-new.png (100%) rename tools/lammps-gui/{ => icons}/document-open-recent.png (100%) rename tools/lammps-gui/{ => icons}/document-open.png (100%) rename tools/lammps-gui/{ => icons}/document-revert.png (100%) rename tools/lammps-gui/{ => icons}/document-save-as.png (100%) rename tools/lammps-gui/{ => icons}/document-save.png (100%) rename tools/lammps-gui/{ => icons}/edit-copy.png (100%) rename tools/lammps-gui/{ => icons}/edit-cut.png (100%) rename tools/lammps-gui/{ => icons}/edit-delete.png (100%) rename tools/lammps-gui/{ => icons}/edit-paste.png (100%) rename tools/lammps-gui/{ => icons}/edit-redo.png (100%) rename tools/lammps-gui/{ => icons}/edit-undo.png (100%) rename tools/lammps-gui/{ => icons}/emblem-photos.png (100%) rename tools/lammps-gui/{ => icons}/expand-text.png (100%) rename tools/lammps-gui/{ => icons}/export-movie.png (100%) rename tools/lammps-gui/{ => icons}/format-indent-less-3.png (100%) rename tools/lammps-gui/{ => icons}/go-first.png (100%) rename tools/lammps-gui/{ => icons}/go-last.png (100%) rename tools/lammps-gui/{ => icons}/go-next-2.png (100%) rename tools/lammps-gui/{ => icons}/go-previous-2.png (100%) rename tools/lammps-gui/{ => icons}/gtk-go-down.png (100%) rename tools/lammps-gui/{ => icons}/gtk-go-up.png (100%) rename tools/lammps-gui/{ => icons}/gtk-zoom-fit.png (100%) rename tools/lammps-gui/{ => icons}/gtk-zoom-in.png (100%) rename tools/lammps-gui/{ => icons}/gtk-zoom-out.png (100%) rename tools/lammps-gui/{ => icons}/hd-img.png (100%) rename tools/lammps-gui/{ => icons}/help-about.png (100%) rename tools/lammps-gui/{ => icons}/help-browser.png (100%) rename tools/lammps-gui/{ => icons}/help-faq.png (100%) rename tools/lammps-gui/{ => icons}/image-x-generic.png (100%) rename tools/lammps-gui/{ => icons}/lammps-icon-128x128.png (100%) rename tools/lammps-gui/{ => icons}/media-playback-start-2.png (100%) rename tools/lammps-gui/{ => icons}/media-playlist-repeat.png (100%) rename tools/lammps-gui/{ => icons}/object-rotate-left.png (100%) rename tools/lammps-gui/{ => icons}/object-rotate-right.png (100%) rename tools/lammps-gui/{ => icons}/ovito.png (100%) rename tools/lammps-gui/{ => icons}/preferences-desktop-font.png (100%) rename tools/lammps-gui/{ => icons}/preferences-desktop-personal.png (100%) rename tools/lammps-gui/{ => icons}/preferences-desktop.png (100%) rename tools/lammps-gui/{ => icons}/process-stop.png (100%) rename tools/lammps-gui/{ => icons}/run-file.png (100%) rename tools/lammps-gui/{ => icons}/system-box.png (100%) rename tools/lammps-gui/{ => icons}/system-help.png (100%) rename tools/lammps-gui/{ => icons}/system-run.png (100%) rename tools/lammps-gui/{ => icons}/utilities-terminal.png (100%) rename tools/lammps-gui/{ => icons}/vdw-style.png (100%) rename tools/lammps-gui/{ => icons}/vmd.png (100%) rename tools/lammps-gui/{ => icons}/window-close.png (100%) rename tools/lammps-gui/{ => icons}/x-office-drawing.png (100%) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 7ea8a77385..bc9ebd56c4 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -35,14 +35,14 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : top->addWidget(new QLabel("Select data:")); top->addWidget(columns); saveAsAct = file->addAction("&Save Graph As...", this, &ChartWindow::saveAs); - saveAsAct->setIcon(QIcon(":/document-save-as.png")); + saveAsAct->setIcon(QIcon(":/icons/document-save-as.png")); exportCsvAct = file->addAction("&Export data to CSV...", this, &ChartWindow::exportCsv); - exportCsvAct->setIcon(QIcon(":/application-calc.png")); + exportCsvAct->setIcon(QIcon(":/icons/application-calc.png")); exportDatAct = file->addAction("Export data to &Gnuplot...", this, &ChartWindow::exportDat); - exportDatAct->setIcon(QIcon(":/application-plot.png")); + exportDatAct->setIcon(QIcon(":/icons/application-plot.png")); file->addSeparator(); closeAct = file->addAction("&Close", this, &QWidget::close); - closeAct->setIcon(QIcon(":/window-close.png")); + closeAct->setIcon(QIcon(":/icons/window-close.png")); auto *layout = new QVBoxLayout; layout->addLayout(top); setLayout(layout); diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 01e71d087c..bf94568f37 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -657,18 +657,18 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) auto *menu = createStandardContextMenu(); menu->addSeparator(); auto action = menu->addAction(QString("Display available completions for '%1'").arg(help)); - action->setIcon(QIcon(":/expand-text.png")); + action->setIcon(QIcon(":/icons/expand-text.png")); connect(action, &QAction::triggered, this, &CodeEditor::runCompletion); if (!page.isEmpty()) { menu->addSeparator(); action = menu->addAction(QString("Reformat '%1' command").arg(help)); - action->setIcon(QIcon(":/format-indent-less-3.png")); + action->setIcon(QIcon(":/icons/format-indent-less-3.png")); connect(action, &QAction::triggered, this, &CodeEditor::reformatCurrentLine); menu->addSeparator(); action = menu->addAction(QString("View Documentation for '%1'").arg(help)); - action->setIcon(QIcon(":/system-help.png")); + action->setIcon(QIcon(":/icons/system-help.png")); action->setData(page); connect(action, &QAction::triggered, this, &CodeEditor::open_help); // if we link to help with specific styles (fix, compute, pair, bond, ...) @@ -679,13 +679,13 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) page = words.at(0); page += ".html"; auto action2 = menu->addAction(QString("View Documentation for '%1'").arg(help)); - action2->setIcon(QIcon(":/system-help.png")); + action2->setIcon(QIcon(":/icons/system-help.png")); action2->setData(page); connect(action2, &QAction::triggered, this, &CodeEditor::open_help); } } auto action3 = menu->addAction(QString("LAMMPS Manual")); - action3->setIcon(QIcon(":/help-browser.png")); + action3->setIcon(QIcon(":/icons/help-browser.png")); action3->setData(QString()); connect(action3, &QAction::triggered, this, &CodeEditor::open_help); diff --git a/tools/lammps-gui/antialias.png b/tools/lammps-gui/icons/antialias.png similarity index 100% rename from tools/lammps-gui/antialias.png rename to tools/lammps-gui/icons/antialias.png diff --git a/tools/lammps-gui/application-calc.png b/tools/lammps-gui/icons/application-calc.png similarity index 100% rename from tools/lammps-gui/application-calc.png rename to tools/lammps-gui/icons/application-calc.png diff --git a/tools/lammps-gui/application-exit.png b/tools/lammps-gui/icons/application-exit.png similarity index 100% rename from tools/lammps-gui/application-exit.png rename to tools/lammps-gui/icons/application-exit.png diff --git a/tools/lammps-gui/application-plot.png b/tools/lammps-gui/icons/application-plot.png similarity index 100% rename from tools/lammps-gui/application-plot.png rename to tools/lammps-gui/icons/application-plot.png diff --git a/tools/lammps-gui/axes-img.png b/tools/lammps-gui/icons/axes-img.png similarity index 100% rename from tools/lammps-gui/axes-img.png rename to tools/lammps-gui/icons/axes-img.png diff --git a/tools/lammps-gui/document-new.png b/tools/lammps-gui/icons/document-new.png similarity index 100% rename from tools/lammps-gui/document-new.png rename to tools/lammps-gui/icons/document-new.png diff --git a/tools/lammps-gui/document-open-recent.png b/tools/lammps-gui/icons/document-open-recent.png similarity index 100% rename from tools/lammps-gui/document-open-recent.png rename to tools/lammps-gui/icons/document-open-recent.png diff --git a/tools/lammps-gui/document-open.png b/tools/lammps-gui/icons/document-open.png similarity index 100% rename from tools/lammps-gui/document-open.png rename to tools/lammps-gui/icons/document-open.png diff --git a/tools/lammps-gui/document-revert.png b/tools/lammps-gui/icons/document-revert.png similarity index 100% rename from tools/lammps-gui/document-revert.png rename to tools/lammps-gui/icons/document-revert.png diff --git a/tools/lammps-gui/document-save-as.png b/tools/lammps-gui/icons/document-save-as.png similarity index 100% rename from tools/lammps-gui/document-save-as.png rename to tools/lammps-gui/icons/document-save-as.png diff --git a/tools/lammps-gui/document-save.png b/tools/lammps-gui/icons/document-save.png similarity index 100% rename from tools/lammps-gui/document-save.png rename to tools/lammps-gui/icons/document-save.png diff --git a/tools/lammps-gui/edit-copy.png b/tools/lammps-gui/icons/edit-copy.png similarity index 100% rename from tools/lammps-gui/edit-copy.png rename to tools/lammps-gui/icons/edit-copy.png diff --git a/tools/lammps-gui/edit-cut.png b/tools/lammps-gui/icons/edit-cut.png similarity index 100% rename from tools/lammps-gui/edit-cut.png rename to tools/lammps-gui/icons/edit-cut.png diff --git a/tools/lammps-gui/edit-delete.png b/tools/lammps-gui/icons/edit-delete.png similarity index 100% rename from tools/lammps-gui/edit-delete.png rename to tools/lammps-gui/icons/edit-delete.png diff --git a/tools/lammps-gui/edit-paste.png b/tools/lammps-gui/icons/edit-paste.png similarity index 100% rename from tools/lammps-gui/edit-paste.png rename to tools/lammps-gui/icons/edit-paste.png diff --git a/tools/lammps-gui/edit-redo.png b/tools/lammps-gui/icons/edit-redo.png similarity index 100% rename from tools/lammps-gui/edit-redo.png rename to tools/lammps-gui/icons/edit-redo.png diff --git a/tools/lammps-gui/edit-undo.png b/tools/lammps-gui/icons/edit-undo.png similarity index 100% rename from tools/lammps-gui/edit-undo.png rename to tools/lammps-gui/icons/edit-undo.png diff --git a/tools/lammps-gui/emblem-photos.png b/tools/lammps-gui/icons/emblem-photos.png similarity index 100% rename from tools/lammps-gui/emblem-photos.png rename to tools/lammps-gui/icons/emblem-photos.png diff --git a/tools/lammps-gui/expand-text.png b/tools/lammps-gui/icons/expand-text.png similarity index 100% rename from tools/lammps-gui/expand-text.png rename to tools/lammps-gui/icons/expand-text.png diff --git a/tools/lammps-gui/export-movie.png b/tools/lammps-gui/icons/export-movie.png similarity index 100% rename from tools/lammps-gui/export-movie.png rename to tools/lammps-gui/icons/export-movie.png diff --git a/tools/lammps-gui/format-indent-less-3.png b/tools/lammps-gui/icons/format-indent-less-3.png similarity index 100% rename from tools/lammps-gui/format-indent-less-3.png rename to tools/lammps-gui/icons/format-indent-less-3.png diff --git a/tools/lammps-gui/go-first.png b/tools/lammps-gui/icons/go-first.png similarity index 100% rename from tools/lammps-gui/go-first.png rename to tools/lammps-gui/icons/go-first.png diff --git a/tools/lammps-gui/go-last.png b/tools/lammps-gui/icons/go-last.png similarity index 100% rename from tools/lammps-gui/go-last.png rename to tools/lammps-gui/icons/go-last.png diff --git a/tools/lammps-gui/go-next-2.png b/tools/lammps-gui/icons/go-next-2.png similarity index 100% rename from tools/lammps-gui/go-next-2.png rename to tools/lammps-gui/icons/go-next-2.png diff --git a/tools/lammps-gui/go-previous-2.png b/tools/lammps-gui/icons/go-previous-2.png similarity index 100% rename from tools/lammps-gui/go-previous-2.png rename to tools/lammps-gui/icons/go-previous-2.png diff --git a/tools/lammps-gui/gtk-go-down.png b/tools/lammps-gui/icons/gtk-go-down.png similarity index 100% rename from tools/lammps-gui/gtk-go-down.png rename to tools/lammps-gui/icons/gtk-go-down.png diff --git a/tools/lammps-gui/gtk-go-up.png b/tools/lammps-gui/icons/gtk-go-up.png similarity index 100% rename from tools/lammps-gui/gtk-go-up.png rename to tools/lammps-gui/icons/gtk-go-up.png diff --git a/tools/lammps-gui/gtk-zoom-fit.png b/tools/lammps-gui/icons/gtk-zoom-fit.png similarity index 100% rename from tools/lammps-gui/gtk-zoom-fit.png rename to tools/lammps-gui/icons/gtk-zoom-fit.png diff --git a/tools/lammps-gui/gtk-zoom-in.png b/tools/lammps-gui/icons/gtk-zoom-in.png similarity index 100% rename from tools/lammps-gui/gtk-zoom-in.png rename to tools/lammps-gui/icons/gtk-zoom-in.png diff --git a/tools/lammps-gui/gtk-zoom-out.png b/tools/lammps-gui/icons/gtk-zoom-out.png similarity index 100% rename from tools/lammps-gui/gtk-zoom-out.png rename to tools/lammps-gui/icons/gtk-zoom-out.png diff --git a/tools/lammps-gui/hd-img.png b/tools/lammps-gui/icons/hd-img.png similarity index 100% rename from tools/lammps-gui/hd-img.png rename to tools/lammps-gui/icons/hd-img.png diff --git a/tools/lammps-gui/help-about.png b/tools/lammps-gui/icons/help-about.png similarity index 100% rename from tools/lammps-gui/help-about.png rename to tools/lammps-gui/icons/help-about.png diff --git a/tools/lammps-gui/help-browser.png b/tools/lammps-gui/icons/help-browser.png similarity index 100% rename from tools/lammps-gui/help-browser.png rename to tools/lammps-gui/icons/help-browser.png diff --git a/tools/lammps-gui/help-faq.png b/tools/lammps-gui/icons/help-faq.png similarity index 100% rename from tools/lammps-gui/help-faq.png rename to tools/lammps-gui/icons/help-faq.png diff --git a/tools/lammps-gui/image-x-generic.png b/tools/lammps-gui/icons/image-x-generic.png similarity index 100% rename from tools/lammps-gui/image-x-generic.png rename to tools/lammps-gui/icons/image-x-generic.png diff --git a/tools/lammps-gui/lammps-icon-128x128.png b/tools/lammps-gui/icons/lammps-icon-128x128.png similarity index 100% rename from tools/lammps-gui/lammps-icon-128x128.png rename to tools/lammps-gui/icons/lammps-icon-128x128.png diff --git a/tools/lammps-gui/media-playback-start-2.png b/tools/lammps-gui/icons/media-playback-start-2.png similarity index 100% rename from tools/lammps-gui/media-playback-start-2.png rename to tools/lammps-gui/icons/media-playback-start-2.png diff --git a/tools/lammps-gui/media-playlist-repeat.png b/tools/lammps-gui/icons/media-playlist-repeat.png similarity index 100% rename from tools/lammps-gui/media-playlist-repeat.png rename to tools/lammps-gui/icons/media-playlist-repeat.png diff --git a/tools/lammps-gui/object-rotate-left.png b/tools/lammps-gui/icons/object-rotate-left.png similarity index 100% rename from tools/lammps-gui/object-rotate-left.png rename to tools/lammps-gui/icons/object-rotate-left.png diff --git a/tools/lammps-gui/object-rotate-right.png b/tools/lammps-gui/icons/object-rotate-right.png similarity index 100% rename from tools/lammps-gui/object-rotate-right.png rename to tools/lammps-gui/icons/object-rotate-right.png diff --git a/tools/lammps-gui/ovito.png b/tools/lammps-gui/icons/ovito.png similarity index 100% rename from tools/lammps-gui/ovito.png rename to tools/lammps-gui/icons/ovito.png diff --git a/tools/lammps-gui/preferences-desktop-font.png b/tools/lammps-gui/icons/preferences-desktop-font.png similarity index 100% rename from tools/lammps-gui/preferences-desktop-font.png rename to tools/lammps-gui/icons/preferences-desktop-font.png diff --git a/tools/lammps-gui/preferences-desktop-personal.png b/tools/lammps-gui/icons/preferences-desktop-personal.png similarity index 100% rename from tools/lammps-gui/preferences-desktop-personal.png rename to tools/lammps-gui/icons/preferences-desktop-personal.png diff --git a/tools/lammps-gui/preferences-desktop.png b/tools/lammps-gui/icons/preferences-desktop.png similarity index 100% rename from tools/lammps-gui/preferences-desktop.png rename to tools/lammps-gui/icons/preferences-desktop.png diff --git a/tools/lammps-gui/process-stop.png b/tools/lammps-gui/icons/process-stop.png similarity index 100% rename from tools/lammps-gui/process-stop.png rename to tools/lammps-gui/icons/process-stop.png diff --git a/tools/lammps-gui/run-file.png b/tools/lammps-gui/icons/run-file.png similarity index 100% rename from tools/lammps-gui/run-file.png rename to tools/lammps-gui/icons/run-file.png diff --git a/tools/lammps-gui/system-box.png b/tools/lammps-gui/icons/system-box.png similarity index 100% rename from tools/lammps-gui/system-box.png rename to tools/lammps-gui/icons/system-box.png diff --git a/tools/lammps-gui/system-help.png b/tools/lammps-gui/icons/system-help.png similarity index 100% rename from tools/lammps-gui/system-help.png rename to tools/lammps-gui/icons/system-help.png diff --git a/tools/lammps-gui/system-run.png b/tools/lammps-gui/icons/system-run.png similarity index 100% rename from tools/lammps-gui/system-run.png rename to tools/lammps-gui/icons/system-run.png diff --git a/tools/lammps-gui/utilities-terminal.png b/tools/lammps-gui/icons/utilities-terminal.png similarity index 100% rename from tools/lammps-gui/utilities-terminal.png rename to tools/lammps-gui/icons/utilities-terminal.png diff --git a/tools/lammps-gui/vdw-style.png b/tools/lammps-gui/icons/vdw-style.png similarity index 100% rename from tools/lammps-gui/vdw-style.png rename to tools/lammps-gui/icons/vdw-style.png diff --git a/tools/lammps-gui/vmd.png b/tools/lammps-gui/icons/vmd.png similarity index 100% rename from tools/lammps-gui/vmd.png rename to tools/lammps-gui/icons/vmd.png diff --git a/tools/lammps-gui/window-close.png b/tools/lammps-gui/icons/window-close.png similarity index 100% rename from tools/lammps-gui/window-close.png rename to tools/lammps-gui/icons/window-close.png diff --git a/tools/lammps-gui/x-office-drawing.png b/tools/lammps-gui/icons/x-office-drawing.png similarity index 100% rename from tools/lammps-gui/x-office-drawing.png rename to tools/lammps-gui/icons/x-office-drawing.png diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 139d73cb38..c7186c40aa 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -79,7 +79,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge QSettings settings; vdwfactor = 0.5; - auto pix = QPixmap(":/emblem-photos.png"); + auto pix = QPixmap(":/icons/emblem-photos.png"); auto *renderstatus = new QLabel(QString()); renderstatus->setPixmap(pix.scaled(22, 22, Qt::KeepAspectRatio)); @@ -107,39 +107,39 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge auto *dummy = new QPushButton(QIcon(), ""); dummy->hide(); - auto *dossao = new QPushButton(QIcon(":/hd-img.png"), ""); + auto *dossao = new QPushButton(QIcon(":/icons/hd-img.png"), ""); dossao->setCheckable(true); dossao->setToolTip("Toggle SSAO rendering"); dossao->setObjectName("ssao"); - auto *doanti = new QPushButton(QIcon(":/antialias.png"), ""); + auto *doanti = new QPushButton(QIcon(":/icons/antialias.png"), ""); doanti->setCheckable(true); doanti->setToolTip("Toggle anti-aliasing"); doanti->setObjectName("antialias"); - auto *dovdw = new QPushButton(QIcon(":/vdw-style.png"), ""); + auto *dovdw = new QPushButton(QIcon(":/icons/vdw-style.png"), ""); dovdw->setCheckable(true); dovdw->setToolTip("Toggle VDW style representation"); dovdw->setObjectName("vdw"); - auto *dobox = new QPushButton(QIcon(":/system-box.png"), ""); + auto *dobox = new QPushButton(QIcon(":/icons/system-box.png"), ""); dobox->setCheckable(true); dobox->setToolTip("Toggle displaying box"); dobox->setObjectName("box"); - auto *doaxes = new QPushButton(QIcon(":/axes-img.png"), ""); + auto *doaxes = new QPushButton(QIcon(":/icons/axes-img.png"), ""); doaxes->setCheckable(true); doaxes->setToolTip("Toggle displaying axes"); doaxes->setObjectName("axes"); - auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), ""); + auto *zoomin = new QPushButton(QIcon(":/icons/gtk-zoom-in.png"), ""); zoomin->setToolTip("Zoom in by 10 percent"); - auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"), ""); + auto *zoomout = new QPushButton(QIcon(":/icons/gtk-zoom-out.png"), ""); zoomout->setToolTip("Zoom out by 10 percent"); - auto *rotleft = new QPushButton(QIcon(":/object-rotate-left.png"), ""); + auto *rotleft = new QPushButton(QIcon(":/icons/object-rotate-left.png"), ""); rotleft->setToolTip("Rotate left by 15 degrees"); - auto *rotright = new QPushButton(QIcon(":/object-rotate-right.png"), ""); + auto *rotright = new QPushButton(QIcon(":/icons/object-rotate-right.png"), ""); rotright->setToolTip("Rotate right by 15 degrees"); - auto *rotup = new QPushButton(QIcon(":/gtk-go-up.png"), ""); + auto *rotup = new QPushButton(QIcon(":/icons/gtk-go-up.png"), ""); rotup->setToolTip("Rotate up by 15 degrees"); - auto *rotdown = new QPushButton(QIcon(":/gtk-go-down.png"), ""); + auto *rotdown = new QPushButton(QIcon(":/icons/gtk-go-down.png"), ""); rotdown->setToolTip("Rotate down by 15 degrees"); - auto *reset = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); + auto *reset = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); reset->setToolTip("Reset view to defaults"); auto *combo = new QComboBox; combo->setObjectName("group"); @@ -192,7 +192,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge mainLayout->addLayout(menuLayout); mainLayout->addWidget(scrollArea); mainLayout->addWidget(buttonBox); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle(QString("Image Viewer: ") + QFileInfo(fileName).fileName()); createActions(); @@ -475,16 +475,16 @@ void ImageViewer::createActions() QMenu *fileMenu = menuBar->addMenu("&File"); saveAsAct = fileMenu->addAction("&Save As...", this, &ImageViewer::saveAs); - saveAsAct->setIcon(QIcon(":/document-save-as.png")); + saveAsAct->setIcon(QIcon(":/icons/document-save-as.png")); saveAsAct->setEnabled(false); fileMenu->addSeparator(); copyAct = fileMenu->addAction("&Copy", this, &ImageViewer::copy); - copyAct->setIcon(QIcon(":/edit-copy.png")); + copyAct->setIcon(QIcon(":/icons/edit-copy.png")); copyAct->setShortcut(QKeySequence::Copy); copyAct->setEnabled(false); fileMenu->addSeparator(); QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); - exitAct->setIcon(QIcon(":/window-close.png")); + exitAct->setIcon(QIcon(":/icons/window-close.png")); exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); } diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 599b9d5097..870f464ff1 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -146,7 +146,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : lammps_args.push_back(mystrdup("-log")); lammps_args.push_back(mystrdup("none")); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); QFont all_font("Arial", -1); all_font.setStyleHint(QFont::SansSerif, QFont::PreferOutline); @@ -163,7 +163,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : varwindow = new QLabel(QString()); varwindow->setWindowTitle("LAMMPS-GUI - Current Variables:"); - varwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + varwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); varwindow->setMinimumSize(100, 50); varwindow->setText("(none)"); varwindow->setFont(text_font); @@ -226,15 +226,15 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : #endif lammpsstatus = new QLabel(QString()); - auto pix = QPixmap(":/lammps-icon-128x128.png"); + auto pix = QPixmap(":/icons/lammps-icon-128x128.png"); lammpsstatus->setPixmap(pix.scaled(22, 22, Qt::KeepAspectRatio)); ui->statusbar->addWidget(lammpsstatus); lammpsstatus->setToolTip("LAMMPS instance is active"); lammpsstatus->hide(); - auto *lammpsrun = new QPushButton(QIcon(":/system-run.png"), ""); - auto *lammpsstop = new QPushButton(QIcon(":/process-stop.png"), ""); - auto *lammpsimage = new QPushButton(QIcon(":/emblem-photos.png"), ""); + auto *lammpsrun = new QPushButton(QIcon(":/icons/system-run.png"), ""); + auto *lammpsstop = new QPushButton(QIcon(":/icons/process-stop.png"), ""); + auto *lammpsimage = new QPushButton(QIcon(":/icons/emblem-photos.png"), ""); lammpsrun->setToolTip("Run LAMMPS on input"); lammpsstop->setToolTip("Stop LAMMPS"); lammpsimage->setToolTip("Create snapshot image"); @@ -1015,7 +1015,7 @@ void LammpsGui::do_run(bool use_buffer) else logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on file - " + current_file); - logwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + logwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); QFont text_font; text_font.fromString(settings.value("textfont", text_font.toString()).toString()); logwindow->document()->setDefaultFont(text_font); @@ -1039,7 +1039,7 @@ void LammpsGui::do_run(bool use_buffer) else chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on file - " + current_file); - chartwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + chartwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); QObject::connect(shortcut, &QShortcut::activated, chartwindow, &ChartWindow::close); @@ -1202,10 +1202,10 @@ void LammpsGui::about() QMessageBox msg; msg.setWindowTitle("About LAMMPS"); - msg.setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + msg.setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); msg.setText(version.c_str()); msg.setInformativeText(info.c_str()); - msg.setIconPixmap(QPixmap(":/lammps-icon-128x128.png").scaled(64, 64)); + msg.setIconPixmap(QPixmap(":/icons/lammps-icon-128x128.png").scaled(64, 64)); msg.setStandardButtons(QMessageBox::Close); QFont font; font.setPointSizeF(font.pointSizeF() * 0.75); @@ -1222,7 +1222,7 @@ void LammpsGui::help() { QMessageBox msg; msg.setWindowTitle("LAMMPS-GUI Quick Help"); - msg.setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + msg.setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); msg.setText("
This is LAMMPS-GUI version " LAMMPS_GUI_VERSION "
"); msg.setInformativeText("

LAMMPS GUI is a graphical text editor that is linked to the LAMMPS " "library and thus can run LAMMPS directly using the contents of the " @@ -1262,7 +1262,7 @@ void LammpsGui::help() "accelerator packages and number of OpenMP threads. Due to its nature " "as a graphical application, it is not possible to use the " "LAMMPS GUI in parallel with MPI.

"); - msg.setIconPixmap(QPixmap(":/lammps-icon-128x128.png").scaled(64, 64)); + msg.setIconPixmap(QPixmap(":/icons/lammps-icon-128x128.png").scaled(64, 64)); msg.setStandardButtons(QMessageBox::Close); msg.exec(); } diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index 0baca37aac..6405d66d7a 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -1,62 +1,62 @@ - lammps-icon-128x128.png + icons/lammps-icon-128x128.png help_index.table lammps_internal_commands.txt - antialias.png - application-calc.png - application-exit.png - application-plot.png - axes-img.png - document-new.png - document-open-recent.png - document-open.png - document-revert.png - document-save-as.png - document-save.png - edit-copy.png - edit-cut.png - edit-delete.png - edit-paste.png - edit-redo.png - edit-undo.png - emblem-photos.png - expand-text.png - export-movie.png - format-indent-less-3.png - go-first.png - go-last.png - go-next-2.png - go-previous-2.png - gtk-go-down.png - gtk-go-up.png - gtk-zoom-fit.png - gtk-zoom-in.png - gtk-zoom-out.png - hd-img.png - help-about.png - help-browser.png - help-faq.png - image-x-generic.png - media-playback-start-2.png - media-playlist-repeat.png - object-rotate-left.png - object-rotate-right.png - ovito.png - preferences-desktop-font.png - preferences-desktop-personal.png - preferences-desktop.png - process-stop.png - run-file.png - system-box.png - system-help.png - system-run.png - utilities-terminal.png - vdw-style.png - vmd.png - window-close.png - x-office-drawing.png + icons/antialias.png + icons/application-calc.png + icons/application-exit.png + icons/application-plot.png + icons/axes-img.png + icons/document-new.png + icons/document-open-recent.png + icons/document-open.png + icons/document-revert.png + icons/document-save-as.png + icons/document-save.png + icons/edit-copy.png + icons/edit-cut.png + icons/edit-delete.png + icons/edit-paste.png + icons/edit-redo.png + icons/edit-undo.png + icons/emblem-photos.png + icons/expand-text.png + icons/export-movie.png + icons/format-indent-less-3.png + icons/go-first.png + icons/go-last.png + icons/go-next-2.png + icons/go-previous-2.png + icons/gtk-go-down.png + icons/gtk-go-up.png + icons/gtk-zoom-fit.png + icons/gtk-zoom-in.png + icons/gtk-zoom-out.png + icons/hd-img.png + icons/help-about.png + icons/help-browser.png + icons/help-faq.png + icons/image-x-generic.png + icons/media-playback-start-2.png + icons/media-playlist-repeat.png + icons/object-rotate-left.png + icons/object-rotate-right.png + icons/ovito.png + icons/preferences-desktop-font.png + icons/preferences-desktop-personal.png + icons/preferences-desktop.png + icons/process-stop.png + icons/run-file.png + icons/system-box.png + icons/system-help.png + icons/system-run.png + icons/utilities-terminal.png + icons/vdw-style.png + icons/vmd.png + icons/window-close.png + icons/x-office-drawing.png diff --git a/tools/lammps-gui/lammpsgui.ui b/tools/lammps-gui/lammpsgui.ui index 77257b23c2..bb9af2e17e 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -105,7 +105,7 @@ - + &New @@ -116,7 +116,7 @@ - + &Open @@ -127,7 +127,7 @@ - + &Save @@ -138,7 +138,7 @@ - + Save &As @@ -149,7 +149,7 @@ - + &Quit @@ -160,7 +160,7 @@ - + Cu&t @@ -171,7 +171,7 @@ - + &Copy @@ -182,7 +182,7 @@ - + &Paste @@ -193,7 +193,7 @@ - + &Undo @@ -204,7 +204,7 @@ - + &Redo @@ -215,7 +215,7 @@ - + &Run LAMMPS from Editor Buffer @@ -226,7 +226,7 @@ - + &Run LAMMPS from File @@ -237,7 +237,7 @@ - + &Stop LAMMPS @@ -248,7 +248,7 @@ - + Create &Image @@ -259,7 +259,7 @@ - + &About LAMMPS @@ -270,7 +270,7 @@ - + Quick &Help @@ -281,7 +281,7 @@ - + Pre&ferences... @@ -292,7 +292,7 @@ - + LAMMPS &Manual @@ -303,7 +303,7 @@ - + Reset to &Defaults @@ -311,7 +311,7 @@ - + View in &OVITO @@ -322,7 +322,7 @@ - + View in VM&D @@ -333,7 +333,7 @@ - + &Log Window @@ -344,7 +344,7 @@ - + &Chart Window @@ -355,7 +355,7 @@ - + &Slide Show Window @@ -366,7 +366,7 @@ - + &1. @@ -374,7 +374,7 @@ - + &2. @@ -382,7 +382,7 @@ - + &3. @@ -390,7 +390,7 @@ - + &4. @@ -398,7 +398,7 @@ - + &5. @@ -406,7 +406,7 @@ - + &Image Window @@ -417,7 +417,7 @@ - + Set &Variables... @@ -428,7 +428,7 @@ - + &Variables Window @@ -439,7 +439,7 @@ - + LAMMPS GUI Howto diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index b6224d452e..5b8cc7afdb 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -73,7 +73,7 @@ Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) : layout->addWidget(tabWidget); layout->addWidget(buttonBox); setLayout(layout); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle("LAMMPS-GUI - Preferences"); resize(600, 450); } @@ -242,9 +242,9 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa auto *fontlayout = new QHBoxLayout; auto *getallfont = - new QPushButton(QIcon(":/preferences-desktop-font.png"), "Select Default Font..."); + new QPushButton(QIcon(":/icons/preferences-desktop-font.png"), "Select Default Font..."); auto *gettextfont = - new QPushButton(QIcon(":/preferences-desktop-font.png"), "Select Text Font..."); + new QPushButton(QIcon(":/icons/preferences-desktop-font.png"), "Select Text Font..."); fontlayout->addWidget(getallfont); fontlayout->addWidget(gettextfont); connect(getallfont, &QPushButton::released, this, &GeneralTab::newallfont); diff --git a/tools/lammps-gui/setvariables.cpp b/tools/lammps-gui/setvariables.cpp index fbbacb70bd..db5eb1cdea 100644 --- a/tools/lammps-gui/setvariables.cpp +++ b/tools/lammps-gui/setvariables.cpp @@ -32,7 +32,7 @@ SetVariables::SetVariables(QList> &_vars, QWidget *paren auto *row = new QHBoxLayout; auto *name = new QLineEdit(v.first); auto *val = new QLineEdit(v.second); - auto *del = new QPushButton(QIcon(":/edit-delete.png"), ""); + auto *del = new QPushButton(QIcon(":/icons/edit-delete.png"), ""); name->setObjectName("varname"); val->setObjectName("varval"); del->setObjectName(QString::number(i)); @@ -55,7 +55,7 @@ SetVariables::SetVariables(QList> &_vars, QWidget *paren layout->addWidget(buttonBox); setLayout(layout); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle("LAMMPS-GUI - Set Variables"); resize(300, 200); } @@ -81,7 +81,7 @@ void SetVariables::add_row() auto *row = new QHBoxLayout; auto *name = new QLineEdit(QString()); auto *val = new QLineEdit(QString()); - auto *del = new QPushButton(QIcon(":/edit-delete.png"), ""); + auto *del = new QPushButton(QIcon(":/icons/edit-delete.png"), ""); name->setObjectName("varname"); val->setObjectName("varval"); del->setObjectName(QString::number(nrows - 2)); diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index e92bfdc2d5..68544040e6 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -64,33 +64,33 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : auto *dummy = new QPushButton(QIcon(), ""); dummy->hide(); - auto *tomovie = new QPushButton(QIcon(":/export-movie.png"), ""); + auto *tomovie = new QPushButton(QIcon(":/icons/export-movie.png"), ""); tomovie->setToolTip("Export to movie file"); tomovie->setEnabled(has_exe("ffmpeg")); - auto *gofirst = new QPushButton(QIcon(":/go-first.png"), ""); + auto *gofirst = new QPushButton(QIcon(":/icons/go-first.png"), ""); gofirst->setToolTip("Go to first Image"); - auto *goprev = new QPushButton(QIcon(":/go-previous-2.png"), ""); + auto *goprev = new QPushButton(QIcon(":/icons/go-previous-2.png"), ""); goprev->setToolTip("Go to previous Image"); - auto *goplay = new QPushButton(QIcon(":/media-playback-start-2.png"), ""); + auto *goplay = new QPushButton(QIcon(":/icons/media-playback-start-2.png"), ""); goplay->setToolTip("Play animation"); goplay->setCheckable(true); goplay->setChecked(playtimer); goplay->setObjectName("play"); - auto *gonext = new QPushButton(QIcon(":/go-next-2.png"), ""); + auto *gonext = new QPushButton(QIcon(":/icons/go-next-2.png"), ""); gonext->setToolTip("Go to next Image"); - auto *golast = new QPushButton(QIcon(":/go-last.png"), ""); + auto *golast = new QPushButton(QIcon(":/icons/go-last.png"), ""); golast->setToolTip("Go to last Image"); - auto *goloop = new QPushButton(QIcon(":/media-playlist-repeat.png"), ""); + auto *goloop = new QPushButton(QIcon(":/icons/media-playlist-repeat.png"), ""); goloop->setToolTip("Loop animation"); goloop->setCheckable(true); goloop->setChecked(do_loop); - auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), ""); + auto *zoomin = new QPushButton(QIcon(":/icons/gtk-zoom-in.png"), ""); zoomin->setToolTip("Zoom in by 10 percent"); - auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"), ""); + auto *zoomout = new QPushButton(QIcon(":/icons/gtk-zoom-out.png"), ""); zoomout->setToolTip("Zoom out by 10 percent"); - auto *normal = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); + auto *normal = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); normal->setToolTip("Reset zoom to normal"); connect(tomovie, &QPushButton::released, this, &SlideShow::movie); @@ -127,7 +127,7 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : botLayout->setStretch(0, 3); mainLayout->addLayout(botLayout); - setWindowIcon(QIcon(":/lammps-icon-128x128.png")); + setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + QFileInfo(fileName).fileName()); imagefiles.clear(); From 5201e6b2f15509b5d7aba1742470866c8ebe119b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 16:31:28 -0400 Subject: [PATCH 103/417] add support for completion on file names --- tools/lammps-gui/codeeditor.cpp | 24 +++++++++++++++++++++++- tools/lammps-gui/codeeditor.h | 3 ++- tools/lammps-gui/lammpsgui.cpp | 4 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index bf94568f37..e46c14289b 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -19,8 +19,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -131,7 +133,7 @@ CodeEditor::CodeEditor(QWidget *parent) : minimize_comp(new QCompleter(this)), variable_comp(new QCompleter(this)), units_comp(new QCompleter(this)), group_comp(new QCompleter(this)), varname_comp(new QCompleter(this)), fixid_comp(new QCompleter(this)), - compid_comp(new QCompleter(this)), highlight(NO_HIGHLIGHT) + compid_comp(new QCompleter(this)), file_comp(new QCompleter(this)), highlight(NO_HIGHLIGHT) { help_action = new QShortcut(QKeySequence::fromString("Ctrl+?"), parent); connect(help_action, &QShortcut::activated, this, &CodeEditor::get_help); @@ -166,6 +168,7 @@ CodeEditor::CodeEditor(QWidget *parent) : COMPLETER_SETUP(varname_comp); COMPLETER_SETUP(fixid_comp); COMPLETER_SETUP(compid_comp); + COMPLETER_SETUP(file_comp); #undef COMPLETER_SETUP // initialize help system @@ -233,6 +236,7 @@ CodeEditor::~CodeEditor() delete varname_comp; delete fixid_comp; delete compid_comp; + delete file_comp; } int CodeEditor::lineNumberAreaWidth() @@ -506,6 +510,16 @@ void CodeEditor::setFixIDList() fixid_comp->setModel(new QStringListModel(fixid, fixid_comp)); } +void CodeEditor::setFileList() +{ + QStringList files; + QDir dir("."); + for (const auto &file : dir.entryInfoList(QDir::Files)) + files << file.fileName(); + files.sort(); + file_comp->setModel(new QStringListModel(files, file_comp)); +} + void CodeEditor::keyPressEvent(QKeyEvent *event) { const auto key = event->key(); @@ -801,6 +815,10 @@ void CodeEditor::runCompletion() else if ((words[0] == "change_box") || (words[0] == "displace_atoms") || (words[0] == "velocity") || (words[0] == "write_dump")) current_comp = group_comp; + else if ((words[0] == "fitpod") || (words[0] == "include") || (words[0] == "ndx2group") || + (words[0] == "read_data") || (words[0] == "read_dump") || + (words[0] == "read_restart") || (words[0] == "rerun")) + current_comp = file_comp; else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) @@ -852,6 +870,8 @@ void CodeEditor::runCompletion() current_comp = fixid_comp; else if (selected.startsWith("F_")) current_comp = fixid_comp; + else if ((words[0] == "fitpod") || (words[0] == "molecule")) + current_comp = file_comp; if (current_comp) { current_comp->setCompletionPrefix(words[2].c_str()); @@ -879,6 +899,8 @@ void CodeEditor::runCompletion() current_comp = compute_comp; else if (words[0] == "dump") current_comp = dump_comp; + else if ((words[0] == "pair_coeff") && (words[1] == "*") && (words[2] == "*")) + current_comp = file_comp; else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) diff --git a/tools/lammps-gui/codeeditor.h b/tools/lammps-gui/codeeditor.h index 5f802d329d..703b2ffd3c 100644 --- a/tools/lammps-gui/codeeditor.h +++ b/tools/lammps-gui/codeeditor.h @@ -60,6 +60,7 @@ public: void setVarNameList(); void setComputeIDList(); void setFixIDList(); + void setFileList(); static constexpr int NO_HIGHLIGHT = 1 << 30; @@ -87,7 +88,7 @@ private: QCompleter *current_comp, *command_comp, *fix_comp, *compute_comp, *dump_comp, *atom_comp, *pair_comp, *bond_comp, *angle_comp, *dihedral_comp, *improper_comp, *kspace_comp, *region_comp, *integrate_comp, *minimize_comp, *variable_comp, *units_comp, *group_comp, - *varname_comp, *fixid_comp, *compid_comp; + *varname_comp, *fixid_comp, *compid_comp, *file_comp; int highlight; bool reformat_on_return; diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 870f464ff1..3399d69a48 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -305,6 +305,8 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : style_list.sort(); ui->textEdit->setUnitsList(style_list); + ui->textEdit->setFileList(); + #define ADD_STYLES(keyword, Type) \ style_list.clear(); \ if ((std::string(#keyword) == "pair") || (std::string(#keyword) == "bond") || \ @@ -596,6 +598,7 @@ void LammpsGui::open_file(const QString &fileName) ui->textEdit->setVarNameList(); ui->textEdit->setComputeIDList(); ui->textEdit->setFixIDList(); + ui->textEdit->setFileList(); file.close(); dirstatus->setText(QString(" Directory: ") + current_dir); status->setText("Ready."); @@ -938,6 +941,7 @@ void LammpsGui::run_done() QString("Error running LAMMPS:\n\n") + errorbuf); } ui->textEdit->setCursor(nline); + ui->textEdit->setFileList(); progress->hide(); dirstatus->show(); } From 11608abf34e1dd9d207e2be6b8b0c62bc99f5c89 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 16:45:59 -0400 Subject: [PATCH 104/417] update docs --- doc/src/Intro_nonfeatures.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index 3289b838d6..529bcbdf6d 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -5,7 +5,7 @@ LAMMPS is designed to be a fast, parallel engine for molecular dynamics (MD) simulations. It provides only a modest amount of functionality for setting up simulations and analyzing their output. -Specifically, LAMMPS was not conceived and designed for: +Originally, LAMMPS was not conceived and designed for: * being run through a GUI * building molecular systems, or building molecular topologies @@ -14,9 +14,10 @@ Specifically, LAMMPS was not conceived and designed for: * visualize your MD simulation interactively * plot your output data -Over the years some of these limitations have been reduced or -removed, through features added to LAMMPS or external tools -that either closely interface with LAMMPS or extend LAMMPS. +Over the years many of these limitations have been reduced or +removed. In part through features added to LAMMPS and in part +through external tools that either closely interface with LAMMPS +or extend LAMMPS. Here are suggestions on how to perform these tasks: @@ -24,8 +25,9 @@ Here are suggestions on how to perform these tasks: wraps the library interface is provided. Thus, GUI interfaces can be written in Python or C/C++ that run LAMMPS and visualize or plot its output. Examples of this are provided in the python directory and - described on the :doc:`Python ` doc page. Also, there - are several external wrappers or GUI front ends. + described on the :doc:`Python ` doc page. As of version + 2 August 2023 :ref:`a GUI tool ` is included in LAMMPS. + Also, there are several external wrappers or GUI front ends. * **Builder:** Several pre-processing tools are packaged with LAMMPS. Some of them convert input files in formats produced by other MD codes such as CHARMM, AMBER, or Insight into LAMMPS input formats. Some of From b2f62bbd1a6fe92b52f55ef352b70cf59250d794 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 17:52:43 -0400 Subject: [PATCH 105/417] include FFMpeg and gzip into windows zip archive for LAMMPS GUI --- cmake/packaging/build_windows_vs.cmake | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmake/packaging/build_windows_vs.cmake b/cmake/packaging/build_windows_vs.cmake index bd55f3f442..283425ff65 100644 --- a/cmake/packaging/build_windows_vs.cmake +++ b/cmake/packaging/build_windows_vs.cmake @@ -21,6 +21,13 @@ file(WRITE qtdeploy.bat "@ECHO OFF\r\nset VSCMD_DEBUG=0\r\nCALL ${VC_INIT} x64\r execute_process(COMMAND cmd.exe /c qtdeploy.bat COMMAND_ECHO STDERR) file(REMOVE qtdeploy.bat) +# download and uncompress static FFMpeg and gzip binaries +file(DOWNLOAD "https://download.lammps.org/thirdparty/ffmpeg-gzip.zip" ffmpeg-gzip.zip) +file(WRITE unpackzip.ps1 "Expand-Archive -Path ffmpeg-gzip.zip -DestinationPath LAMMPS_GUI") +execute_process(COMMAND powershell -ExecutionPolicy Bypass -File unpackzip.ps1) +file(REMOVE unpackzip.ps1) +file(REMOVE ffmpeg-gzip.zip) + # create zip archive file(WRITE makearchive.ps1 "Compress-Archive -Path LAMMPS_GUI -CompressionLevel Optimal -DestinationPath LAMMPS_GUI-Win10-amd64.zip") execute_process(COMMAND powershell -ExecutionPolicy Bypass -File makearchive.ps1) From 29989f102a0df719dbf4f204c6bff681b6c081dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 24 Sep 2023 23:08:59 -0400 Subject: [PATCH 106/417] remove unused class members and silence compiler warnings --- tools/lammps-gui/chartviewer.cpp | 6 +++--- tools/lammps-gui/codeeditor.cpp | 4 ++-- tools/lammps-gui/highlighter.h | 2 +- tools/lammps-gui/imageviewer.cpp | 4 ++-- tools/lammps-gui/lammpsgui.cpp | 9 ++++----- tools/lammps-gui/lammpswrapper.cpp | 6 +++++- tools/lammps-gui/lammpswrapper.h | 2 ++ tools/lammps-gui/preferences.cpp | 4 ++-- tools/lammps-gui/stdcapture.h | 1 - 9 files changed, 21 insertions(+), 17 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index bc9ebd56c4..f33d6b3b91 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -22,8 +22,8 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), active_chart(-1), - filename(_filename) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), + filename(_filename), active_chart(-1) { auto *top = new QHBoxLayout; menu->addMenu(file); @@ -175,7 +175,7 @@ void ChartWindow::exportCsv() } } -void ChartWindow::change_chart(int index) +void ChartWindow::change_chart(int) { int choice = columns->currentData().toInt(); for (auto &c : charts) { diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index e46c14289b..91cecef1fd 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -323,7 +323,7 @@ QString CodeEditor::reformatLine(const QString &line) } // append remaining words with just a single blank added. - for (int i = 1; i < words.size(); ++i) { + for (std::size_t i = 1; i < words.size(); ++i) { newtext += ' '; newtext += words[i].c_str(); @@ -552,7 +552,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) } // automatically reformat when hitting the return or enter key - if (reformat_on_return && (key == Qt::Key_Return) || (key == Qt::Key_Enter)) { + if (reformat_on_return && ((key == Qt::Key_Return) || (key == Qt::Key_Enter))) { reformatCurrentLine(); } diff --git a/tools/lammps-gui/highlighter.h b/tools/lammps-gui/highlighter.h index 6edbc0ca96..03b4355e19 100644 --- a/tools/lammps-gui/highlighter.h +++ b/tools/lammps-gui/highlighter.h @@ -32,7 +32,7 @@ private: QRegularExpression isOutput1, isOutput2, isRead; QTextCharFormat formatOutput, formatRead, formatLattice, formatSetup; QRegularExpression isStyle, isForce, isDefine, isUndo; - QRegularExpression isParticle, isSetup, isSetup1, isRun; + QRegularExpression isParticle, isRun, isSetup, isSetup1; QTextCharFormat formatParticle, formatRun, formatDefine; QRegularExpression isVariable, isReference; QTextCharFormat formatVariable; diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index c7186c40aa..010bdc82b8 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -57,7 +57,7 @@ static int get_pte_from_mass(double mass) static const QString blank(" "); ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidget *parent) : - QDialog(parent), imageLabel(new QLabel), scrollArea(new QScrollArea), menuBar(new QMenuBar), + QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea), lammps(_lammps), group("all"), filename(fileName), useelements(false) { imageLabel->setBackgroundRole(QPalette::Base); @@ -348,7 +348,7 @@ void ImageViewer::do_rot_up() createImage(); } -void ImageViewer::change_group(int idx) +void ImageViewer::change_group(int) { QComboBox *box = findChild("group"); if (box) group = box->currentText(); diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 3399d69a48..80e099ba2d 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -57,8 +57,7 @@ #endif static const QString blank(" "); -static constexpr int MAXRECENT = 5; -static constexpr int BUFLEN = 128; +static constexpr int BUFLEN = 128; LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), @@ -837,7 +836,7 @@ void LammpsGui::logupdate() for (int i = 0; i < ncols; ++i) { int datatype = *(int *)lammps.last_thermo("type", i); - double data; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double @@ -907,7 +906,7 @@ void LammpsGui::run_done() chartwindow->add_chart(label, i); } int datatype = *(int *)lammps.last_thermo("type", i); - double data; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double @@ -1400,7 +1399,7 @@ void LammpsGui::start_lammps() lammpsstatus->show(); // delete additional arguments again (3 were there initially - while (lammps_args.size() > initial_narg) { + while ((int)lammps_args.size() > initial_narg) { delete lammps_args.back(); lammps_args.pop_back(); } diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index 024aae5301..a71a750ac8 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -19,7 +19,11 @@ #include "library.h" #endif -LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr), plugin_handle(nullptr) {} +LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr) { +#if defined(LAMMPS_GUI_USE_PLUGIN) + plugin_handle = nullptr; +#endif +} void LammpsWrapper::open(int narg, char **args) { diff --git a/tools/lammps-gui/lammpswrapper.h b/tools/lammps-gui/lammpswrapper.h index f5d73a0d87..665f44c25c 100644 --- a/tools/lammps-gui/lammpswrapper.h +++ b/tools/lammps-gui/lammpswrapper.h @@ -57,7 +57,9 @@ public: private: void *lammps_handle; +#if defined(LAMMPS_GUI_USE_PLUGIN) void *plugin_handle; +#endif }; #endif diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 5b8cc7afdb..cae3783e4d 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -57,9 +57,9 @@ #endif Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) : - QDialog(parent), tabWidget(new QTabWidget), + QDialog(parent), need_relaunch(false), tabWidget(new QTabWidget), buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)), - settings(new QSettings), lammps(_lammps), need_relaunch(false) + settings(new QSettings), lammps(_lammps) { tabWidget->addTab(new GeneralTab(settings, lammps), "&General Settings"); tabWidget->addTab(new AcceleratorTab(settings, lammps), "&Accelerators"); diff --git a/tools/lammps-gui/stdcapture.h b/tools/lammps-gui/stdcapture.h index ee8bb44dd3..3df6835aa9 100644 --- a/tools/lammps-gui/stdcapture.h +++ b/tools/lammps-gui/stdcapture.h @@ -31,7 +31,6 @@ private: int m_pipe[2]; int m_oldStdOut; bool m_capturing; - bool m_init; std::string m_captured; static constexpr int bufSize = 1025; From 082d2bec9ff5805140884f8d70c6f67a25b63d5d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 07:46:55 -0400 Subject: [PATCH 107/417] merge used parts of periodic_table.h into imageviewer.cpp --- tools/lammps-gui/imageviewer.cpp | 77 ++++++++++- tools/lammps-gui/periodic_table.h | 206 ------------------------------ 2 files changed, 74 insertions(+), 209 deletions(-) delete mode 100644 tools/lammps-gui/periodic_table.h diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 010bdc82b8..b73f8a4927 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -40,8 +40,80 @@ #include -extern "C" { -#include "periodic_table.h" +// clang-format off +/* periodic table of elements for translation of ordinal to atom type */ +static const char *pte_label[] = { + "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", + "Na", "Mg", "Al", "Si", "P" , "S", "Cl", "Ar", "K", "Ca", "Sc", + "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", + "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", + "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", + "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", + "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", + "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", + "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", + "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", + "Ds", "Rg" +}; +static constexpr int nr_pte_entries = sizeof(pte_label) / sizeof(char *); + +/* corresponding table of masses. */ +static constexpr double pte_mass[] = { + /* X */ 0.00000, 1.00794, 4.00260, 6.941, 9.012182, 10.811, + /* C */ 12.0107, 14.0067, 15.9994, 18.9984032, 20.1797, + /* Na */ 22.989770, 24.3050, 26.981538, 28.0855, 30.973761, + /* S */ 32.065, 35.453, 39.948, 39.0983, 40.078, 44.955910, + /* Ti */ 47.867, 50.9415, 51.9961, 54.938049, 55.845, 58.9332, + /* Ni */ 58.6934, 63.546, 65.409, 69.723, 72.64, 74.92160, + /* Se */ 78.96, 79.904, 83.798, 85.4678, 87.62, 88.90585, + /* Zr */ 91.224, 92.90638, 95.94, 98.0, 101.07, 102.90550, + /* Pd */ 106.42, 107.8682, 112.411, 114.818, 118.710, 121.760, + /* Te */ 127.60, 126.90447, 131.293, 132.90545, 137.327, + /* La */ 138.9055, 140.116, 140.90765, 144.24, 145.0, 150.36, + /* Eu */ 151.964, 157.25, 158.92534, 162.500, 164.93032, + /* Er */ 167.259, 168.93421, 173.04, 174.967, 178.49, 180.9479, + /* W */ 183.84, 186.207, 190.23, 192.217, 195.078, 196.96655, + /* Hg */ 200.59, 204.3833, 207.2, 208.98038, 209.0, 210.0, 222.0, + /* Fr */ 223.0, 226.0, 227.0, 232.0381, 231.03588, 238.02891, + /* Np */ 237.0, 244.0, 243.0, 247.0, 247.0, 251.0, 252.0, 257.0, + /* Md */ 258.0, 259.0, 262.0, 261.0, 262.0, 266.0, 264.0, 269.0, + /* Mt */ 268.0, 271.0, 272.0 +}; + +/* + * corresponding table of VDW radii. + * van der Waals radii are taken from A. Bondi, + * J. Phys. Chem., 68, 441 - 452, 1964, + * except the value for H, which is taken from R.S. Rowland & R. Taylor, + * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in + * either of these publications have RvdW = 2.00 \AA + * The radii for Ions (Na, K, Cl, Ca, Mg, and Cs are based on the CHARMM27 + * Rmin/2 parameters for (SOD, POT, CLA, CAL, MG, CES) by default. + */ +static constexpr double pte_vdw_radius[] = { + /* X */ 1.5, 1.2, 1.4, 1.82, 2.0, 2.0, + /* C */ 1.7, 1.55, 1.52, 1.47, 1.54, + /* Na */ 1.36, 1.18, 2.0, 2.1, 1.8, + /* S */ 1.8, 2.27, 1.88, 1.76, 1.37, 2.0, + /* Ti */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Ni */ 1.63, 1.4, 1.39, 1.07, 2.0, 1.85, + /* Se */ 1.9, 1.85, 2.02, 2.0, 2.0, 2.0, + /* Zr */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Pd */ 1.63, 1.72, 1.58, 1.93, 2.17, 2.0, + /* Te */ 2.06, 1.98, 2.16, 2.1, 2.0, + /* La */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Eu */ 2.0, 2.0, 2.0, 2.0, 2.0, + /* Er */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* W */ 2.0, 2.0, 2.0, 2.0, 1.72, 1.66, + /* Hg */ 1.55, 1.96, 2.02, 2.0, 2.0, 2.0, 2.0, + /* Fr */ 2.0, 2.0, 2.0, 2.0, 2.0, 1.86, + /* Np */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Md */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + /* Mt */ 2.0, 2.0, 2.0 +}; + +// clang-format on + static int get_pte_from_mass(double mass) { int idx = 0; @@ -52,7 +124,6 @@ static int get_pte_from_mass(double mass) if ((mass < 61.24) && (mass > 58.8133)) idx = 27; return idx; } -} static const QString blank(" "); diff --git a/tools/lammps-gui/periodic_table.h b/tools/lammps-gui/periodic_table.h deleted file mode 100644 index 70721dee95..0000000000 --- a/tools/lammps-gui/periodic_table.h +++ /dev/null @@ -1,206 +0,0 @@ -// clang-format off -/*************************************************************************** - * RCS INFORMATION: - * - * $RCSfile: periodic_table.h,v $ - * $Author: johns $ $Locker: $ $State: Exp $ - * $Revision: 1.12 $ $Date: 2009/01/21 17:45:41 $ - * - ***************************************************************************/ - -/* - * periodic table of elements and helper functions to convert - * ordinal numbers to labels and back. - * all tables and functions are declared static, so that it - * can be safely included by all plugins that may need it. - * - * 2002-2009 akohlmey@cmm.chem.upenn.edu, vmd@ks.uiuc.edu - */ - -#include -#include - -/* periodic table of elements for translation of ordinal to atom type */ -static const char *pte_label[] = { - "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", - "Na", "Mg", "Al", "Si", "P" , "S", "Cl", "Ar", "K", "Ca", "Sc", - "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", - "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", - "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", - "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", - "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", - "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", - "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", - "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", - "Ds", "Rg" -}; -static const int nr_pte_entries = sizeof(pte_label) / sizeof(char *); - -/* corresponding table of masses. */ -static const double pte_mass[] = { - /* X */ 0.00000, 1.00794, 4.00260, 6.941, 9.012182, 10.811, - /* C */ 12.0107, 14.0067, 15.9994, 18.9984032, 20.1797, - /* Na */ 22.989770, 24.3050, 26.981538, 28.0855, 30.973761, - /* S */ 32.065, 35.453, 39.948, 39.0983, 40.078, 44.955910, - /* Ti */ 47.867, 50.9415, 51.9961, 54.938049, 55.845, 58.9332, - /* Ni */ 58.6934, 63.546, 65.409, 69.723, 72.64, 74.92160, - /* Se */ 78.96, 79.904, 83.798, 85.4678, 87.62, 88.90585, - /* Zr */ 91.224, 92.90638, 95.94, 98.0, 101.07, 102.90550, - /* Pd */ 106.42, 107.8682, 112.411, 114.818, 118.710, 121.760, - /* Te */ 127.60, 126.90447, 131.293, 132.90545, 137.327, - /* La */ 138.9055, 140.116, 140.90765, 144.24, 145.0, 150.36, - /* Eu */ 151.964, 157.25, 158.92534, 162.500, 164.93032, - /* Er */ 167.259, 168.93421, 173.04, 174.967, 178.49, 180.9479, - /* W */ 183.84, 186.207, 190.23, 192.217, 195.078, 196.96655, - /* Hg */ 200.59, 204.3833, 207.2, 208.98038, 209.0, 210.0, 222.0, - /* Fr */ 223.0, 226.0, 227.0, 232.0381, 231.03588, 238.02891, - /* Np */ 237.0, 244.0, 243.0, 247.0, 247.0, 251.0, 252.0, 257.0, - /* Md */ 258.0, 259.0, 262.0, 261.0, 262.0, 266.0, 264.0, 269.0, - /* Mt */ 268.0, 271.0, 272.0 -}; - -/* - * corresponding table of VDW radii. - * van der Waals radii are taken from A. Bondi, - * J. Phys. Chem., 68, 441 - 452, 1964, - * except the value for H, which is taken from R.S. Rowland & R. Taylor, - * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in - * either of these publications have RvdW = 2.00 \AA - * The radii for Ions (Na, K, Cl, Ca, Mg, and Cs are based on the CHARMM27 - * Rmin/2 parameters for (SOD, POT, CLA, CAL, MG, CES) by default. - */ -static const double pte_vdw_radius[] = { - /* X */ 1.5, 1.2, 1.4, 1.82, 2.0, 2.0, - /* C */ 1.7, 1.55, 1.52, 1.47, 1.54, - /* Na */ 1.36, 1.18, 2.0, 2.1, 1.8, - /* S */ 1.8, 2.27, 1.88, 1.76, 1.37, 2.0, - /* Ti */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Ni */ 1.63, 1.4, 1.39, 1.07, 2.0, 1.85, - /* Se */ 1.9, 1.85, 2.02, 2.0, 2.0, 2.0, - /* Zr */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Pd */ 1.63, 1.72, 1.58, 1.93, 2.17, 2.0, - /* Te */ 2.06, 1.98, 2.16, 2.1, 2.0, - /* La */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Eu */ 2.0, 2.0, 2.0, 2.0, 2.0, - /* Er */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* W */ 2.0, 2.0, 2.0, 2.0, 1.72, 1.66, - /* Hg */ 1.55, 1.96, 2.02, 2.0, 2.0, 2.0, 2.0, - /* Fr */ 2.0, 2.0, 2.0, 2.0, 2.0, 1.86, - /* Np */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Md */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - /* Mt */ 2.0, 2.0, 2.0 -}; - -/* lookup functions */ - -static const char *get_pte_label(const int idx) -{ - if ((idx < 1) || (idx >= nr_pte_entries)) return pte_label[0]; - - return pte_label[idx]; -} - -static double get_pte_mass(const int idx) -{ - if ((idx < 1) || (idx >= nr_pte_entries)) return pte_mass[0]; - - return pte_mass[idx]; -} - -static double get_pte_vdw_radius(const int idx) -{ - if ((idx < 1) || (idx >= nr_pte_entries)) return pte_vdw_radius[0]; - -#if 1 - /* Replace with Hydrogen radius with an "all-atom" radius */ - if (idx == 1) - return 1.0; /* H */ -#else - /* Replace with old VMD atom radii values */ - switch (idx) { - case 1: return 1.0; /* H */ - case 6: return 1.5; /* C */ - case 7: return 1.4; /* N */ - case 8: return 1.3; /* O */ - case 9: return 1.2; /* F */ - case 15: return 1.5; /* P */ - case 16: return 1.9; /* S */ - } -#endif - - return pte_vdw_radius[idx]; -} - -static int get_pte_idx(const char *label) -{ - int i; - char atom[3]; - - /* zap string */ - atom[0] = (char) 0; - atom[1] = (char) 0; - atom[2] = (char) 0; - /* if we don't have a null-pointer, there must be at least two - * chars, which is all we need. we convert to the capitalization - * convention of the table above during assignment. */ - if (label != NULL) { - atom[0] = (char) toupper((int) label[0]); - atom[1] = (char) tolower((int) label[1]); - } - /* discard numbers in atom label */ - if (isdigit(atom[1])) atom[1] = (char) 0; - - for (i=0; i < nr_pte_entries; ++i) { - if ( (pte_label[i][0] == atom[0]) - && (pte_label[i][1] == atom[1]) ) return i; - } - - return 0; -} - -static int get_pte_idx_from_string(const char *label) { - int i, ind; - char atom[3]; - - if (label != NULL) { - /* zap string */ - atom[0] = atom[1] = atom[2] = '\0'; - - for (ind=0,i=0; (ind<2) && (label[i]!='\0'); i++) { - if (label[i] != ' ') { - atom[ind] = toupper(label[i]); - ind++; - } - } - - if (ind < 1) - return 0; /* no non-whitespace characters */ - - for (i=0; i < nr_pte_entries; ++i) { - if ((toupper(pte_label[i][0]) == atom[0]) && (toupper(pte_label[i][1]) == atom[1])) - return i; - } - } - - return 0; -} - -#if 0 -#include - -int main() { - int i; - - printf("Periodic table check/dump\n"); - printf(" Table contains data for %d elements\n", nr_pte_entries); - printf(" Mass table size check: %d\n", sizeof(pte_mass) / sizeof(double)); - printf(" VDW table size check: %d\n", sizeof(pte_vdw_radius) / sizeof(double)); - printf("\n"); - printf("Symbol Num Mass rVDW\n"); - for (i=0; i Date: Mon, 25 Sep 2023 08:07:36 -0400 Subject: [PATCH 108/417] check for compatible LAMMPS version when creating LAMMPS instance This check must be done at runtime, since the LAMMPS shared library may have been loaded dynamically and thus required library functions may not be present or missing features with too only a LAMMPS version. --- tools/lammps-gui/lammpsgui.cpp | 9 +++++++++ tools/lammps-gui/lammpswrapper.cpp | 13 +++++++++++++ tools/lammps-gui/lammpswrapper.h | 1 + 3 files changed, 23 insertions(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 80e099ba2d..ebfb7f90fb 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1398,6 +1398,15 @@ void LammpsGui::start_lammps() lammps.open(narg, args); lammpsstatus->show(); + // must have at least 2 August 2023 version of LAMMPS + // TODO: must update this check before next feature release + if (lammps.version() < 20230802) { + QMessageBox::critical(this, "Incompatible LAMMPS Version", + "LAMMPS-GUI version " LAMMPS_GUI_VERSION " requires\n" + "LAMMPS version 2 August 2023 or later"); + exit(1); + } + // delete additional arguments again (3 were there initially while ((int)lammps_args.size() > initial_narg) { delete lammps_args.back(); diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index a71a750ac8..84de5866c4 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -36,6 +36,19 @@ void LammpsWrapper::open(int narg, char **args) #endif } +int LammpsWrapper::version() +{ + int val = 0; + if (lammps_handle) { +#if defined(LAMMPS_GUI_USE_PLUGIN) + val = ((liblammpsplugin_t *)plugin_handle)->version(lammps_handle); +#else + val = lammps_version(lammps_handle); +#endif + } + return val; +} + int LammpsWrapper::extract_setting(const char *keyword) { int val = 0; diff --git a/tools/lammps-gui/lammpswrapper.h b/tools/lammps-gui/lammpswrapper.h index 665f44c25c..1d024a94e7 100644 --- a/tools/lammps-gui/lammpswrapper.h +++ b/tools/lammps-gui/lammpswrapper.h @@ -29,6 +29,7 @@ public: void force_timeout(); + int version(); int extract_setting(const char *keyword); void *extract_global(const char *keyword); void *extract_atom(const char *keyword); From a128089ab165eeda4e5d8e0e2c997a69d6ad942e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 08:09:36 -0400 Subject: [PATCH 109/417] apply clang-format --- tools/lammps-gui/chartviewer.cpp | 4 ++-- tools/lammps-gui/lammpsgui.cpp | 4 ++-- tools/lammps-gui/lammpswrapper.cpp | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index f33d6b3b91..34893b75e8 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -22,8 +22,8 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), - filename(_filename), active_chart(-1) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename), + active_chart(-1) { auto *top = new QHBoxLayout; menu->addMenu(file); diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index ebfb7f90fb..eecf2a58e3 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -836,7 +836,7 @@ void LammpsGui::logupdate() for (int i = 0; i < ncols; ++i) { int datatype = *(int *)lammps.last_thermo("type", i); - double data = 0.0; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double @@ -906,7 +906,7 @@ void LammpsGui::run_done() chartwindow->add_chart(label, i); } int datatype = *(int *)lammps.last_thermo("type", i); - double data = 0.0; + double data = 0.0; if (datatype == 0) // int data = *(int *)lammps.last_thermo("data", i); else if (datatype == 2) // double diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index 84de5866c4..f74a1c6575 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -19,7 +19,8 @@ #include "library.h" #endif -LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr) { +LammpsWrapper::LammpsWrapper() : lammps_handle(nullptr) +{ #if defined(LAMMPS_GUI_USE_PLUGIN) plugin_handle = nullptr; #endif From 053f6fa03dde64ea632cc4dff5d13a0339ceae7c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 08:54:56 -0400 Subject: [PATCH 110/417] must also update CWD when *saving* a file, not only when loading --- tools/lammps-gui/lammpsgui.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index eecf2a58e3..e95c41432c 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -622,6 +622,8 @@ void LammpsGui::open_file(const QString &fileName) lammps.close(); } +// write file and update CWD to its folder + void LammpsGui::write_file(const QString &fileName) { QFileInfo path(fileName); @@ -634,6 +636,7 @@ void LammpsGui::write_file(const QString &fileName) return; } setWindowTitle(QString("LAMMPS-GUI - " + current_file)); + QDir::setCurrent(current_dir); update_recents(path.absoluteFilePath()); From 25e9c2a35bb7df5926497eff61984381c414726b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Sep 2023 09:23:49 -0400 Subject: [PATCH 111/417] file completion only in current folder. hide popup when changing completer --- tools/lammps-gui/codeeditor.cpp | 48 ++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 91cecef1fd..4277ff4c90 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -725,6 +725,9 @@ void CodeEditor::reformatCurrentLine() void CodeEditor::runCompletion() { + QAbstractItemView *popup = nullptr; + if (current_comp) popup = current_comp->popup(); + auto cursor = textCursor(); auto line = cursor.block().text().trimmed(); // no completion possible on empty lines @@ -751,7 +754,8 @@ void CodeEditor::runCompletion() if (selected.startsWith("$")) { current_comp = varname_comp; current_comp->setCompletionPrefix(selected); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (selected == current_comp->currentCompletion()) { if (popup->isVisible()) { @@ -772,7 +776,8 @@ void CodeEditor::runCompletion() current_comp = command_comp; current_comp->setCompletionPrefix(words[0].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[0] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) { @@ -817,9 +822,12 @@ void CodeEditor::runCompletion() current_comp = group_comp; else if ((words[0] == "fitpod") || (words[0] == "include") || (words[0] == "ndx2group") || (words[0] == "read_data") || (words[0] == "read_dump") || - (words[0] == "read_restart") || (words[0] == "rerun")) - current_comp = file_comp; - else if (selected.startsWith("v_")) + (words[0] == "read_restart") || (words[0] == "rerun")) { + if (selected.contains('/')) { + if (popup && popup->isVisible()) popup->hide(); + } else + current_comp = file_comp; + } else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) current_comp = compid_comp; @@ -832,7 +840,8 @@ void CodeEditor::runCompletion() if (current_comp) { current_comp->setCompletionPrefix(words[1].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[1] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) popup->hide(); @@ -870,12 +879,16 @@ void CodeEditor::runCompletion() current_comp = fixid_comp; else if (selected.startsWith("F_")) current_comp = fixid_comp; - else if ((words[0] == "fitpod") || (words[0] == "molecule")) - current_comp = file_comp; - + else if ((words[0] == "fitpod") || (words[0] == "molecule")) { + if (selected.contains('/')) { + if (popup && popup->isVisible()) popup->hide(); + } else + current_comp = file_comp; + } if (current_comp) { current_comp->setCompletionPrefix(words[2].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[2] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) popup->hide(); @@ -899,9 +912,12 @@ void CodeEditor::runCompletion() current_comp = compute_comp; else if (words[0] == "dump") current_comp = dump_comp; - else if ((words[0] == "pair_coeff") && (words[1] == "*") && (words[2] == "*")) - current_comp = file_comp; - else if (selected.startsWith("v_")) + else if ((words[0] == "pair_coeff") && (words[1] == "*") && (words[2] == "*")) { + if (selected.contains('/')) { + if (popup && popup->isVisible()) popup->hide(); + } else + current_comp = file_comp; + } else if (selected.startsWith("v_")) current_comp = varname_comp; else if (selected.startsWith("c_")) current_comp = compid_comp; @@ -914,7 +930,8 @@ void CodeEditor::runCompletion() if (current_comp) { current_comp->setCompletionPrefix(words[3].c_str()); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (words[3] == current_comp->currentCompletion().toStdString()) { if (popup->isVisible()) popup->hide(); @@ -942,7 +959,8 @@ void CodeEditor::runCompletion() if (current_comp) { current_comp->setCompletionPrefix(selected); - auto popup = current_comp->popup(); + if (popup && (popup != current_comp->popup())) popup->hide(); + popup = current_comp->popup(); // if the command is already a complete command, remove existing popup if (selected == current_comp->currentCompletion()) { if (popup->isVisible()) popup->hide(); From 7c3a95240e7712ca8da9e8aa23c82d8ec77a8cfb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Sep 2023 23:29:07 -0400 Subject: [PATCH 112/417] print more specific error messages when parsing ReaxFF force field files --- src/REAXFF/reaxff_ffield.cpp | 40 ++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/REAXFF/reaxff_ffield.cpp b/src/REAXFF/reaxff_ffield.cpp index d79d63b87b..3aa7c3191c 100644 --- a/src/REAXFF/reaxff_ffield.cpp +++ b/src/REAXFF/reaxff_ffield.cpp @@ -60,8 +60,13 @@ namespace ReaxFF { // read and parse the force field only on rank 0 -#define THROW_ERROR(txt) \ - throw ffield_parser_error(fmt::format("{}:{}: {}",filename,lineno,txt)) +#define THROW_ERROR(txt) throw ffield_parser_error(fmt::format("{}:{}: {}", filename, lineno, txt)) + +#define CHECK_COLUMNS(want) \ + if (values.count() < static_cast(want)) \ + throw ffield_parser_error(fmt::format("{}:{}: Invalid force field file format: " \ + " expected {} columns but found {}", \ + filename, lineno, want, values.count())) if (control->me == 0) { FILE *fp = LAMMPS_NS::utils::open_potential(filename, lmp, nullptr); @@ -158,8 +163,7 @@ namespace ReaxFF { if ((values.count() < 8) && !lgflag) THROW_ERROR("This force field file requires using 'lgvdw yes'"); - if (values.count() < 9) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(9); // copy element symbol in uppercase and truncate stored element symbol if necessary auto element = uppercase(values.next_string()); @@ -180,8 +184,7 @@ namespace ReaxFF { values = reader.next_values(0); ++lineno; - if (values.count() < 8) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(8); sbp[i].alpha = values.next_double(); sbp[i].gamma_w = values.next_double(); @@ -196,8 +199,7 @@ namespace ReaxFF { values = reader.next_values(0); ++lineno; - if (values.count() < 8) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(8); sbp[i].r_pi_pi = values.next_double(); sbp[i].p_lp2 = values.next_double(); @@ -211,8 +213,7 @@ namespace ReaxFF { values = reader.next_values(0); ++lineno; - if (values.count() < 8) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(8); sbp[i].p_ovun2 = values.next_double(); sbp[i].p_val3 = values.next_double(); @@ -228,8 +229,7 @@ namespace ReaxFF { if (lgflag) { values = reader.next_values(0); ++lineno; - if (values.count() < 2) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(2); sbp[i].lgcij = values.next_double(); sbp[i].lgre = values.next_double(); } else sbp[i].lgcij = sbp[i].lgre = 0.0; @@ -312,8 +312,7 @@ namespace ReaxFF { values = reader.next_values(0); ++lineno; - if (values.count() < 10) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(10); j = values.next_int() - 1; k = values.next_int() - 1; @@ -387,8 +386,7 @@ namespace ReaxFF { for (i = 0; i < n; ++i) { values = reader.next_values(0); ++lineno; - if ((int)values.count() < 8 + lgflag) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(8 + lgflag); j = values.next_int() - 1; k = values.next_int() - 1; @@ -432,8 +430,7 @@ namespace ReaxFF { for (i = 0; i < n; ++i) { values = reader.next_values(0); ++lineno; - if (values.count() < 10) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(10); j = values.next_int() - 1; k = values.next_int() - 1; @@ -487,8 +484,7 @@ namespace ReaxFF { for (i = 0; i < n; ++i) { values = reader.next_values(0); ++lineno; - if (values.count() < 9) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(9); j = values.next_int() - 1; k = values.next_int() - 1; @@ -561,8 +557,7 @@ namespace ReaxFF { for (i = 0; i < n; ++i) { values = reader.next_values(0); ++lineno; - if (values.count() < 7) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(7); j = values.next_int() - 1; k = values.next_int() - 1; @@ -616,4 +611,5 @@ namespace ReaxFF { control->nonb_cut = reax->gp.l[12]; } #undef THROW_ERROR +#undef CHECK_COLUMNS } From 6141d8d08c64c9b026cf71cd30b69b9d60f632ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Sep 2023 23:29:59 -0400 Subject: [PATCH 113/417] gracefully handle some older ReaxFF force field files without overcorrection parameter --- src/REAXFF/reaxff_ffield.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/REAXFF/reaxff_ffield.cpp b/src/REAXFF/reaxff_ffield.cpp index 3aa7c3191c..8d208873ee 100644 --- a/src/REAXFF/reaxff_ffield.cpp +++ b/src/REAXFF/reaxff_ffield.cpp @@ -335,8 +335,7 @@ namespace ReaxFF { values = reader.next_values(0); ++lineno; - if (values.count() < 8) - THROW_ERROR("Invalid force field file format"); + CHECK_COLUMNS(7); if ((j < ntypes) && (k < ntypes)) { tbp[j][k].p_be2 = tbp[k][j].p_be2 = values.next_double(); @@ -345,7 +344,11 @@ namespace ReaxFF { values.skip(); tbp[j][k].p_bo1 = tbp[k][j].p_bo1 = values.next_double(); tbp[j][k].p_bo2 = tbp[k][j].p_bo2 = values.next_double(); - tbp[j][k].ovc = tbp[k][j].ovc = values.next_double(); + // if the 8th value is missing use 0.0 + if (values.has_next()) + tbp[j][k].ovc = tbp[k][j].ovc = values.next_double(); + else + tbp[j][k].ovc = tbp[k][j].ovc = 0.0; } } From 6115edefcbd71fd7f54f6db30ee89efde20bbeb7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Sep 2023 23:34:56 -0400 Subject: [PATCH 114/417] remove redundant use of fmt::format() --- src/REAXFF/reaxff_ffield.cpp | 56 ++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/src/REAXFF/reaxff_ffield.cpp b/src/REAXFF/reaxff_ffield.cpp index 8d208873ee..d5761eb343 100644 --- a/src/REAXFF/reaxff_ffield.cpp +++ b/src/REAXFF/reaxff_ffield.cpp @@ -71,8 +71,8 @@ namespace ReaxFF { if (control->me == 0) { FILE *fp = LAMMPS_NS::utils::open_potential(filename, lmp, nullptr); if (!fp) - error->one(FLERR,fmt::format("The ReaxFF parameter file {} cannot be opened: {}", - filename, getsyserror())); + error->one(FLERR,"The ReaxFF parameter file {} cannot be opened: {}", + filename, getsyserror()); LAMMPS_NS::TextFileReader reader(fp, "ReaxFF parameter"); reader.ignore_comments = false; @@ -241,27 +241,24 @@ namespace ReaxFF { // Shielding van der Waals? if (sbp[i].gamma_w > 0.5) { if (gp.vdw_type != 0 && gp.vdw_type != 3) { - const auto errmsg - = fmt::format("Van der Waals parameters for element {} " - "indicate inner wall+shielding, but earlier " - "atoms indicate a different van der Waals " - "method. This may cause division-by-zero " - "errors. Keeping van der Waals setting for " - "earlier atoms.",sbp[i].name); - error->warning(FLERR,errmsg); + error->warning(FLERR, "Van der Waals parameters for element {} " + "indicate inner wall+shielding, but earlier " + "atoms indicate a different van der Waals " + "method. This may cause division-by-zero " + "errors. Keeping van der Waals setting for " + "earlier atoms.",sbp[i].name); + } else { gp.vdw_type = 3; } } else { // No shielding van der Waals parameters present if ((gp.vdw_type != 0) && (gp.vdw_type != 2)) { - const auto errmsg - = fmt::format("Van der Waals parameters for element {} " - "indicate inner wall withou shielding, but " - "earlier atoms indicate a different van der " - "Waals-method. This may cause division-by-" - "zero errors. Keeping van der Waals setting " - "for earlier atoms.", sbp[i].name); - error->warning(FLERR,errmsg); + error->warning(FLERR, "Van der Waals parameters for element {} " + "indicate inner wall withou shielding, but " + "earlier atoms indicate a different van der " + "Waals-method. This may cause division-by-" + "zero errors. Keeping van der Waals setting " + "for earlier atoms.", sbp[i].name); } else { gp.vdw_type = 2; } @@ -269,22 +266,18 @@ namespace ReaxFF { } else { // No Inner wall parameters present if (sbp[i].gamma_w > 0.5) { // Shielding vdWaals if ((gp.vdw_type != 0) && (gp.vdw_type != 1)) { - const auto errmsg - = fmt::format("Van der Waals parameters for element {} " - "indicate shielding without inner wall, but " - "earlier elements indicate a different van der " - "Waals method. This may cause division-by-zero " - "errors. Keeping van der Waals setting for " - "earlier atoms.", sbp[i].name); - error->warning(FLERR,errmsg); + error->warning(FLERR, "Van der Waals parameters for element {} " + "indicate shielding without inner wall, but " + "earlier elements indicate a different van der " + "Waals method. This may cause division-by-zero " + "errors. Keeping van der Waals setting for " + "earlier atoms.", sbp[i].name); } else { gp.vdw_type = 1; } } else { - error->one(FLERR,fmt::format("Inconsistent van der Waals " - "parameters: No shielding or inner " - "wall set for element {}", - sbp[i].name)); + error->one(FLERR, "Inconsistent van der Waals parameters: " + "No shielding or inner wall set for element {}", sbp[i].name); } } } @@ -293,8 +286,7 @@ namespace ReaxFF { for (i = 0; i < ntypes; i++) { if ((sbp[i].mass < 21) && (sbp[i].valency_val != sbp[i].valency_boc)) { - error->warning(FLERR,fmt::format("Changed valency_val to valency" - "_boc for {}", sbp[i].name)); + error->warning(FLERR, "Changed valency_val to valency_boc for {}", sbp[i].name); sbp[i].valency_val = sbp[i].valency_boc; } } From 5a455c5e3a48e4a9fc97ab2da5bbd803d2400ef5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Sep 2023 23:56:51 -0400 Subject: [PATCH 115/417] remove redundant calls to fmt::format() from calls to error->one/all() and utils::logmesg() --- src/ELECTRODE/electrode_matrix.cpp | 2 +- src/ELECTRODE/electrode_vector.cpp | 8 ++++---- src/ELECTRODE/pppm_electrode.cpp | 8 ++++---- src/INTEL/pppm_electrode_intel.cpp | 6 +++--- src/KOKKOS/pair_reaxff_kokkos.cpp | 3 +-- src/MANYBODY/pair_bop.cpp | 11 ++++------- src/MDI/mdi_engine.cpp | 2 +- src/OPENMP/fix_qeq_reaxff_omp.cpp | 14 ++++++-------- src/OPENMP/msm_cg_omp.cpp | 9 ++++----- src/QEQ/fix_qeq.cpp | 3 +-- src/REAXFF/fix_qeq_reaxff.cpp | 9 ++++----- src/REAXFF/fix_reaxff_bonds.cpp | 4 ++-- src/REAXFF/reaxff_allocate.cpp | 4 ++-- src/REPLICA/neb.cpp | 6 ++++-- src/REPLICA/temper_grem.cpp | 2 +- src/lammps.cpp | 8 +++----- src/read_data.cpp | 2 +- src/special.cpp | 13 ++++++------- src/utils.cpp | 13 +++++-------- 19 files changed, 57 insertions(+), 70 deletions(-) diff --git a/src/ELECTRODE/electrode_matrix.cpp b/src/ELECTRODE/electrode_matrix.cpp index 7be9119c62..86761742d4 100644 --- a/src/ELECTRODE/electrode_matrix.cpp +++ b/src/ELECTRODE/electrode_matrix.cpp @@ -84,7 +84,7 @@ void ElectrodeMatrix::compute_array(double **array, bool timer_flag) electrode_kspace->compute_matrix(&mpos[0], array, timer_flag); MPI_Barrier(world); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("KSpace time: {:.4g} s\n", MPI_Wtime() - kspace_time)); + utils::logmesg(lmp, "KSpace time: {:.4g} s\n", MPI_Wtime() - kspace_time); //cout << array[0][0] << ", " << array[0][1] << endl; pair_contribution(array); //cout << array[0][0] << ", " << array[0][1] << endl; diff --git a/src/ELECTRODE/electrode_vector.cpp b/src/ELECTRODE/electrode_vector.cpp index 245ba57727..8511ddc17c 100644 --- a/src/ELECTRODE/electrode_vector.cpp +++ b/src/ELECTRODE/electrode_vector.cpp @@ -60,10 +60,10 @@ ElectrodeVector::~ElectrodeVector() { if (timer_flag && (comm->me == 0)) { try { - utils::logmesg(lmp, fmt::format("B time: {:.4g} s\n", b_time_total)); - utils::logmesg(lmp, fmt::format("B kspace time: {:.4g} s\n", kspace_time_total)); - utils::logmesg(lmp, fmt::format("B pair time: {:.4g} s\n", pair_time_total)); - utils::logmesg(lmp, fmt::format("B boundary time: {:.4g} s\n", boundary_time_total)); + utils::logmesg(lmp, "B time: {:.4g} s\n", b_time_total); + utils::logmesg(lmp, "B kspace time: {:.4g} s\n", kspace_time_total); + utils::logmesg(lmp, "B pair time: {:.4g} s\n", pair_time_total); + utils::logmesg(lmp, "B boundary time: {:.4g} s\n", boundary_time_total); } catch (std::exception &) { } } diff --git a/src/ELECTRODE/pppm_electrode.cpp b/src/ELECTRODE/pppm_electrode.cpp index a2161f18e7..6ede0f1f4d 100644 --- a/src/ELECTRODE/pppm_electrode.cpp +++ b/src/ELECTRODE/pppm_electrode.cpp @@ -136,7 +136,7 @@ void PPPMElectrode::init() } if (order < 2 || order > MAXORDER) - error->all(FLERR, fmt::format("PPPM/electrode order cannot be < 2 or > {}", MAXORDER)); + error->all(FLERR, "PPPM/electrode order cannot be < 2 or > {}", MAXORDER); // compute two charge force @@ -816,7 +816,7 @@ void PPPMElectrode::one_step_multiplication(bigint *imat, double *greens_real, d memory->destroy(rho1d_j); MPI_Barrier(world); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("Single step time: {:.4g} s\n", MPI_Wtime() - step1_time)); + utils::logmesg(lmp, "Single step time: {:.4g} s\n", MPI_Wtime() - step1_time); } /* ----------------------------------------------------------------------*/ @@ -917,7 +917,7 @@ void PPPMElectrode::two_step_multiplication(bigint *imat, double *greens_real, d } MPI_Barrier(world); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("step 1 time: {:.4g} s\n", MPI_Wtime() - step1_time)); + utils::logmesg(lmp, "step 1 time: {:.4g} s\n", MPI_Wtime() - step1_time); // nested loop over electrode atoms i and j and stencil of i // in theory could reuse make_rho1d_j here -- but this step is already @@ -958,7 +958,7 @@ void PPPMElectrode::two_step_multiplication(bigint *imat, double *greens_real, d MPI_Barrier(world); memory->destroy(gw); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("step 2 time: {:.4g} s\n", MPI_Wtime() - step2_time)); + utils::logmesg(lmp, "step 2 time: {:.4g} s\n", MPI_Wtime() - step2_time); } /* ---------------------------------------------------------------------- diff --git a/src/INTEL/pppm_electrode_intel.cpp b/src/INTEL/pppm_electrode_intel.cpp index fcb0c0733a..5cb62dc5d2 100644 --- a/src/INTEL/pppm_electrode_intel.cpp +++ b/src/INTEL/pppm_electrode_intel.cpp @@ -719,7 +719,7 @@ void PPPMElectrodeIntel::one_step_multiplication(bigint *imat, double *greens_re MPI_Barrier(world); memory->destroy(rho1d_j); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("Single step time: {:.4g} s\n", MPI_Wtime() - step1_time)); + utils::logmesg(lmp, "Single step time: {:.4g} s\n", MPI_Wtime() - step1_time); } /* ----------------------------------------------------------------------*/ @@ -844,7 +844,7 @@ void PPPMElectrodeIntel::two_step_multiplication(bigint *imat, double *greens_re } MPI_Barrier(world); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("step 1 time: {:.4g} s\n", MPI_Wtime() - step1_time)); + utils::logmesg(lmp, "step 1 time: {:.4g} s\n", MPI_Wtime() - step1_time); // nested loop over electrode atoms i and j and stencil of i double step2_time = MPI_Wtime(); @@ -914,7 +914,7 @@ void PPPMElectrodeIntel::two_step_multiplication(bigint *imat, double *greens_re } MPI_Barrier(world); if (timer_flag && (comm->me == 0)) - utils::logmesg(lmp, fmt::format("step 2 time: {:.4g} s\n", MPI_Wtime() - step2_time)); + utils::logmesg(lmp, "step 2 time: {:.4g} s\n", MPI_Wtime() - step2_time); } template diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 8d9e1454ae..c7d54b80cd 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -382,8 +382,7 @@ void PairReaxFFKokkos::init_md() if (swb < 0) error->one(FLERR,"Negative upper Taper-radius cutoff"); else if (swb < 5) - error->one(FLERR,fmt::format("Warning: very low Taper-radius cutoff: " - "{}\n", swb)); + error->one(FLERR,"Warning: very low Taper-radius cutoff: {}\n", swb); d1 = swb - swa; d7 = powint(d1,7); diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp index 518a6dad79..ae50736455 100644 --- a/src/MANYBODY/pair_bop.cpp +++ b/src/MANYBODY/pair_bop.cpp @@ -1873,7 +1873,7 @@ void PairBOP::read_table(char *filename) reader = new PotentialFileReader(lmp, filename, "BOP"); bop_types = reader->next_int(); if (bop_types <= 0) - error->one(FLERR,fmt::format("BOP potential file with {} elements",bop_types)); + error->one(FLERR,"BOP potential file with {} elements",bop_types); bop_elements = new char*[bop_types]; bop_masses = new double[bop_types]; @@ -2221,8 +2221,7 @@ void PairBOP::write_tables(int npts) int param = elem2param[i][j]; PairParameters & pair = pairParameters[param]; - filename = fmt::format("{}{}_Pair_SPR_{}",bop_elements[i], - bop_elements[j],comm->me); + filename = fmt::format("{}{}_Pair_SPR_{}",bop_elements[i],bop_elements[j],comm->me); fp = fopen(filename.c_str(), "w"); xmin = (pair.betaS)->get_xmin(); @@ -2240,8 +2239,7 @@ void PairBOP::write_tables(int npts) fclose(fp); if (pair.cutL != 0) { - filename = fmt::format("{}{}_Pair_L_{}",bop_elements[i], - bop_elements[j],comm->me); + filename = fmt::format("{}{}_Pair_L_{}",bop_elements[i],bop_elements[j],comm->me); fp = fopen(filename.c_str(), "w"); xmin = (pair.cphi)->get_xmin(); xmax = (pair.cphi)->get_xmax(); @@ -2254,8 +2252,7 @@ void PairBOP::write_tables(int npts) } fclose(fp); } - filename = fmt::format("{}{}_Pair_BO_{}", bop_elements[i], - bop_elements[j], comm->me); + filename = fmt::format("{}{}_Pair_BO_{}", bop_elements[i],bop_elements[j], comm->me); fp = fopen(filename.c_str(), "w"); xmin = (pair.bo)->get_xmin(); xmax = (pair.bo)->get_xmax(); diff --git a/src/MDI/mdi_engine.cpp b/src/MDI/mdi_engine.cpp index 42a3e7194b..58f750f62a 100644 --- a/src/MDI/mdi_engine.cpp +++ b/src/MDI/mdi_engine.cpp @@ -240,7 +240,7 @@ MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char **arg) : Pointers(_lmp) break; } else - error->all(FLERR, fmt::format("MDI engine exited with invalid command: {}", mdicmd)); + error->all(FLERR, "MDI engine exited with invalid command: {}", mdicmd); } // clean up diff --git a/src/OPENMP/fix_qeq_reaxff_omp.cpp b/src/OPENMP/fix_qeq_reaxff_omp.cpp index 094c12b114..c6d92dea6d 100644 --- a/src/OPENMP/fix_qeq_reaxff_omp.cpp +++ b/src/OPENMP/fix_qeq_reaxff_omp.cpp @@ -224,8 +224,8 @@ void FixQEqReaxFFOMP::compute_H() } // omp if (m_fill >= H.m) - error->all(FLERR,fmt::format("Fix qeq/reaxff: H matrix size has been " - "exceeded: m_fill={} H.m={}\n", m_fill, H.m)); + error->all(FLERR,"Fix qeq/reaxff: H matrix size has been exceeded: m_fill={} H.m={}\n", + m_fill, H.m); } /* ---------------------------------------------------------------------- */ @@ -467,9 +467,8 @@ int FixQEqReaxFFOMP::CG(double *b, double *x) } if ((i >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reaxff/omp CG convergence failed " - "after {} iterations at step {}", - i,update->ntimestep)); + error->warning(FLERR,"Fix qeq/reaxff/omp CG convergence failed after {} iterations at step {}", + i,update->ntimestep); return i; } @@ -796,9 +795,8 @@ int FixQEqReaxFFOMP::dual_CG(double *b1, double *b2, double *x1, double *x2) } if ((i >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reaxff/omp CG convergence failed " - "after {} iterations at step {}", - i,update->ntimestep)); + error->warning(FLERR,"Fix qeq/reaxff/omp CG convergence failed after {} iterations at step {}", + i,update->ntimestep); return matvecs_s + matvecs_t; } diff --git a/src/OPENMP/msm_cg_omp.cpp b/src/OPENMP/msm_cg_omp.cpp index 66cb32fdf5..6904830fed 100644 --- a/src/OPENMP/msm_cg_omp.cpp +++ b/src/OPENMP/msm_cg_omp.cpp @@ -138,11 +138,10 @@ void MSMCGOMP::compute(int eflag, int vflag) / static_cast(atom->natoms); if (me == 0) - utils::logmesg(MSM::lmp,fmt::format(" MSM/cg optimization cutoff: {:.8}\n" - " Total charged atoms: {:.1f}%\n" - " Min/max charged atoms/proc: {:.1f}%" - " {:.1f}%\n",smallq, - charged_frac,charged_fmin,charged_fmax)); + utils::logmesg(MSM::lmp," MSM/cg optimization cutoff: {:.8}\n" + " Total charged atoms: {:.1f}%\n" + " Min/max charged atoms/proc: {:.1f}%" + " {:.1f}%\n",smallq, charged_frac,charged_fmin,charged_fmax); } // only need to rebuild this list after a neighbor list update diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 394ce69d22..b60438b7c8 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -810,8 +810,7 @@ void FixQEq::read_file(char *file) for (int n=1; n <= ntypes; ++n) if (setflag[n] == 0) - error->one(FLERR,fmt::format("Parameters for atom type {} missing in " - "qeq parameter file", n)); + error->one(FLERR,"Parameters for atom type {} missing in qeq parameter file", n); delete[] setflag; } diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index 554b911151..f0fc7fef99 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -697,8 +697,8 @@ void FixQEqReaxFF::compute_H() } if (m_fill >= H.m) - error->all(FLERR,fmt::format("Fix qeq/reaxff H matrix size has been " - "exceeded: m_fill={} H.m={}\n", m_fill, H.m)); + error->all(FLERR,"Fix qeq/reaxff H matrix size has been exceeded: m_fill={} H.m={}\n", + m_fill, H.m); } /* ---------------------------------------------------------------------- */ @@ -772,9 +772,8 @@ int FixQEqReaxFF::CG(double *b, double *x) } if ((i >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reaxff CG convergence failed " - "after {} iterations at step {}", - i,update->ntimestep)); + error->warning(FLERR, "Fix qeq/reaxff CG convergence failed after {} iterations at step {}", + i,update->ntimestep); return i; } diff --git a/src/REAXFF/fix_reaxff_bonds.cpp b/src/REAXFF/fix_reaxff_bonds.cpp index 8bd7ed0020..653f207e90 100644 --- a/src/REAXFF/fix_reaxff_bonds.cpp +++ b/src/REAXFF/fix_reaxff_bonds.cpp @@ -56,8 +56,8 @@ FixReaxFFBonds::FixReaxFFBonds(LAMMPS *lmp, int narg, char **arg) : if (!fp) error->one(FLERR,"Cannot open compressed file"); } else fp = fopen(arg[4],"w"); - if (!fp) error->one(FLERR,fmt::format("Cannot open fix reaxff/bonds file {}: {}", - arg[4],utils::getsyserror())); + if (!fp) error->one(FLERR,"Cannot open fix reaxff/bonds file {}: {}", + arg[4],utils::getsyserror()); } if (atom->tag_consecutive() == 0) diff --git a/src/REAXFF/reaxff_allocate.cpp b/src/REAXFF/reaxff_allocate.cpp index 5b0a4e513c..ce56668a01 100644 --- a/src/REAXFF/reaxff_allocate.cpp +++ b/src/REAXFF/reaxff_allocate.cpp @@ -253,8 +253,8 @@ namespace ReaxFF { if (Nflag || wsr->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { if (wsr->num_far > far_nbrs->num_intrs) - error->one(FLERR,fmt::format("step{}: ran out of space on far_nbrs: top={}, max={}", - data->step, wsr->num_far, far_nbrs->num_intrs)); + error->one(FLERR, "step{}: ran out of space on far_nbrs: top={}, max={}", + data->step, wsr->num_far, far_nbrs->num_intrs); newsize = static_cast (MAX(wsr->num_far*safezone, mincap*REAX_MIN_NBRS)); diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 630427b690..11933164eb 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -129,9 +129,11 @@ void NEB::command(int narg, char **arg) if (nevery <= 0) error->universe_all(FLERR, fmt::format("Illegal NEB command every parameter: {}", nevery)); if (n1steps % nevery) - error->all(FLERR, fmt::format("NEB N1 value {} incompatible with every {}", n1steps, nevery)); + error->universe_all(FLERR, fmt::format("NEB N1 value {} incompatible with every {}", + n1steps, nevery)); if (n2steps % nevery) - error->all(FLERR, fmt::format("NEB N2 value {} incompatible with every {}", n2steps, nevery)); + error->universe_all(FLERR, fmt::format("NEB N2 value {} incompatible with every {}", + n2steps, nevery)); // replica info diff --git a/src/REPLICA/temper_grem.cpp b/src/REPLICA/temper_grem.cpp index 303f502309..c4509791c3 100644 --- a/src/REPLICA/temper_grem.cpp +++ b/src/REPLICA/temper_grem.cpp @@ -97,7 +97,7 @@ void TemperGrem::command(int narg, char **arg) FixNH *nh = dynamic_cast(modify->get_fix_by_id(arg[4])); if (!nh) - error->all(FLERR,fmt::format("Fix {} for Nose-Hoover fix does not exist", arg[4])); + error->universe_all(FLERR,fmt::format("Fix {} for Nose-Hoover fix does not exist", arg[4])); // get result from nvt vs npt check from fix_grem diff --git a/src/lammps.cpp b/src/lammps.cpp index 5de2144146..6fc06521d1 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -530,7 +530,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : if (infile == nullptr) error->one(FLERR,"Cannot open input script {}: {}", arg[inflag], utils::getsyserror()); if (!helpflag) - utils::logmesg(this,fmt::format("LAMMPS ({}{})\n", version, update_string)); + utils::logmesg(this,"LAMMPS ({}{})\n", version, update_string); // warn against using I/O redirection in parallel runs if ((inflag == 0) && (universe->nprocs > 1)) @@ -626,8 +626,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : } if ((me == 0) && (!helpflag)) - utils::logmesg(this,fmt::format("LAMMPS ({})\nProcessor partition = {}\n", - version, universe->iworld)); + utils::logmesg(this,"LAMMPS ({})\nProcessor partition = {}\n", version, universe->iworld); } // check consistency of datatype settings in lmptype.h @@ -762,8 +761,7 @@ LAMMPS::~LAMMPS() noexcept(false) totalclock = (totalclock - seconds) / 60.0; int minutes = fmod(totalclock,60.0); int hours = (totalclock - minutes) / 60.0; - utils::logmesg(this,fmt::format("Total wall time: {}:{:02d}:{:02d}\n", - hours, minutes, seconds)); + utils::logmesg(this, "Total wall time: {}:{:02d}:{:02d}\n", hours, minutes, seconds); } if (universe->nworlds == 1) { diff --git a/src/read_data.cpp b/src/read_data.cpp index 4b4602f1fc..dcc0f7b46c 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -364,7 +364,7 @@ void ReadData::command(int narg, char **arg) // check if data file is available and readable if (!platform::file_is_readable(arg[0])) - error->all(FLERR, fmt::format("Cannot open file {}: {}", arg[0], utils::getsyserror())); + error->all(FLERR, "Cannot open file {}: {}", arg[0], utils::getsyserror()); // reset so we can warn about reset image flags exactly once per data file diff --git a/src/special.cpp b/src/special.cpp index 7e15ec9e80..5d9b2bb09e 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -62,12 +62,11 @@ void Special::build() if (me == 0) { const double * const special_lj = force->special_lj; const double * const special_coul = force->special_coul; - auto mesg = fmt::format("Finding 1-2 1-3 1-4 neighbors ...\n" - " special bond factors lj: {:<8} {:<8} {:<8}\n" - " special bond factors coul: {:<8} {:<8} {:<8}\n", - special_lj[1],special_lj[2],special_lj[3], - special_coul[1],special_coul[2],special_coul[3]); - utils::logmesg(lmp,mesg); + utils::logmesg(lmp, "Finding 1-2 1-3 1-4 neighbors ...\n" + " special bond factors lj: {:<8} {:<8} {:<8}\n" + " special bond factors coul: {:<8} {:<8} {:<8}\n", + special_lj[1],special_lj[2],special_lj[3], + special_coul[1],special_coul[2],special_coul[3]); } // set onefive_flag if special_bonds command set it @@ -162,7 +161,7 @@ void Special::build() if (onefive_flag) { onefive_build(); if (me == 0) - utils::logmesg(lmp,fmt::format("{:>6} = max # of 1-5 neighbors\n",maxall)); + utils::logmesg(lmp,"{:>6} = max # of 1-5 neighbors\n",maxall); } // finish processing the onetwo, onethree, onefour, onefive lists diff --git a/src/utils.cpp b/src/utils.cpp index dd18c4406d..992feb34e8 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -557,7 +557,7 @@ void utils::bounds(const char *file, int line, const std::string &str, // check for illegal charcters size_t found = str.find_first_not_of("*-0123456789"); if (found != std::string::npos) { - if (error) error->all(file, line, fmt::format("Invalid range string: {}", str)); + if (error) error->all(file, line, "Invalid range string: {}", str); return; } @@ -580,17 +580,14 @@ void utils::bounds(const char *file, int line, const std::string &str, if (error) { if ((nlo <= 0) || (nhi <= 0)) - error->all(file, line, fmt::format("Invalid range string: {}", str)); + error->all(file, line, "Invalid range string: {}", str); if (nlo < nmin) - error->all(file, line, fmt::format("Numeric index {} is out of bounds ({}-{})", - nlo, nmin, nmax)); + error->all(file, line, "Numeric index {} is out of bounds ({}-{})", nlo, nmin, nmax); else if (nhi > nmax) - error->all(file, line, fmt::format("Numeric index {} is out of bounds ({}-{})", - nhi, nmin, nmax)); + error->all(file, line, "Numeric index {} is out of bounds ({}-{})", nhi, nmin, nmax); else if (nlo > nhi) - error->all(file, line, fmt::format("Numeric index {} is out of bounds ({}-{})", - nlo, nmin, nhi)); + error->all(file, line, "Numeric index {} is out of bounds ({}-{})", nlo, nmin, nhi); } } From 18f48a5e7cb0d3ac4b75a6ce169d74502839964f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Sep 2023 18:00:19 -0400 Subject: [PATCH 116/417] Recognize Windows 11 23H2 --- src/platform.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/platform.cpp b/src/platform.cpp index 861e3d7722..b06090094b 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -239,6 +239,8 @@ std::string platform::os_info() buf = "Windows 11 21H2"; } else if (build == "22621") { buf = "Windows 11 22H2"; + } else if (build == "22631") { + buf = "Windows 11 23H2"; } else { const char *entry = "ProductName"; RegGetValue(HKEY_LOCAL_MACHINE, subkey, entry, RRF_RT_REG_SZ, nullptr, &value, From 6613af05dc47b526be4cbf2c8bb239151b4f3f83 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Sep 2023 14:31:19 -0400 Subject: [PATCH 117/417] fix spelling issue --- doc/src/Howto_lammps_gui.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index fb0c0e80d4..cdcc09db84 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -308,12 +308,12 @@ contents to a file. Context Specific Word Completion ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -By default, LAMMPS GUI will display a small popup frame with possible +By default, LAMMPS GUI will display a small pop-up frame with possible completions for LAMMPS input script commands or styles after 2 characters of a word have been typed. The word can then be completed through selecting an entry by scrolling down with the cursor keys and selecting with the 'Enter' key or by clicking on the entry with the -mouse. The automatic completion popup can be disabled in the +mouse. The automatic completion pop-up can be disabled in the ``Preferences`` dialog, but the completion can still be requested manually by either hitting the 'Shift-TAB' key or by right-clicking with the mouse and selecting the option from the context menu. Most of the @@ -576,7 +576,7 @@ the range between 1 and 32. The two settings which follow enable or disable the automatic reformatting when hitting the 'Enter' key and the automatic display of -the completion popup window. +the completion pop-up window. ----------- From b03e8e376a0c833f7bb97d4c34da3667dba52a92 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Sep 2023 14:31:32 -0400 Subject: [PATCH 118/417] make references consistent --- doc/src/Howto_lammps_gui.rst | 2 +- doc/src/Intro_nonfeatures.rst | 2 +- doc/src/Tools.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index cdcc09db84..4492a13915 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -16,7 +16,7 @@ adapted in multiple ways specifically for editing LAMMPS input files. Pre-compiled, ready-to-use LAMMPS GUI executables for Linux (Ubuntu 20.04LTS or later and compatible), macOS (version 11 aka Big Sur or later), and Windows (version 10 or later) :ref:`are available - ` for download. The executables are linked to + ` for download. The executables are linked to a current version of LAMMPS as well. The source code for the LAMMPS GUI is included in the ``tools/lammps-gui`` folder of the LAMMPS distribution and it can be compiled alongside LAMMPS with diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index 529bcbdf6d..ea12e8c0b5 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -26,7 +26,7 @@ Here are suggestions on how to perform these tasks: written in Python or C/C++ that run LAMMPS and visualize or plot its output. Examples of this are provided in the python directory and described on the :doc:`Python ` doc page. As of version - 2 August 2023 :ref:`a GUI tool ` is included in LAMMPS. + 2 August 2023 :ref:`a GUI tool ` is included in LAMMPS. Also, there are several external wrappers or GUI front ends. * **Builder:** Several pre-processing tools are packaged with LAMMPS. Some of them convert input files in formats produced by other MD codes diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index e9ae37a463..2e8bd3eac4 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -706,7 +706,7 @@ required. The LAMMPS GUI has been successfully compiled and tested on: - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.36, Qt version 5.15LTS - Windows 10 and 11 x86_64 with MinGW / GCC 10.0 cross-compiler on Fedora 38, Qt version 5.15LTS -.. _lammps-gui-install: +.. _lammps_gui_install: Pre-compiled executables From c24ddfed2953d6da08896e12408b24cdb501e513 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 16:45:13 -0400 Subject: [PATCH 119/417] add a run counter to log, chart, and slideshow window titles this counter is reset on loading a new file --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/lammpsgui.cpp | 32 ++++++++++++++++++-------------- tools/lammps-gui/lammpsgui.h | 1 + 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index f6d532f891..ec21f9fac2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.6 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.7 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index e95c41432c..d72a7457ab 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -63,7 +63,8 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), status(nullptr), logwindow(nullptr), imagewindow(nullptr), chartwindow(nullptr), slideshow(nullptr), logupdater(nullptr), dirstatus(nullptr), progress(nullptr), - prefdialog(nullptr), lammpsstatus(nullptr), varwindow(nullptr) + prefdialog(nullptr), lammpsstatus(nullptr), varwindow(nullptr), runner(nullptr), + is_running(false), run_counter(0) { // enforce using the plain ASCII C locale within the GUI. QLocale::setDefault(QLocale("C")); @@ -373,6 +374,7 @@ void LammpsGui::new_document() lammps.close(); lammpsstatus->hide(); setWindowTitle(QString("LAMMPS-GUI - *unknown*")); + run_counter = 0; } void LammpsGui::open() @@ -588,6 +590,7 @@ void LammpsGui::open_file(const QString &fileName) return; } setWindowTitle(QString("LAMMPS-GUI - " + current_file)); + run_counter = 0; QTextStream in(&file); QString text = in.readAll(); ui->textEdit->document()->setPlainText(text); @@ -862,7 +865,8 @@ void LammpsGui::logupdate() else slideshow->hide(); } else { - slideshow->setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + current_file); + slideshow->setWindowTitle( + QString("LAMMPS-GUI - Slide Show: %1 - Run %2").arg(current_file).arg(run_counter)); if (QSettings().value("viewslide", true).toBool()) slideshow->show(); } slideshow->add_image(imagefile); @@ -980,6 +984,7 @@ void LammpsGui::do_run(bool use_buffer) progress->setValue(0); dirstatus->hide(); progress->show(); + int nthreads = settings.value("nthreads", 1).toInt(); int accel = settings.value("accelerator", AcceleratorTab::None).toInt(); if ((accel != AcceleratorTab::OpenMP) && (accel != AcceleratorTab::Intel) && @@ -996,6 +1001,7 @@ void LammpsGui::do_run(bool use_buffer) runner = new LammpsRunner(this); is_running = true; + ++run_counter; if (use_buffer) { // always add final newline since the text edit widget does not do it char *input = mystrdup(ui->textEdit->toPlainText() + "\n"); @@ -1015,12 +1021,11 @@ void LammpsGui::do_run(bool use_buffer) logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); logwindow->moveCursor(QTextCursor::End); - if (use_buffer) - logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on buffer - " + - current_file); - else - logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on file - " + - current_file); + logwindow->setWindowTitle( + QString("LAMMPS-GUI - Output from running LAMMPS on %1 - %2 - Run %3") + .arg(use_buffer ? "buffer" : "file") + .arg(current_file) + .arg(run_counter)); logwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); QFont text_font; text_font.fromString(settings.value("textfont", text_font.toString()).toString()); @@ -1039,12 +1044,11 @@ void LammpsGui::do_run(bool use_buffer) // if configured, delete old log window before opening new one if (settings.value("chartreplace", false).toBool()) delete chartwindow; chartwindow = new ChartWindow(current_file); - if (use_buffer) - chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on buffer - " + - current_file); - else - chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on file - " + - current_file); + chartwindow->setWindowTitle( + QString("LAMMPS-GUI - Thermo charts from running LAMMPS on %1 - %2 - Run %3") + .arg(use_buffer ? "buffer" : "file") + .arg(current_file) + .arg(run_counter)); chartwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index 6d80b0aee6..0eab3a9705 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -126,6 +126,7 @@ private: LammpsRunner *runner; std::string plugin_path; bool is_running; + int run_counter; std::vector lammps_args; }; #endif // LAMMPSGUI_H From ef575d5944eedf01eb2cef162e2dc07e53ce9ba9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 16:47:52 -0400 Subject: [PATCH 120/417] change default for replacing log/chart/image windows to true --- tools/lammps-gui/lammpsgui.cpp | 6 +++--- tools/lammps-gui/preferences.cpp | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index d72a7457ab..08dec27c59 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1016,7 +1016,7 @@ void LammpsGui::do_run(bool use_buffer) runner->start(); // if configured, delete old log window before opening new one - if (settings.value("logreplace", false).toBool()) delete logwindow; + if (settings.value("logreplace", true).toBool()) delete logwindow; logwindow = new LogWindow(); logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); @@ -1042,7 +1042,7 @@ void LammpsGui::do_run(bool use_buffer) logwindow->hide(); // if configured, delete old log window before opening new one - if (settings.value("chartreplace", false).toBool()) delete chartwindow; + if (settings.value("chartreplace", true).toBool()) delete chartwindow; chartwindow = new ChartWindow(current_file); chartwindow->setWindowTitle( QString("LAMMPS-GUI - Thermo charts from running LAMMPS on %1 - %2 - Run %3") @@ -1107,7 +1107,7 @@ void LammpsGui::render_image() } } // if configured, delete old image window before opening new one - if (QSettings().value("imagereplace", false).toBool()) delete imagewindow; + if (QSettings().value("imagereplace", true).toBool()) delete imagewindow; imagewindow = new ImageViewer(current_file, &lammps); } else { QMessageBox::warning(this, "ImageViewer Error", diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index cae3783e4d..1e8e23ad62 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -216,16 +216,15 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa sldv->setCheckState(settings->value("viewslide", true).toBool() ? Qt::Checked : Qt::Unchecked); auto *logr = new QCheckBox("Replace log window on new run"); logr->setObjectName("logreplace"); - logr->setCheckState(settings->value("logreplace", false).toBool() ? Qt::Checked - : Qt::Unchecked); + logr->setCheckState(settings->value("logreplace", true).toBool() ? Qt::Checked : Qt::Unchecked); auto *imgr = new QCheckBox("Replace image window on new render"); imgr->setObjectName("imagereplace"); - imgr->setCheckState(settings->value("imagereplace", false).toBool() ? Qt::Checked - : Qt::Unchecked); + imgr->setCheckState(settings->value("imagereplace", true).toBool() ? Qt::Checked + : Qt::Unchecked); auto *pltr = new QCheckBox("Replace chart window on new run"); pltr->setObjectName("chartreplace"); - pltr->setCheckState(settings->value("chartreplace", false).toBool() ? Qt::Checked - : Qt::Unchecked); + pltr->setCheckState(settings->value("chartreplace", true).toBool() ? Qt::Checked + : Qt::Unchecked); #if defined(LAMMPS_GUI_USE_PLUGIN) auto *pluginlabel = new QLabel("Path to LAMMPS Shared Library File:"); From 5a750c8633142b1aa2ad65134d5c16df3f3a39f5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 17:42:30 -0400 Subject: [PATCH 121/417] automatically define variable "gui_run" to contain the run number --- tools/lammps-gui/codeeditor.cpp | 5 +++++ tools/lammps-gui/lammpsgui.cpp | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 4277ff4c90..46b970bd0a 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -417,6 +417,11 @@ void CodeEditor::setGroupList() void CodeEditor::setVarNameList() { QStringList vars; + + // variable "gui_run" is always defined by LAMMPS GUI + vars << QString("${gui_run}"); + vars << QString("v_gui_run"); + LammpsWrapper *lammps = &qobject_cast(parent())->lammps; int nvar = lammps->id_count("variable"); char buffer[200]; diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 08dec27c59..c7f41555b5 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1002,6 +1002,10 @@ void LammpsGui::do_run(bool use_buffer) runner = new LammpsRunner(this); is_running = true; ++run_counter; + + // define "gui_run" variable set to run_counter value + lammps.command("variable gui_run delete"); + lammps.command(std::string("variable gui_run index " + std::to_string(run_counter)).c_str()); if (use_buffer) { // always add final newline since the text edit widget does not do it char *input = mystrdup(ui->textEdit->toPlainText() + "\n"); From 1689c306b630c1e42d201e3c7458c5c1609805b3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 17:59:47 -0400 Subject: [PATCH 122/417] add "Save to File" option to the context dialog for the log window --- tools/lammps-gui/logwindow.cpp | 42 ++++++++++++++++++++++++++++++++++ tools/lammps-gui/logwindow.h | 4 ++++ 2 files changed, 46 insertions(+) diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 7091b34f43..4b008ce5ca 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -12,7 +12,17 @@ ------------------------------------------------------------------------- */ #include "logwindow.h" + +#include +#include +#include +#include +#include +#include +#include #include +#include +#include LogWindow::LogWindow(QWidget *parent) : QPlainTextEdit(parent) { @@ -30,6 +40,38 @@ void LogWindow::closeEvent(QCloseEvent *event) QPlainTextEdit::closeEvent(event); } +void LogWindow::save_as() +{ + QString fileName = QFileDialog::getSaveFileName(this, "Save Log to File"); + if (fileName.isEmpty()) return; + + QFileInfo path(fileName); + QFile file(path.absoluteFilePath()); + + if (!file.open(QIODevice::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString()); + return; + } + + QTextStream out(&file); + QString text = toPlainText(); + out << text; + if (text.back().toLatin1() != '\n') out << "\n"; // add final newline if missing + file.close(); +} + +void LogWindow::contextMenuEvent(QContextMenuEvent *event) +{ + // show augmented context menu + auto *menu = createStandardContextMenu(); + menu->addSeparator(); + auto action = menu->addAction(QString("Save Log to File ...")); + action->setIcon(QIcon(":/icons/document-save-as.png")); + connect(action, &QAction::triggered, this, &LogWindow::save_as); + menu->exec(event->globalPos()); + delete menu; +} + // Local Variables: // c-basic-offset: 4 // End: diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 8807ef5cee..4765b2faa7 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -22,8 +22,12 @@ class LogWindow : public QPlainTextEdit { public: LogWindow(QWidget *parent = nullptr); +private slots: + void save_as(); + protected: void closeEvent(QCloseEvent *event) override; + void contextMenuEvent(QContextMenuEvent *event) override; }; #endif From e7b9bc2d4fbbac36a001e547c19a378eb07e0269 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 29 Sep 2023 18:53:18 -0400 Subject: [PATCH 123/417] update docs --- doc/src/Howto_lammps_gui.rst | 50 ++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 4492a13915..0b5237d1f6 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -172,17 +172,19 @@ be seen in the command line window, as shown below. LAMMPS GUI captures the screen output as it is generated and updates the log window regularly during a run. -By default, there will be a new window for each run, so that it is -possible to visually compare outputs from different runs. It is also -possible to change the behavior of LAMMPS GUI in the preferences dialog -to *replace* an existing log window for a new run or to not show the log -window by default. It is also possible to show or hide the current log -window from the ``View`` menu. +By default, the log window will be replaced each time a run is started. +The runs are counted and the run number for the current run is displayed +in the window title. It is possible to change the behavior of LAMMPS +GUI in the preferences dialog to create a *new* log window for every run +or to not show the current log window. It is also possible to show or +hide the *current* log window from the ``View`` menu. The text in the log window is read-only and cannot be modified, but -editor commands to select and copy all or parts of the text can be used. -The "Select All" and "Copy" functions are also available via a context -menu by clicking with the right mouse button. +editor hotkeys to select and copy all or parts of the text can be used +to transfer text to another editor program. The "Select All" and "Copy" +functions, as well as a "Save Log to File" option are also available via +a context menu by clicking with the right mouse button into the log +window text area. Chart Window ------------ @@ -199,10 +201,16 @@ The drop down menu on the top right allows selection of different properties that are computed and written to thermo output. Only one property can be shown at a time. The plots will be updated with new data as the run progresses, so they can be used to visually monitor the -evolution of available properties. From the ``File`` menu on the top -left, it is possible to save an image of the currently displayed plot or -export the data in either plain text columns (for use by plotting tools -like `gnuplot `_ or `grace +evolution of available properties. The window title will show the +current run number that this chart window corresponds to. Same as +explained for the log window above, by default, the chart window will +be replaced on each new run, but the behavior can be changed in the +preferences dialog. + +From the ``File`` menu on the top left, it is possible to save an image +of the currently displayed plot or export the data in either plain text +columns (for use by plotting tools like `gnuplot +`_ or `grace `_), or as CSV data which can be imported for further processing with Microsoft Excel or `pandas `_ @@ -230,8 +238,7 @@ stepping through the sequence of images or playing an animation (as a continuous loop or once from first to last). It is also possible to zoom in or zoom out of the displayed images, and to export the slide show animation to a movie file, if `ffmpeg `_ is -installed. The slide show window will be closed when a new file is -loaded. +installed. Variable Info ------------- @@ -252,6 +259,17 @@ during a run. It will show "(none)" if there are no variables defined. Note that it is also possible to *set* :doc:`index style variables `, that would normally be set via command line flags, via the "Set Variables..." dialog from the ``Run`` menu. +LAMMPS GUI will automatically set the variable "gui_run" to the +current value of the run counter. That way it would be possible +to automatically record a log for each run attempt by using the +command + +.. code-block:: LAMMPS + + log logfile-${gui_run}.txt + +at the beginning of an input file. That would record logs to files +``logfile-1.txt``, ``logfile-2.txt``, and so on for successive runs. Viewing Snapshot Images ----------------------- @@ -518,7 +536,7 @@ General Settings: - *Replace image window on new render:* when checked, an existing chart window will be replaced when a new snapshot image is requested, otherwise each command will create a new image window. -- *Path to LAMMPS Shared Library File:* this options is only available +- *Path to LAMMPS Shared Library File:* this option is only visible when LAMMPS GUI was compiled to load the LAMMPS library at run time instead of being linked to it directly. With the ``Browse..`` button or by changing the text, a different shared library file with a From 77d0475fb7ba2910189612a30867cdb2bf29a85b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 1 Oct 2023 11:46:16 -0400 Subject: [PATCH 124/417] update TODO file --- tools/lammps-gui/TODO.md | 17 +++++++++++++++++ tools/lammps-gui/lammpsgui.cpp | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index 8f752ac43a..e4ca44ba3d 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -3,6 +3,23 @@ LAMMPS-GUI TODO list: # Short term goals (v1.x) - implement indenting regions for (nested) loops? +- implement data file manager GUI with the following features: + - import coordinates and topology via VMD molfile plugins + - import coordinates and topology from intermol + - import coordinates and topology from OpenBabel + - store data internally in a generalized YAML format + - add/remove columns to per-atom data + - change atom style for export to data file + - merge one system to another + - edit mapping between numeric and symbolic types. create labelmaps. + - import/export LAMMPS data and molecule files + - store coordinates internally as unwrapped coordinates + - recenter coordinates + - edit box boundaries + - readjust box to extent of atoms (with or without estimated radius) + - call to LAMMPS to create geometries from lattices (with/without molecule files) and STL files + - call to LAMMPS to generate visualizations of geometries + - edit force field parameters, e.g. apply charmm # Long term ideas (v2.x) - rewrite entire application to build the App and its layout manually diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index c7f41555b5..08851da4ca 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -176,7 +176,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : update_recents(); - // check if we have OVITO and VMD installed and deacivate actions if not + // check if we have OVITO and VMD installed and deactivate actions if not ui->actionView_in_OVITO->setEnabled(has_exe("ovito")); ui->actionView_in_OVITO->setData("ovito"); ui->actionView_in_VMD->setEnabled(has_exe("vmd")); From 5db01aa98921cc0ae9034c18775e62d3b026f460 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Oct 2023 18:19:27 -0400 Subject: [PATCH 125/417] BUGFIX: correctly render the currently selected chart when exporting to image files --- tools/lammps-gui/chartviewer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 34893b75e8..e6a58ec98d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -103,7 +103,10 @@ void ChartWindow::saveAs() QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as Image", defaultname, "Image Files (*.jpg *.png *.bmp *.ppm)"); if (!fileName.isEmpty()) { - charts[active_chart]->grab().save(fileName); + int choice = columns->currentData().toInt(); + for (auto &c : charts) { + if (choice == c->get_index()) c->grab().save(fileName); + } } } From 37c1bfafa3afd489fa2656add3e477627a08e4dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Oct 2023 18:30:47 -0400 Subject: [PATCH 126/417] remove unused class member --- tools/lammps-gui/chartviewer.cpp | 14 +++++--------- tools/lammps-gui/chartviewer.h | 1 - 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index e6a58ec98d..d018ffe32d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -22,8 +22,7 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename), - active_chart(-1) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename) { auto *top = new QHBoxLayout; menu->addMenu(file); @@ -74,7 +73,6 @@ void ChartWindow::reset_charts() } charts.clear(); columns->clear(); - active_chart = 0; } void ChartWindow::add_chart(const QString &title, int index) @@ -86,7 +84,6 @@ void ChartWindow::add_chart(const QString &title, int index) // hide all but the first chart added if (charts.size() > 0) chart->hide(); charts.append(chart); - active_chart = 0; } void ChartWindow::add_data(int step, double data, int index) @@ -97,22 +94,21 @@ void ChartWindow::add_data(int step, double data, int index) void ChartWindow::saveAs() { - if (charts.empty() || (active_chart < 0)) return; + if (charts.empty()) return; QString defaultname = filename + "." + columns->currentText() + ".png"; if (filename.isEmpty()) defaultname = columns->currentText() + ".png"; QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as Image", defaultname, "Image Files (*.jpg *.png *.bmp *.ppm)"); if (!fileName.isEmpty()) { int choice = columns->currentData().toInt(); - for (auto &c : charts) { + for (auto &c : charts) if (choice == c->get_index()) c->grab().save(fileName); - } } } void ChartWindow::exportDat() { - if (charts.empty() || (active_chart < 0)) return; + if (charts.empty()) return; QString defaultname = filename + ".dat"; if (filename.isEmpty()) defaultname = "lammpsdata.dat"; QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as Gnuplot data", defaultname, @@ -147,7 +143,7 @@ void ChartWindow::exportDat() void ChartWindow::exportCsv() { - if (charts.empty() || (active_chart < 0)) return; + if (charts.empty()) return; QString defaultname = filename + ".csv"; if (filename.isEmpty()) defaultname = "lammpsdata.csv"; QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as CSV data", defaultname, diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 22f52a82d6..cdbc05ad52 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -61,7 +61,6 @@ private: QAction *closeAct; QString filename; - int active_chart; QList charts; }; From b5dae4024af34b5749cacd990639cd54007698a5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 12:02:56 -0400 Subject: [PATCH 127/417] tweak output format for gnuplot data export --- tools/lammps-gui/chartviewer.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index d018ffe32d..a58aa8719b 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -116,25 +116,24 @@ void ChartWindow::exportDat() if (!fileName.isEmpty()) { QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + constexpr int fw = 16; + out.setFieldAlignment(QTextStream::AlignRight); + out.setRealNumberPrecision(8); - file.write("# Thermodynamic data from "); - file.write(filename.toLocal8Bit()); - file.write("\n# Columns:"); - for (auto &c : charts) { - file.write(" "); - file.write(c->get_title()); - } - file.write("\n"); + out << "# Thermodynamic data from " << filename << "\n"; + out << "# Step"; + for (auto &c : charts) + out << qSetFieldWidth(0) << ' ' << qSetFieldWidth(fw) << c->get_title(); + out << qSetFieldWidth(0) << '\n'; int lines = charts[0]->get_count(); for (int i = 0; i < lines; ++i) { // timestep - file.write(QString::number(charts[0]->get_step(i)).toLocal8Bit()); - for (auto &c : charts) { - file.write(" "); - file.write(QString::number(c->get_data(i)).toLocal8Bit()); - } - file.write("\n"); + out << qSetFieldWidth(0) << ' ' << qSetFieldWidth(fw) << charts[0]->get_step(i); + for (auto &c : charts) + out << qSetFieldWidth(0) << ' ' << qSetFieldWidth(fw) << c->get_data(i); + out << qSetFieldWidth(0) << '\n'; } file.close(); } From e840d422efb937ab2bef3db0de971149a0bde4e5 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 10:07:41 -0600 Subject: [PATCH 128/417] Use a_f to be consistent --- src/KOKKOS/pair_kokkos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 2c2a622791..6f48aa0266 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -138,9 +138,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; + a_f(i,0) = 0.0; + a_f(i,1) = 0.0; + a_f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { @@ -212,9 +212,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; + a_f(i,0) = 0.0; + a_f(i,1) = 0.0; + a_f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { From 367d0ac90518d751af2d872e9cde355c7cef7f22 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 10:07:52 -0600 Subject: [PATCH 129/417] Add support for FLUX --- src/KOKKOS/kokkos.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 91ea6d37ac..b611502f74 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -175,6 +175,14 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } + if ((str = getenv("FLUX_TASK_LOCAL_ID"))) { + if (ngpus > 0) { + int local_rank = atoi(str); + device = local_rank % ngpus; + if (device >= skip_gpu) device++; + set_flag = 1; + } + } if (ngpus > 1 && !set_flag) error->all(FLERR,"Could not determine local MPI rank for multiple " From 918705ce2fd1a3ac08b34a0f1b5db9a77ee540b4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 12:10:44 -0400 Subject: [PATCH 130/417] refactor CSV format output --- tools/lammps-gui/chartviewer.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index a58aa8719b..7dcb98e5be 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -150,23 +150,21 @@ void ChartWindow::exportCsv() if (!fileName.isEmpty()) { QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + out.setRealNumberPrecision(8); - file.write("Step"); - for (auto &c : charts) { - file.write(","); - file.write(c->get_title()); - } - file.write("\n"); + out << "Step"; + for (auto &c : charts) + out << ',' << c->get_title(); + out << '\n'; int lines = charts[0]->get_count(); for (int i = 0; i < lines; ++i) { // timestep - file.write(QString::number(charts[0]->get_step(i)).toLocal8Bit()); - for (auto &c : charts) { - file.write(","); - file.write(QString::number(c->get_data(i)).toLocal8Bit()); - } - file.write("\n"); + out << charts[0]->get_step(i); + for (auto &c : charts) + out << ',' << c->get_data(i); + out << '\n'; } file.close(); } From ff23da1c9725695cbe8f5429a6f213b96208cead Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 10:28:08 -0600 Subject: [PATCH 131/417] Switch order --- src/KOKKOS/kokkos.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index b611502f74..84a8f59dd0 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -137,13 +137,13 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) int set_flag = 0; char *str; - if ((str = getenv("SLURM_LOCALID"))) { + if (str = getenv("SLURM_LOCALID")) { int local_rank = atoi(str); device = local_rank % ngpus; if (device >= skip_gpu) device++; set_flag = 1; } - if ((str = getenv("MPT_LRANK"))) { + if (str = getenv("FLUX_TASK_LOCAL_ID")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -151,7 +151,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("MV2_COMM_WORLD_LOCAL_RANK"))) { + if (str = getenv("MPT_LRANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -159,7 +159,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("OMPI_COMM_WORLD_LOCAL_RANK"))) { + if (str = getenv("MV2_COMM_WORLD_LOCAL_RANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -167,7 +167,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("PMI_LOCAL_RANK"))) { + if (str = getenv("OMPI_COMM_WORLD_LOCAL_RANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -175,7 +175,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if ((str = getenv("FLUX_TASK_LOCAL_ID"))) { + if (str = getenv("PMI_LOCAL_RANK")) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; From c521d54f85c2aaef9e937cabbc19e60bb8154452 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 3 Oct 2023 10:58:22 -0600 Subject: [PATCH 132/417] Fix compile error --- src/KOKKOS/pair_kokkos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 6f48aa0266..da6bd11006 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -138,9 +138,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) = 0.0; - a_f(i,1) = 0.0; - a_f(i,2) = 0.0; + a_f(i,0) -= f(i,0); + a_f(i,1) -= f(i,1); + a_f(i,2) -= f(i,2); } for (int jj = 0; jj < jnum; jj++) { @@ -212,9 +212,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) = 0.0; - a_f(i,1) = 0.0; - a_f(i,2) = 0.0; + a_f(i,0) -= f(i,0); + a_f(i,1) -= f(i,1); + a_f(i,2) -= f(i,2); } for (int jj = 0; jj < jnum; jj++) { From f57e5d975c8e72e0a2a6e9c01cc2135ca4428ee0 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 3 Oct 2023 12:07:28 -0600 Subject: [PATCH 133/417] Fix harmless compiler warnings --- src/KOKKOS/pair_eam_alloy_kokkos.cpp | 4 ++-- src/KOKKOS/pair_eam_fs_kokkos.cpp | 4 ++-- src/KOKKOS/pair_eam_kokkos.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index 5cc6fa9443..0dfe56c365 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -1477,7 +1477,7 @@ void PairEAMAlloyKokkos::file2array_alloy() template template struct PairEAMAlloyKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { auto policy = Kokkos::RangePolicy(0,inum); return policy; @@ -1488,7 +1488,7 @@ struct PairEAMAlloyKokkos::policyInstance { template<> template struct PairEAMAlloyKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { static_assert(t_ffloat_2d_n7::static_extent(2) == 7, "Breaking assumption of spline dim for KernelAB and KernelC scratch caching"); diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index 8e895dfeac..58ff615c04 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -1487,7 +1487,7 @@ void PairEAMFSKokkos::file2array_fs() template template struct PairEAMFSKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { auto policy = Kokkos::RangePolicy(0,inum); return policy; @@ -1498,7 +1498,7 @@ struct PairEAMFSKokkos::policyInstance { template<> template struct PairEAMFSKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { static_assert(t_ffloat_2d_n7::static_extent(2) == 7, "Breaking assumption of spline dim for KernelAB and KernelC scratch caching"); diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index a3bc463bbf..864f736066 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -1162,7 +1162,7 @@ void PairEAMKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int & template template struct PairEAMKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { auto policy = Kokkos::RangePolicy(0,inum); return policy; @@ -1173,7 +1173,7 @@ struct PairEAMKokkos::policyInstance { template<> template struct PairEAMKokkos::policyInstance { - KOKKOS_INLINE_FUNCTION + static auto get(int inum) { static_assert(t_ffloat_2d_n7::static_extent(2) == 7, "Breaking assumption of spline dim for KernelAB and KernelC scratch caching"); From 4bbaebda16fe9fb1f26952230b19855124a1f368 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 3 Oct 2023 12:09:23 -0600 Subject: [PATCH 134/417] Revert ineffectual change --- src/KOKKOS/pair_kokkos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index da6bd11006..2c2a622791 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -138,9 +138,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) -= f(i,0); - a_f(i,1) -= f(i,1); - a_f(i,2) -= f(i,2); + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { @@ -212,9 +212,9 @@ struct PairComputeFunctor { F_FLOAT fztmp = 0.0; if (NEIGHFLAG == FULL) { - a_f(i,0) -= f(i,0); - a_f(i,1) -= f(i,1); - a_f(i,2) -= f(i,2); + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; } for (int jj = 0; jj < jnum; jj++) { From bb01afc498db52f531471d2379d565e34c73d40b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 14:15:23 -0400 Subject: [PATCH 135/417] provide default file name when writing log window text to file --- tools/lammps-gui/lammpsgui.cpp | 2 +- tools/lammps-gui/logwindow.cpp | 16 ++++++++++++---- tools/lammps-gui/logwindow.h | 5 ++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 08851da4ca..cdfb9ab850 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1021,7 +1021,7 @@ void LammpsGui::do_run(bool use_buffer) // if configured, delete old log window before opening new one if (settings.value("logreplace", true).toBool()) delete logwindow; - logwindow = new LogWindow(); + logwindow = new LogWindow(current_file); logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); logwindow->moveCursor(QTextCursor::End); diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 4b008ce5ca..9667950be5 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -18,13 +18,15 @@ #include #include #include +#include #include #include #include #include #include -LogWindow::LogWindow(QWidget *parent) : QPlainTextEdit(parent) +LogWindow::LogWindow(const QString &_filename, QWidget *parent) : + QPlainTextEdit(parent), filename(_filename) { QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); @@ -42,10 +44,13 @@ void LogWindow::closeEvent(QCloseEvent *event) void LogWindow::save_as() { - QString fileName = QFileDialog::getSaveFileName(this, "Save Log to File"); - if (fileName.isEmpty()) return; + QString defaultname = filename + ".log"; + if (filename.isEmpty()) defaultname = "lammps.log"; + QString logFileName = QFileDialog::getSaveFileName(this, "Save Log to File", defaultname, + "Log files (*.log *.out *.txt)"); + if (logFileName.isEmpty()) return; - QFileInfo path(fileName); + QFileInfo path(logFileName); QFile file(path.absoluteFilePath()); if (!file.open(QIODevice::WriteOnly | QFile::Text)) { @@ -68,6 +73,9 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) auto action = menu->addAction(QString("Save Log to File ...")); action->setIcon(QIcon(":/icons/document-save-as.png")); connect(action, &QAction::triggered, this, &LogWindow::save_as); + action = menu->addAction("&Close Window", this, &QWidget::close); + action->setIcon(QIcon(":/icons/window-close.png")); + action->setShortcut(QKeySequence::fromString("Ctrl+W")); menu->exec(event->globalPos()); delete menu; } diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 4765b2faa7..5f43850655 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -20,7 +20,7 @@ class LogWindow : public QPlainTextEdit { Q_OBJECT public: - LogWindow(QWidget *parent = nullptr); + LogWindow(const QString &filename, QWidget *parent = nullptr); private slots: void save_as(); @@ -28,6 +28,9 @@ private slots: protected: void closeEvent(QCloseEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; + +private: + QString filename; }; #endif From 5302e39f69c3606bf5646eff23ab46847b6a3156 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 14:35:48 -0400 Subject: [PATCH 136/417] avoid segfaults when accessing lammps_last_thermo() --- src/library.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index f89fdaebf0..7b0d8ef91b 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -858,14 +858,17 @@ void *lammps_last_thermo(void *handle, const char *what, int index) { auto lmp = (LAMMPS *) handle; void *val = nullptr; + + if (!lmp->output) return val; Thermo *th = lmp->output->thermo; - if (!th) return nullptr; + if (!th) return val; const int nfield = *th->get_nfield(); BEGIN_CAPTURE { if (strcmp(what, "setup") == 0) { - val = (void *) &lmp->update->setupflag; + if (lmp->update) + val = (void *) &lmp->update->setupflag; } else if (strcmp(what, "line") == 0) { val = (void *) th->get_line(); From 18a69873f89fd5474684a2fd2b8b355e1d23e569 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 15:23:52 -0400 Subject: [PATCH 137/417] add keyboard shortcut for saving log to file --- tools/lammps-gui/logwindow.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 9667950be5..7a4d215317 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,9 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : { QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); + + auto action = new QShortcut(QKeySequence("Ctrl+S"), this); + connect(action, &QShortcut::activated, this, &LogWindow::save_as); } void LogWindow::closeEvent(QCloseEvent *event) @@ -47,7 +51,7 @@ void LogWindow::save_as() QString defaultname = filename + ".log"; if (filename.isEmpty()) defaultname = "lammps.log"; QString logFileName = QFileDialog::getSaveFileName(this, "Save Log to File", defaultname, - "Log files (*.log *.out *.txt)"); + "Log files (*.log *.out *.txt)"); if (logFileName.isEmpty()) return; QFileInfo path(logFileName); @@ -72,6 +76,7 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) menu->addSeparator(); auto action = menu->addAction(QString("Save Log to File ...")); action->setIcon(QIcon(":/icons/document-save-as.png")); + action->setShortcut(QKeySequence::fromString("Ctrl+S")); connect(action, &QAction::triggered, this, &LogWindow::save_as); action = menu->addAction("&Close Window", this, &QWidget::close); action->setIcon(QIcon(":/icons/window-close.png")); From 6da8fff08c68f4f21e329751ce184fe3d515aede Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 13:35:50 -0600 Subject: [PATCH 138/417] Fix bug with dynamic groups --- src/KOKKOS/modify_kokkos.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/KOKKOS/modify_kokkos.cpp b/src/KOKKOS/modify_kokkos.cpp index 0b81a1cabb..8d8ffca671 100644 --- a/src/KOKKOS/modify_kokkos.cpp +++ b/src/KOKKOS/modify_kokkos.cpp @@ -362,6 +362,17 @@ void ModifyKokkos::pre_reverse(int eflag, int vflag) void ModifyKokkos::post_force(int vflag) { + for (int i = 0; i < n_post_force_group; i++) { + atomKK->sync(fix[list_post_force_group[i]]->execution_space, + fix[list_post_force_group[i]]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[list_post_force_group[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_post_force_group[i]]->post_force(vflag); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[list_post_force_group[i]]->execution_space, + fix[list_post_force_group[i]]->datamask_modify); + } + for (int i = 0; i < n_post_force; i++) { atomKK->sync(fix[list_post_force[i]]->execution_space, fix[list_post_force[i]]->datamask_read); From 75050b8920842e5ac451d42972a99ab05b87ec01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 15:40:06 -0400 Subject: [PATCH 139/417] get upper thread limit from Qt so we can raise the number of threads --- tools/lammps-gui/preferences.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 1e8e23ad62..624f59009c 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #if defined(_OPENMP) #include @@ -400,11 +401,11 @@ AcceleratorTab::AcceleratorTab(QSettings *_settings, LammpsWrapper *_lammps, QWi int maxthreads = 1; #if defined(_OPENMP) - maxthreads = omp_get_max_threads(); + maxthreads = QThread::idealThreadCount(); #endif auto *choices = new QFrame; auto *choiceLayout = new QVBoxLayout; - auto *ntlabel = new QLabel("Number of threads:"); + auto *ntlabel = new QLabel(QString("Number of threads (max %1):").arg(maxthreads)); auto *ntchoice = new QLineEdit(settings->value("nthreads", maxthreads).toString()); auto *intval = new QIntValidator(1, maxthreads, this); ntchoice->setValidator(intval); From 6a43ca8410ba995fd9fbe5baff495bff9f53e314 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 16:13:59 -0400 Subject: [PATCH 140/417] reset number of threads to 1 when using no accelerator or opt --- tools/lammps-gui/lammpsgui.cpp | 2 ++ tools/lammps-gui/preferences.cpp | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index cdfb9ab850..73ff530b5c 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -508,6 +508,8 @@ void LammpsGui::update_variables() for (const auto &line : doc) { + if (line.isEmpty()) continue; + // first find variable definitions. // index variables are special since they can be overridden from the command line auto index = indexvar.match(line); diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 624f59009c..aa192e8c11 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -40,8 +40,8 @@ #include #include #include -#include #include +#include #if defined(_OPENMP) #include @@ -110,10 +110,15 @@ void Preferences::accept() } } - // store number of threads + // store number of threads, reset to 1 for "None" and "Opt" settings QLineEdit *field = tabWidget->findChild("nthreads"); - if (field) - if (field->hasAcceptableInput()) settings->setValue("nthreads", field->text()); + if (field) { + int accel = settings->value("accelerator", AcceleratorTab::None).toInt(); + if ((accel == AcceleratorTab::None) || (accel == AcceleratorTab::Opt)) + settings->setValue("nthreads", 1); + else if (field->hasAcceptableInput()) + settings->setValue("nthreads", field->text()); + } // store image width, height, zoom, and rendering settings From f9f33ce1b6a25df18b7c1613727771ee16e8fb97 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Oct 2023 15:41:35 -0600 Subject: [PATCH 141/417] Fix issues with Kokkos fix property/atom --- src/KOKKOS/fix_property_atom_kokkos.cpp | 40 ++++++++++++++++++++----- src/KOKKOS/fix_property_atom_kokkos.h | 1 + 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp index 1de07b39dc..87325accda 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.cpp +++ b/src/KOKKOS/fix_property_atom_kokkos.cpp @@ -33,6 +33,30 @@ FixPropertyAtomKokkos::FixPropertyAtomKokkos(LAMMPS *lmp, int narg, char **arg) grow_arrays(atom->nmax); } +/* ---------------------------------------------------------------------- */ + +FixPropertyAtomKokkos::~FixPropertyAtomKokkos() +{ + // deallocate per-atom vectors in Atom class + // set ptrs to a null pointer, so they no longer exist for Atom class + + for (int nv = 0; nv < nvalue; nv++) { + if (styles[nv] == MOLECULE) { + atom->molecule_flag = 0; + memoryKK->destroy_kokkos(atomKK->k_molecule,atom->molecule); + atom->molecule = nullptr; + } else if (styles[nv] == CHARGE) { + atom->q_flag = 0; + memoryKK->destroy_kokkos(atomKK->k_q,atom->q); + atom->q = nullptr; + } else if (styles[nv] == RMASS) { + atom->rmass_flag = 0; + memoryKK->destroy_kokkos(atomKK->k_rmass,atom->rmass); + atom->rmass = nullptr; + } + } +} + /* ---------------------------------------------------------------------- allocate atom-based arrays initialize new values to 0, @@ -44,17 +68,19 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) { for (int nv = 0; nv < nvalue; nv++) { if (styles[nv] == MOLECULE) { - memory->grow(atom->molecule,nmax,"atom:molecule"); + atomKK->sync(Device,MOLECULE_MASK); + memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); size_t nbytes = (nmax-nmax_old) * sizeof(tagint); - memset(&atom->molecule[nmax_old],0,nbytes); + atomKK->modified(Device,MOLECULE_MASK); } else if (styles[nv] == CHARGE) { - memory->grow(atom->q,nmax,"atom:q"); + atomKK->sync(Device,Q_MASK); + memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); size_t nbytes = (nmax-nmax_old) * sizeof(double); - memset(&atom->q[nmax_old],0,nbytes); + atomKK->modified(Device,Q_MASK); } else if (styles[nv] == RMASS) { - memory->grow(atom->rmass,nmax,"atom:rmass"); - size_t nbytes = (nmax-nmax_old) * sizeof(double); - memset(&atom->rmass[nmax_old],0,nbytes); + atomKK->sync(Device,MOLECULE_MASK); + memoryKK->grow_kokkos(atomKK->k_rmass,atomKK->rmass,nmax,"atom:rmass"); + atomKK->modified(Device,RMASS_MASK); } else if (styles[nv] == TEMPERATURE) { memory->grow(atom->temperature, nmax, "atom:temperature"); size_t nbytes = (nmax - nmax_old) * sizeof(double); diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h index 90eddc98e0..29b07b1f5b 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.h +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -28,6 +28,7 @@ namespace LAMMPS_NS { class FixPropertyAtomKokkos : public FixPropertyAtom { public: FixPropertyAtomKokkos(class LAMMPS *, int, char **); + ~FixPropertyAtomKokkos() override; void grow_arrays(int) override; }; From b3008e332998d4629f7f4c09b778a8b7b15aba53 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 17:49:44 -0400 Subject: [PATCH 142/417] fix delete / delete[] mismatch --- tools/lammps-gui/lammpsgui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 73ff530b5c..6995023593 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1422,7 +1422,7 @@ void LammpsGui::start_lammps() // delete additional arguments again (3 were there initially while ((int)lammps_args.size() > initial_narg) { - delete lammps_args.back(); + delete[] lammps_args.back(); lammps_args.pop_back(); } From 02b9bdd639f24f5b993a896065468fa620032323 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 17:49:55 -0400 Subject: [PATCH 143/417] fix uninitialized data access --- src/thermo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/thermo.cpp b/src/thermo.cpp index 009c9cdf27..1c4e25dcb0 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -111,6 +111,7 @@ Thermo::Thermo(LAMMPS *_lmp, int narg, char **arg) : lostflag = lostbond = Thermo::ERROR; lostbefore = warnbefore = 0; flushflag = 0; + firststep = 0; ntimestep = -1; nline = -1; image_fname.clear(); From 6ff7050d2d3b7718612657bb7fe7c04b30fb40e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 19:38:22 -0400 Subject: [PATCH 144/417] enforce that the number of threads is properly reset for /omp styles --- src/OPENMP/thr_omp.cpp | 7 +++++++ tools/lammps-gui/lammpsgui.cpp | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/OPENMP/thr_omp.cpp b/src/OPENMP/thr_omp.cpp index c27a99028d..88344a900d 100644 --- a/src/OPENMP/thr_omp.cpp +++ b/src/OPENMP/thr_omp.cpp @@ -34,6 +34,10 @@ #include +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; using MathConst::THIRD; @@ -44,6 +48,9 @@ ThrOMP::ThrOMP(LAMMPS *ptr, int style) : lmp(ptr), fix(nullptr), thr_style(style // register fix omp with this class fix = static_cast(lmp->modify->get_fix_by_id("package_omp")); if (!fix) lmp->error->all(FLERR, "The 'package omp' command is required for /omp styles"); +#if defined(_OPENMP) + omp_set_num_threads(lmp->comm->nthreads); +#endif } // clang-format off diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 6995023593..b6b590e855 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1329,9 +1329,9 @@ void LammpsGui::preferences() // must delete LAMMPS instance after preferences have changed that require // using different command line flags when creating the LAMMPS instance like // suffixes or package commands + int newthreads = settings.value("nthreads", 1).toInt(); if ((oldaccel != settings.value("accelerator", AcceleratorTab::None).toInt()) || - (oldthreads != settings.value("nthreads", 1).toInt()) || - (oldecho != settings.value("echo", false).toBool()) || + (oldthreads != newthreads) || (oldecho != settings.value("echo", false).toBool()) || (oldcite != settings.value("cite", false).toBool())) { if (lammps.is_running()) { stop_run(); @@ -1340,6 +1340,10 @@ void LammpsGui::preferences() } lammps.close(); lammpsstatus->hide(); +#if defined(_OPENMP) + qputenv("OMP_NUM_THREADS", std::to_string(newthreads).c_str()); + omp_set_num_threads(newthreads); +#endif } if (imagewindow) imagewindow->createImage(); settings.beginGroup("reformat"); From a3c843f5901044795adecb2254c47d0079aea283 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 21:13:06 -0400 Subject: [PATCH 145/417] add support for shortcuts CTRL-/ (stop run) and CTRL-Q (quit) to most windows --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/chartviewer.cpp | 24 ++++++++++++++++++++++++ tools/lammps-gui/chartviewer.h | 9 +++++---- tools/lammps-gui/imageviewer.cpp | 24 +++++++++++++++++------- tools/lammps-gui/imageviewer.h | 1 + tools/lammps-gui/lammpsgui.h | 6 ++++-- tools/lammps-gui/logwindow.cpp | 25 ++++++++++++++++++++++++- tools/lammps-gui/logwindow.h | 2 ++ tools/lammps-gui/slideshow.cpp | 26 ++++++++++++++++++++++++-- tools/lammps-gui/slideshow.h | 2 ++ 10 files changed, 104 insertions(+), 17 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index ec21f9fac2..be7bcff10a 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.7 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.8 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 7dcb98e5be..94d938c473 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -13,6 +13,8 @@ #include "chartviewer.h" +#include "lammpsgui.h" + #include #include #include @@ -40,8 +42,14 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : exportDatAct = file->addAction("Export data to &Gnuplot...", this, &ChartWindow::exportDat); exportDatAct->setIcon(QIcon(":/icons/application-plot.png")); file->addSeparator(); + stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); + stopAct->setIcon(QIcon(":/icons/process-stop.png")); + stopAct->setShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL)); closeAct = file->addAction("&Close", this, &QWidget::close); closeAct->setIcon(QIcon(":/icons/window-close.png")); + quitAct = file->addAction("&Quit", this, &ChartWindow::quit); + quitAct->setIcon(QIcon(":/icons/application-exit.png")); + quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); auto *layout = new QVBoxLayout; layout->addLayout(top); setLayout(layout); @@ -92,6 +100,22 @@ void ChartWindow::add_data(int step, double data, int index) if (c->get_index() == index) c->add_data(step, data); } +void ChartWindow::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + +void ChartWindow::stop_run() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->stop_run(); +} + void ChartWindow::saveAs() { if (charts.empty()) return; diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index cdbc05ad52..ffdb75cf7e 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -42,6 +42,9 @@ public: void add_data(int step, double data, int index); private slots: + void quit(); + void stop_run(); + void saveAs(); void exportDat(); void exportCsv(); @@ -55,10 +58,8 @@ private: QMenuBar *menu; QMenu *file; QComboBox *columns; - QAction *saveAsAct; - QAction *exportCsvAct; - QAction *exportDatAct; - QAction *closeAct; + QAction *saveAsAct, *exportCsvAct, *exportDatAct; + QAction *closeAct, *stopAct, *quitAct; QString filename; QList charts; diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index b73f8a4927..445ff16590 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -12,9 +12,12 @@ ------------------------------------------------------------------------- */ #include "imageviewer.h" + +#include "lammpsgui.h" #include "lammpswrapper.h" #include +#include #include #include #include @@ -510,15 +513,11 @@ void ImageViewer::createImage() QImageReader reader(dumpfile.fileName()); reader.setAutoTransform(true); const QImage newImage = reader.read(); - - if (newImage.isNull()) { - QMessageBox::warning( - this, QGuiApplication::applicationDisplayName(), - QString("Cannot load %1: %2").arg(dumpfile.fileName(), reader.errorString())); - return; - } dumpfile.remove(); + // read of new image failed. Don't try to scale and load it. + if (newImage.isNull()) return; + // scale back to achieve antialiasing image = newImage.scaled(xsize, ysize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); imageLabel->setPixmap(QPixmap::fromImage(image)); @@ -536,6 +535,14 @@ void ImageViewer::saveAs() void ImageViewer::copy() {} +void ImageViewer::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + void ImageViewer::saveFile(const QString &fileName) { if (!fileName.isEmpty()) image.save(fileName); @@ -557,6 +564,9 @@ void ImageViewer::createActions() QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); exitAct->setIcon(QIcon(":/icons/window-close.png")); exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + QAction *quitAct = fileMenu->addAction("&Quit", this, &ImageViewer::quit); + quitAct->setIcon(QIcon(":/icons/application-exit.png")); + quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); } void ImageViewer::updateActions() diff --git a/tools/lammps-gui/imageviewer.h b/tools/lammps-gui/imageviewer.h index 013a90249f..8946c6cc8b 100644 --- a/tools/lammps-gui/imageviewer.h +++ b/tools/lammps-gui/imageviewer.h @@ -40,6 +40,7 @@ public: private slots: void saveAs(); void copy(); + void quit(); void edit_size(); void reset_view(); diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index 0eab3a9705..0c622f0285 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -66,6 +66,10 @@ protected: void start_lammps(); void run_done(); +public slots: + void quit(); + void stop_run(); + private slots: void new_document(); void open(); @@ -73,7 +77,6 @@ private slots: void start_exe(); void save(); void save_as(); - void quit(); void copy(); void cut(); void paste(); @@ -82,7 +85,6 @@ private slots: void run_buffer() { do_run(true); } void run_file() { do_run(false); } - void stop_run(); void edit_variables(); void render_image(); void view_slides(); diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 7a4d215317..ab1886f1bd 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -13,7 +13,10 @@ #include "logwindow.h" +#include "lammpsgui.h" + #include +#include #include #include #include @@ -32,8 +35,12 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); - auto action = new QShortcut(QKeySequence("Ctrl+S"), this); + auto action = new QShortcut(QKeySequence::fromString("Ctrl+S"), this); connect(action, &QShortcut::activated, this, &LogWindow::save_as); + action = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + connect(action, &QShortcut::activated, this, &LogWindow::quit); + action = new QShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL), this); + connect(action, &QShortcut::activated, this, &LogWindow::stop_run); } void LogWindow::closeEvent(QCloseEvent *event) @@ -46,6 +53,22 @@ void LogWindow::closeEvent(QCloseEvent *event) QPlainTextEdit::closeEvent(event); } +void LogWindow::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + +void LogWindow::stop_run() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->stop_run(); +} + void LogWindow::save_as() { QString defaultname = filename + ".log"; diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 5f43850655..8923e35ee5 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -23,7 +23,9 @@ public: LogWindow(const QString &filename, QWidget *parent = nullptr); private slots: + void quit(); void save_as(); + void stop_run(); protected: void closeEvent(QCloseEvent *event) override; diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index 68544040e6..de7742f22f 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -14,7 +14,9 @@ #include "slideshow.h" #include "helpers.h" +#include "lammpsgui.h" +#include #include #include #include @@ -48,8 +50,12 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : imageName->setAlignment(Qt::AlignCenter); imageName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - auto *shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this); - QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::close); + auto *shortcut = new QShortcut(QKeySequence::fromString("Ctrl+W"), this); + QObject::connect(shortcut, &QShortcut::activated, this, &QWidget::close); + shortcut = new QShortcut(QKeySequence::fromString("Ctrl+/"), this); + QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::stop_run); + shortcut = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::quit); buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); @@ -190,6 +196,22 @@ void SlideShow::loadImage(int idx) } while (idx >= 0); } +void SlideShow::quit() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->quit(); +} + +void SlideShow::stop_run() +{ + LammpsGui *main; + for (QWidget *widget : QApplication::topLevelWidgets()) + if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); + main->stop_run(); +} + void SlideShow::movie() { QString fileName = QFileDialog::getSaveFileName(this, "Export to Movie File", ".", diff --git a/tools/lammps-gui/slideshow.h b/tools/lammps-gui/slideshow.h index 176bb9f030..1b5e977643 100644 --- a/tools/lammps-gui/slideshow.h +++ b/tools/lammps-gui/slideshow.h @@ -32,6 +32,8 @@ public: void clear(); private slots: + void quit(); + void stop_run(); void movie(); void first(); void last(); From ed631ecd44cd03cc2e931648047c0dff63c1d380 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Oct 2023 22:36:00 -0400 Subject: [PATCH 146/417] add button to reset zoom/pan of chart viewer --- tools/lammps-gui/chartviewer.cpp | 40 +++++++++++++++++++++++++++++++- tools/lammps-gui/chartviewer.h | 3 +++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index 94d938c473..d79f0b2748 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -30,9 +31,17 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : menu->addMenu(file); menu->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + // workaround for incorrect highlight bug on macOS + auto *dummy = new QPushButton(QIcon(), ""); + dummy->hide(); + auto *normal = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); + normal->setToolTip("Reset zoom to normal"); + columns = new QComboBox; top->addWidget(menu); top->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + top->addWidget(dummy); + top->addWidget(normal); top->addWidget(new QLabel("Select data:")); top->addWidget(columns); saveAsAct = file->addAction("&Save Graph As...", this, &ChartWindow::saveAs); @@ -44,9 +53,10 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : file->addSeparator(); stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); stopAct->setIcon(QIcon(":/icons/process-stop.png")); - stopAct->setShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL)); + stopAct->setShortcut(QKeySequence::fromString("Ctrl+/")); closeAct = file->addAction("&Close", this, &QWidget::close); closeAct->setIcon(QIcon(":/icons/window-close.png")); + closeAct->setShortcut(QKeySequence::fromString("Ctrl+W")); quitAct = file->addAction("&Quit", this, &ChartWindow::quit); quitAct->setIcon(QIcon(":/icons/application-exit.png")); quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); @@ -54,6 +64,8 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : layout->addLayout(top); setLayout(layout); + connect(normal, &QPushButton::released, this, &ChartWindow::reset_zoom); + connect(columns, SIGNAL(currentIndexChanged(int)), this, SLOT(change_chart(int))); QSettings settings; resize(settings.value("chartx", 500).toInt(), settings.value("charty", 320).toInt()); @@ -108,6 +120,12 @@ void ChartWindow::quit() main->quit(); } +void ChartWindow::reset_zoom() +{ + int choice = columns->currentData().toInt(); + charts[choice]->reset_zoom(); +} + void ChartWindow::stop_run() { LammpsGui *main; @@ -266,6 +284,26 @@ void ChartViewer::add_data(int step, double data) } } +/* -------------------------------------------------------------------- */ + +void ChartViewer::reset_zoom() +{ + auto points = series->pointsVector(); + + qreal xmin = 1.0e100; + qreal xmax = -1.0e100; + qreal ymin = 1.0e100; + qreal ymax = -1.0e100; + for (auto &p : points) { + xmin = qMin(xmin, p.x()); + xmax = qMax(xmax, p.x()); + ymin = qMin(ymin, p.y()); + ymax = qMax(ymax, p.y()); + } + xaxis->setRange(xmin, xmax); + yaxis->setRange(ymin, ymax); +} + // Local Variables: // c-basic-offset: 4 // End: diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index ffdb75cf7e..60a9cfba79 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -43,6 +43,7 @@ public: private slots: void quit(); + void reset_zoom(); void stop_run(); void saveAs(); @@ -74,6 +75,8 @@ public: explicit ChartViewer(const QString &title, int index, QWidget *parent = nullptr); void add_data(int step, double data); + void reset_zoom(); + int get_index() const { return index; }; int get_count() const { return series->count(); } const char *get_title() const { return series->name().toLocal8Bit(); } From 8af3aef734dd70c8a67b6d096fcf5df10edfed15 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Wed, 4 Oct 2023 10:04:45 +0300 Subject: [PATCH 147/417] Fixes #3925 in region_ellipsoid.cpp --- src/region_ellipsoid.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/region_ellipsoid.cpp b/src/region_ellipsoid.cpp index 3520b55813..0296178648 100644 --- a/src/region_ellipsoid.cpp +++ b/src/region_ellipsoid.cpp @@ -190,8 +190,8 @@ int RegEllipsoid::surface_interior(double *x, double cutoff) double b_r = b - cutoff; double c_r = c - cutoff; double delx_r = b_r * c_r * (x[0] - xc); - double dely_r = a_r * c_r * (x[1] - xc); - double delz_r = a_r * b_r * (x[2] - xc); + double dely_r = a_r * c_r * (x[1] - yc); + double delz_r = a_r * b_r * (x[2] - zc); double r_r = delx_r * delx_r + dely_r * dely_r + delz_r * delz_r; double rc_r = a_r * a_r * b_r * b_r * c_r * c_r; @@ -217,9 +217,9 @@ int RegEllipsoid::surface_interior(double *x, double cutoff) contact[0].r = DistancePointEllipsoid( axes[sorting[2]], axes[sorting[1]], axes[sorting[0]], coords[sorting[2]], coords[sorting[1]], coords[sorting[0]], x0[sorting[2]], x0[sorting[1]], x0[sorting[0]]); - contact[0].delx = x[0] - (copysign(x0[sorting[2]], x[0] - xc) + xc); - contact[0].dely = x[1] - (copysign(x0[sorting[1]], x[1] - yc) + yc); - contact[0].delz = x[2] - (copysign(x0[sorting[0]], x[2] - zc) + zc); + contact[0].delx = x[0] - (copysign(x0[0], x[0] - xc) + xc); + contact[0].dely = x[1] - (copysign(x0[1], x[1] - yc) + yc); + contact[0].delz = x[2] - (copysign(x0[2], x[2] - zc) + zc); // contact[0].radius = -radius; contact[0].iwall = 0; contact[0].varflag = 1; @@ -236,7 +236,7 @@ int RegEllipsoid::surface_interior(double *x, double cutoff) double a_r = a - cutoff; double b_r = b - cutoff; double delx_r = b_r * (x[0] - xc); - double dely_r = a_r * (x[1] - xc); + double dely_r = a_r * (x[1] - yc); double r_r = delx_r * delx_r + dely_r * dely_r; double rc_r = a_r * a_r * b_r * b_r; @@ -281,8 +281,8 @@ int RegEllipsoid::surface_exterior(double *x, double cutoff) double b_r = b + cutoff; double c_r = c + cutoff; double delx_r = b_r * c_r * (x[0] - xc); - double dely_r = a_r * c_r * (x[1] - xc); - double delz_r = a_r * b_r * (x[2] - xc); + double dely_r = a_r * c_r * (x[1] - yc); + double delz_r = a_r * b_r * (x[2] - zc); double r_r = delx_r * delx_r + dely_r * dely_r + delz_r * delz_r; double rc_r = a_r * a_r * b_r * b_r * c_r * c_r; @@ -308,9 +308,9 @@ int RegEllipsoid::surface_exterior(double *x, double cutoff) contact[0].r = DistancePointEllipsoid( axes[sorting[2]], axes[sorting[1]], axes[sorting[0]], coords[sorting[2]], coords[sorting[1]], coords[sorting[0]], x0[sorting[2]], x0[sorting[1]], x0[sorting[0]]); - contact[0].delx = x[0] - (copysign(x0[sorting[2]], x[0] - xc) + xc); - contact[0].dely = x[1] - (copysign(x0[sorting[1]], x[1] - yc) + yc); - contact[0].delz = x[2] - (copysign(x0[sorting[0]], x[2] - zc) + zc); + contact[0].delx = x[0] - (copysign(x0[0], x[0] - xc) + xc); + contact[0].dely = x[1] - (copysign(x0[1], x[1] - yc) + yc); + contact[0].delz = x[2] - (copysign(x0[2], x[2] - zc) + zc); // contact[0].radius = radius; contact[0].iwall = 0; contact[0].varflag = 1; @@ -327,7 +327,7 @@ int RegEllipsoid::surface_exterior(double *x, double cutoff) double a_r = a + cutoff; double b_r = b + cutoff; double delx_r = b_r * (x[0] - xc); - double dely_r = a_r * (x[1] - xc); + double dely_r = a_r * (x[1] - yc); double r_r = delx_r * delx_r + dely_r * dely_r; double rc_r = a_r * a_r * b_r * b_r; From 35640dd72ec226e9d8b8cea5f5291c9e40efb3f9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 06:29:39 -0400 Subject: [PATCH 148/417] use event filter to bypass default shortcuts that conflict with our custom ones --- tools/lammps-gui/chartviewer.cpp | 23 ++++++++++++++++++++++- tools/lammps-gui/chartviewer.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index d79f0b2748..f28625d9dc 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -65,8 +65,9 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : setLayout(layout); connect(normal, &QPushButton::released, this, &ChartWindow::reset_zoom); - connect(columns, SIGNAL(currentIndexChanged(int)), this, SLOT(change_chart(int))); + installEventFilter(this); + QSettings settings; resize(settings.value("chartx", 500).toInt(), settings.value("charty", 320).toInt()); } @@ -234,6 +235,26 @@ void ChartWindow::closeEvent(QCloseEvent *event) QWidget::closeEvent(event); } +// event filter to handle "Ambiguous shortcut override" issues +bool ChartWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::ShortcutOverride) { + QKeyEvent *keyEvent = dynamic_cast(event); + if (!keyEvent) return QWidget::eventFilter(watched, event); + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == '/') { + stop_run(); + event->accept(); + return true; + } + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == 'W') { + close(); + event->accept(); + return true; + } + } + return QWidget::eventFilter(watched, event); +} + /* -------------------------------------------------------------------- */ ChartViewer::ChartViewer(const QString &title, int _index, QWidget *parent) : diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 60a9cfba79..248fdad7bb 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -54,6 +54,7 @@ private slots: protected: void closeEvent(QCloseEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: QMenuBar *menu; From 63aa467959b590ee2cb0eecbb5d6b2784d5bc88e Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 4 Oct 2023 12:32:24 +0200 Subject: [PATCH 149/417] add support of computing B-grads (and C-tilde grads) --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 6cdb751617..30aa433a58 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.01.3.fix.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.10.04.pre.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "4f0b3b5b14456fe9a73b447de3765caa" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "61ba11a37ee00de8365b18b521d394a6" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) GetFallbackURL(PACELIB_URL PACELIB_FALLBACK) From 0536e0e7b3c2985dafb4ff28173705cc00c84cd7 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 4 Oct 2023 12:38:25 +0200 Subject: [PATCH 150/417] upd Install.py (new version v.2023.10.04.pre and checksum) --- lib/pace/Install.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 4f3cf299ac..2a8cd2f1f3 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum, getfallback # settings thisdir = fullpath('.') -version ='v.2023.01.3.fix' +version ='v.2023.10.04.pre' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2023.01.3.fix': '4f0b3b5b14456fe9a73b447de3765caa' + 'v.2023.10.04.pre': '61ba11a37ee00de8365b18b521d394a6' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") From ac53cbb779c7e1b43efa67e56be55e2919048fd7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 07:45:25 -0400 Subject: [PATCH 151/417] update LAMMPS GUI docs and some images --- doc/src/Howto_lammps_gui.rst | 198 +++++++++++++---------- doc/src/JPG/lammps-gui-chart.png | Bin 74760 -> 107306 bytes doc/src/JPG/lammps-gui-complete.png | Bin 0 -> 36443 bytes doc/src/JPG/lammps-gui-log.png | Bin 122888 -> 97687 bytes doc/src/JPG/lammps-gui-main.png | Bin 93426 -> 92717 bytes doc/src/JPG/lammps-gui-popup-help.png | Bin 121506 -> 132908 bytes doc/src/JPG/lammps-gui-prefs-accel.png | Bin 36728 -> 38261 bytes doc/src/JPG/lammps-gui-prefs-editor.png | Bin 44506 -> 45027 bytes doc/src/JPG/lammps-gui-prefs-general.png | Bin 76737 -> 82533 bytes doc/src/JPG/lammps-gui-prefs-image.png | Bin 50767 -> 51660 bytes doc/src/JPG/lammps-gui-slideshow.png | Bin 61093 -> 68537 bytes 11 files changed, 110 insertions(+), 88 deletions(-) create mode 100644 doc/src/JPG/lammps-gui-complete.png diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 0b5237d1f6..4db8b532ce 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -5,48 +5,58 @@ This document describes **LAMMPS GUI version 1.5**. ----- -LAMMPS GUI is a simple graphical text editor that is linked to the -:ref:`LAMMPS library ` and thus can run LAMMPS directly -using the contents of the editor's text buffer as input. It can -retrieve and display information from LAMMPS while it is running and is -adapted in multiple ways specifically for editing LAMMPS input files. +LAMMPS GUI is a graphical text editor that is linked to the :ref:`LAMMPS +library ` and thus can run LAMMPS directly using the +contents of the editor's text buffer as input. It can retrieve and +display information from LAMMPS while it is running and is adapted in +multiple ways specifically for editing LAMMPS input files. .. note:: Pre-compiled, ready-to-use LAMMPS GUI executables for Linux (Ubuntu 20.04LTS or later and compatible), macOS (version 11 aka Big Sur or later), and Windows (version 10 or later) :ref:`are available - ` for download. The executables are linked to - a current version of LAMMPS as well. The source code for the - LAMMPS GUI is included in the ``tools/lammps-gui`` folder of the - LAMMPS distribution and it can be compiled alongside LAMMPS with - CMake. + ` for download. They may be linked to a + development version of LAMMPS in case they need features not yet + available in a released version. Serial LAMMPS executables of the + same LAMMPS version are included as well. The source code for the + LAMMPS GUI is included in the LAMMPS source code and can be found in + the ``tools/lammps-gui`` folder. It can be compiled alongside LAMMPS + when :doc:`compiling with CMake `. -LAMMPS GUI tries to be similar to what people traditionally would do -to run LAMMPS using a command line window: editing inputs with a text -editor, run LAMMPS on the input with selected command line flags, and -then extract data from the created files and view them. That -procedure is quite effective and often required when running LAMMPS on -high-performance computing facilities, or for people proficient in -using the command line, as that allows them to use tools for the -individual steps which they are most comfortable with. +LAMMPS GUI tries to provide an experience similar to what people +traditionally would do to run LAMMPS using a command line window: -The main benefit of a GUI application is that many basic tasks can be -done directly from the GUI without switching to a text console or -requiring external programs, let alone scripts to extract data from -the generated output. It also integrates well with graphical desktop -environments. +- editing inputs with a text editor +- run LAMMPS on the input with selected command line flags +- and then use or extract data from the created files and visualize it + +That procedure is quite effective for people proficient in using the +command line, as that allows them to use tools for the individual steps +which they are most comfortable with. It is often required when running +LAMMPS on high-performance computing facilities. + +The main benefit of using the LAMMPS GUI application instead is that +many basic tasks can be done directly from the GUI without switching to +a text console window or using external programs, let alone writing +scripts to extract data from the generated output. It also integrates +well with graphical desktop environments. LAMMPS GUI thus makes it easier for beginners to get started running -simple LAMMPS simulations. It is very suitable for tutorials on -LAMMPS since you only need to learn how to use a single program. It -is also designed to keep the barrier low when you decide to switch to -a full featured, standalone programming editor and more sophisticated +simple LAMMPS simulations. It is very suitable for tutorials on LAMMPS +since you only need to learn how to use a single program for most tasks +and thus time can be saved and people can focus on learning LAMMPS. It +is also designed to keep the barrier low when you decide to switch to a +full featured, standalone programming editor and more sophisticated visualization and analysis tools and run LAMMPS from a command line. The following text provides a detailed tour of the features and functionality of the LAMMPS GUI. +Suggestions for new features and reports of bugs are always welcome. +You can use the :doc:`the same channels as for LAMMPS itself +` for that purpose. + ----- Main window @@ -86,9 +96,9 @@ save them. Running LAMMPS ^^^^^^^^^^^^^^ -From within the LAMMPS GUI main window LAMMPS can be started either -from the ``Run`` menu using the ``Run LAMMPS from Editor Buffer`` -entry, by the hotkey `Ctrl-Enter` (`Command-Enter` on macOS), or by +From within the LAMMPS GUI main window LAMMPS can be started either from +the ``Run`` menu using the ``Run LAMMPS from Editor Buffer`` entry, by +the keyboard shortcut `Ctrl-Enter` (`Command-Enter` on macOS), or by clicking on the green "Run" button in the status bar. All of these operations will cause LAMMPS to process the entire input script, which may contain multiple :doc:`run ` or :doc:`minimize ` @@ -147,10 +157,10 @@ More information on those windows and how to adjust their behavior and contents is given below. An active LAMMPS run can be stopped cleanly by using either the ``Stop -LAMMPS`` entry in the ``Run`` menu, the hotkey `Ctrl-/` (`Command-/` -on macOS), or by clicking on the red button in the status bar. This -will cause the running LAMMPS process to complete the current timestep -(or iteration for energy minimization) and then complete the +LAMMPS`` entry in the ``Run`` menu, the keyboard shortcut `Ctrl-/` +(`Command-/` on macOS), or by clicking on the red button in the status +bar. This will cause the running LAMMPS process to complete the current +timestep (or iteration for energy minimization) and then complete the processing of the buffer while skipping all run or minimize commands. This is equivalent to the input script command :doc:`timer timeout 0 ` and is implemented by calling the @@ -180,11 +190,12 @@ or to not show the current log window. It is also possible to show or hide the *current* log window from the ``View`` menu. The text in the log window is read-only and cannot be modified, but -editor hotkeys to select and copy all or parts of the text can be used -to transfer text to another editor program. The "Select All" and "Copy" -functions, as well as a "Save Log to File" option are also available via -a context menu by clicking with the right mouse button into the log -window text area. +keyboard shortcuts to select and copy all or parts of the text can be +used to transfer text to another program. Also, the keyboard shortcut +`Ctrl-S` (`Command-S` on macOS) is available to save the log buffer to a +file. The "Select All" and "Copy" functions, as well as a "Save Log to +File" option are also available from a context menu by clicking with the +right mouse button into the log window text area. Chart Window ------------ @@ -243,10 +254,10 @@ installed. Variable Info ------------- -During a run, it may be of interest to monitor the value of input -script variables, for example to monitor the progress of loops. This -can be done by enabling the "Variables Window" in the ``View`` menu or -by using the `Ctrl-Shift-W` hotkey. This will show info similar to +During a run, it may be of interest to monitor the value of input script +variables, for example to monitor the progress of loops. This can be +done by enabling the "Variables Window" in the ``View`` menu or by using +the `Ctrl-Shift-W` keyboard shortcut. This will show info similar to the :doc:`info variables ` command in a separate window as shown below. @@ -275,11 +286,11 @@ Viewing Snapshot Images ----------------------- By selecting the ``Create Image`` entry in the ``Run`` menu, or by -hitting the `Ctrl-I` (`Command-I` on macOS) hotkey, or by clicking on -the "palette" button in the status bar, LAMMPS GUI will send a custom -:doc:`write_dump image ` command to LAMMPS and read the -resulting snapshot image with the current state of the system into an -image viewer window. This functionality is not available *during* an +hitting the `Ctrl-I` (`Command-I` on macOS) keyboard shortcut, or by +clicking on the "palette" button in the status bar, LAMMPS GUI will send +a custom :doc:`write_dump image ` command to LAMMPS and read +the resulting snapshot image with the current state of the system into +an image viewer window. This functionality is not available *during* an ongoing run. When LAMMPS is not yet initialized, LAMMPS GUI will try to identify the line with the first run or minimize command and execute all command up to that line from the input buffer and then add a "run 0" @@ -327,33 +338,40 @@ Context Specific Word Completion ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, LAMMPS GUI will display a small pop-up frame with possible -completions for LAMMPS input script commands or styles after 2 -characters of a word have been typed. The word can then be completed -through selecting an entry by scrolling down with the cursor keys and -selecting with the 'Enter' key or by clicking on the entry with the -mouse. The automatic completion pop-up can be disabled in the -``Preferences`` dialog, but the completion can still be requested -manually by either hitting the 'Shift-TAB' key or by right-clicking with -the mouse and selecting the option from the context menu. Most of the -completion information is taken from the LAMMPS instance and thus it -will be adjusted to only show options available that have been enabled -while compiling LAMMPS, however that excludes accelerated styles and -commands, only non-suffix versions are shown. +choices for LAMMPS input script commands or styles after 2 characters of +a word have been typed. + +.. image:: JPG/lammps-gui-complete.png + :align: center + :scale: 75% + +The word can then be completed through selecting an entry by scrolling +up and down with the cursor keys and selecting with the 'Enter' key or +by clicking on the entry with the mouse. The automatic completion +pop-up can be disabled in the ``Preferences`` dialog, but the completion +can still be requested manually by either hitting the 'Shift-TAB' key or +by right-clicking with the mouse and selecting the option from the +context menu. Most of the completion information is taken from the +LAMMPS instance and thus it will be adjusted to only show available +options that have been enabled while compiling LAMMPS. That, however, +excludes accelerated styles and commands; for improved clarity, only the +non-suffix version of styles are shown. Line Reformatting ^^^^^^^^^^^^^^^^^ -The editor supports reformatting lines according to the syntax in -order to have consistently aligned lines. This primarily means adding -space padding to commands, type specifiers, IDs and names. This +The editor supports reformatting lines according to the syntax in order +to have consistently aligned lines. This primarily means adding +whitespace padding to commands, type specifiers, IDs and names. This reformatting is performed by default when hitting the 'Enter' key to -start a new line. This feature can be turned off in the +start a new line. This feature can be turned on or off in the ``Preferences`` dialog, but it can still be manually performed by -hitting the 'TAB' key. +hitting the 'TAB' key. The amount of padding can also be changed in the +``Preferences`` dialog. Internally this functionality is achieved by splitting the line into "words" and then putting it back together with padding added where the -context can be detected; otherwise a single space is used. +context can be detected; otherwise a single space is used between words. Context Specific Help ^^^^^^^^^^^^^^^^^^^^^ @@ -363,23 +381,23 @@ Context Specific Help :scale: 50% A unique feature of the LAMMPS GUI is the option to look up the -documentation for the command in the current line. This can be done -by either clicking the right mouse button or by using the `Ctrl-?` -hotkey. When clicking the mouse there are additional entries in the -context menu that will open the corresponding documentation page in -the online LAMMPS documentation. When using the hotkey, the first of +documentation for the command in the current line. This can be done by +either clicking the right mouse button or by using the `Ctrl-?` keyboard +shortcut. When clicking the mouse there are additional entries in the +context menu that will open the corresponding documentation page in the +online LAMMPS documentation. When using the keyboard, the first of those entries will be chosen directly. Menu ---- The menu bar has entries ``File``, ``Edit``, ``Run``, ``View``, and -``About``. Instead of using the mouse to click on them, the -individual menus can also be activated by hitting the `Alt` key -together with the corresponding underlined letter, that is `Alt-F` -will activate the ``File`` menu. For the corresponding activated -sub-menus, the underlined letter together with the `Alt` key can again -be used to select entries instead of using the mouse. +``About``. Instead of using the mouse to click on them, the individual +menus can also be activated by hitting the `Alt` key together with the +corresponding underlined letter, that is `Alt-F` will activate the +``File`` menu. For the corresponding activated sub-menus, the key +corresponding the underlined letters can again be used to select entries +instead of using the mouse. File ^^^^ @@ -405,8 +423,8 @@ Edit The ``Edit`` menu offers the usual editor functions like ``Undo``, ``Redo``, ``Cut``, ``Copy``, ``Paste``. It can also open a -``Preferences`` dialog (hotkey `Ctrl-P`) and allows deletion of all -stored preferences so they will be reset to default values. +``Preferences`` dialog (keyboard shortcut `Ctrl-P`) and allows deletion +of all stored preferences so they will be reset to default values. Run ^^^ @@ -598,22 +616,22 @@ the completion pop-up window. ----------- -Hotkeys -------- +Keyboard Shortcuts +------------------ -Almost all functionality is accessible from the menu or via hotkeys. -The following hotkeys are available (On macOS use the Command key -instead of Ctrl/Control). +Almost all functionality is accessible from the menu of the editor +window or through keyboard shortcuts. The following shortcuts are +available (On macOS use the Command key instead of Ctrl/Control). .. list-table:: :header-rows: 1 :widths: auto - * - Hotkey + * - Shortcut - Function - - Hotkey + - Shortcut - Function - - Hotkey + - Shortcut - Function * - Ctrl+N - New File @@ -640,7 +658,7 @@ instead of Ctrl/Control). - Ctrl+I - Snapshot Image * - Ctrl+Q - - Quit + - Quit Application - Ctrl+V - Paste text - Ctrl+L @@ -673,3 +691,7 @@ instead of Ctrl/Control). Further editing keybindings `are documented with the Qt documentation `_. In case of conflicts the list above takes precedence. + +All other windows only support a subset of keyboard shortcuts listed +above. Typically, the shortcuts `Ctrl-/` (Stop Run), `Ctrl-W` (Close +Window), and `Ctrl-Q` (Quit Application) are supported. diff --git a/doc/src/JPG/lammps-gui-chart.png b/doc/src/JPG/lammps-gui-chart.png index 447e7096258abc4de0803edd83abe5ba5d871f37..a16fcb167ceb054159d513138d2e54bdcab1eb55 100644 GIT binary patch literal 107306 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 N)RncBO72?({tI9F$SnW> literal 74760 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%0An|5~`CPxO7mx-AeG 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 F{{?51w&MT* literal 122888 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�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 VI8a-URa6rItngmGLiR)O{{Y5#U(Nsk literal 93426 zcmd42RZv`A7dChr5AG6zLkJE*g9ixi?ykYzB|wni?(S{@g1fuBySp_uB=7fMOx4WI zTus%f>gvS!od@`1kMt03eBp3dsWiq$B`<4&fl)?);%p<9vI8GWja? z6#%Lt5T5j)-`R zRK9(S{rJhhoS&ZEIeI?qGdGFaECX)6b)8)p4Fx}mGEVb1&{n>SNSPe$1 zRI>pB^PAk;HT|0Jyr#8wuWkr#i=$DwMtm0>6lCMz&@9rD{pr`=tC61VwluC&yhuJ- zfCssKFph>)o9*!U_EOGyMxj7sUDHB|Hj|TLqW! z-{)X{TR}^bWV7!@VDpGsVF zPG!$PsTE^UgpaJ`IxLEn79 zEZ1kbGSWc@Tvk*X+@Ib!zg`=#4yl9k0l;7ivh<$b;nYb0OZ5x!qXISilm`c$R4no$ zcXk;hN$7IiG!~@pc6p@Z3-Tg%!D+<@+BZSnB$$)**HpXD>#kFWDAQQ%;W@AiBQN~9 zFxVMUCw<6K$|I^Q4bx;QuHHv#m~rV)RaOIMg-zL|?Ph;Z2K$ z)7f1(L_J;y_UHGA$tLW?Y4Rbp7d^_-%=v^%DlSQ9h?UVYINRCd^WL69xjI*M4wqK@ zBd7q9iD;kd?-hKTyD?0becd?0P)~SqDNOj`4?<|3rwxKsc!Qh}5dPN(DIPcQKIzY3 z=s+jVeskNym%$GCH!tyS!S>~r-nQH}M+DP0%$T;YO^C~t&O|qI%4^bs4EpeYaWv5M zeKEZ$$i?=9ZVh0^4C!7~NAJVGd}$8<7!R-Zh1=&F8eN6#j)_S|f4R;8KKa<`40*pf z?NGLrv`zZY90mZ@(?Y=CH)miJ^EH-~+A7 zultL&qjwN4VK(5CqBfr`b!%lbEC|vD`1ZY*_KF=2Q&pKD>`o*q6eJdLNWiB^i@uipEiG zUXn#%$o8Qose*ox&r5*{C>6vtFse{eRU#(hCup=wG@7b=a}TOt*@bP|2w%082E>&= zclNm3>-FMFqy!=poG2+hjKUK23x`oJw|eIJJ#HjlGQ`f9Xn8tgnMlR;!*aNKX-2Xw zub%KA3{eo6eP-u6x<5!{A`5VT1lMLXb$za}2Y?UlCcBu|?+pQi)_F3(%*?EXz!Nl$ zX_QbHS~fF#ky@vR(NS5PEnuMLQT$7_m+}^WZw+u2h)2iNdZF=sX&2OC3r zO`T`(DVHn({s@k^x*nNud;j$ZUdNX;&GzHQ;@|WvLG0J93g~&AF{}}9h?v&uak`|sk_V-G{wcN(7iFF z&mZXW{CylhylYpYHd~E{$%O$_-T4=z>K6YwtK*!&_5$|>3FOemJ$~hdZ;O0@{5r-ruJAg$rqol z=w@`scYBRKnyAdeAwt4(jkcL&c6;(a7e{AOHMw!~az^_= zDU`uurAWn)dt@OP7P?FWdB-cw|5ncJDHq2JU$ zBcjuD-K8?#nIkoyIm3BJ^Q-dn2#{xjtX$3CRXCs7dX54O;5xe6CJm@z%|LXu_sAWu z)w7$=*)a1TS=KVCz9rPdvxC1DPQ2Rs(y)-!C)4Ltsfh43UD{sG+Gkq7QrR;eRqI>c zRjs+v>FKb)?O@J?NNzPRw@%hn_Yhr|W3tQF!ni?q^VmK-Ws<1tmJ+f<|EFUMNKiWx zA*S1=EH+bNb+x@4E6OD;dFuRX6X&b2m{mYbptHKw7Y+nxhC5%xtMRg}FB6qG<_w=d z34z}euy{Pjq6f1g#?9cFeII&{fTJ?otJd4l-%Zy?)Z4gt{EHJ%mL~M$rhA`0N=&;> z#im0ER-jOZ%QN!jg39=4eNqzg5Igx^A1Ui&ZF?rCchT$qTdY(trZg(r5SFWrg7har znkcGkylx-3Trw{d+Isalzl%dn2|>Jz;=;84l-Tbu1K^(&sSpoF?uD zGkeQ~6U?ft>H2kna&esw@eWlN94(v6LVt5U{#aT1SQWV28Hz^CsN_%lvFsQnfioXk zBTdFX&!T>pSBTxh5+me+UE8op9(@X<77Le0+y`lXii1Gp=RX7x9Vn3jpTXaMa!jU_ z{Ec$G{BafR>=h*F!!is>sxK^?%Gh9*7F=`Q691x6-Rf-brFKYfD6a9Z!|;r70!S8N z7Xx8L^Lh&e6!&8DyUPFpnnw}VK}gc7y|`{BzNgH)%S{-RBG79}-U%kDsiUI`meZAE z@)dwtSEHoFCuT?zKU=e8O2y7~)kMeVRlg%L*?!H&&Q+t3V;N;up=`BxXij5$dkztq zqyXr*TFugZLgoLi?&h^Cg@j^q25^}T6@VSN3uNuYK84e?Jf+B&!Rngr8H+n3?L*r1 zI2t-@icNR;C+dXb^qlzBjVrX}yc;R&xp_vlNrWq=1b?U#CNt$>8oAxEv zFLmh0ISNhMTVy;^4y8hX$Z@89tR2@HB#lb#PtVxD*DbA^AyQi9!05}q+J2FcBCfl_ zXK|EogFV~Bv|@$OXUO-(4VJTKYw&^XcH)KnxJLAOqXXh)HqG}S?F5l-g>rDP9-?l#+Vg*xWWB>qi^s=Cxx!+S|c`L`Uf?>m@8v z`a)IKvgkYX^5;6DPy#|T2tPdN)_f2iDU!gWhM+lHH82(mO~$6Gb7Gi`qPY+Q7OhHF z{v~bapHzznqWbvFp3i-6+M{+nRt!DpNkr>v_FVE#t@`=uXz<0B=F#EFb zc?Jdg>Jr|~kOY>3TiRs_^*E6CF76421;76o;O`&U$QfrSX%;E3LM5(ewjVy>)6Fhi zq_z<@ef8ml00HJ0(@VcKLP$KDV~72Vr}3N13*`$-O38|-1}m!-{7y6ER5W57UqlU% zUIZx*eu7OkdT0BH*d-irwrHdRv;J_{-_^fD89wSvIJ|Kqq5oA^a<0xemmk#V>ZB7j(gK#Y?W$ZlUehd~C z70n(x)WSdzmj+rBX~3*2zO1SZ#O1@&3@%Zd>n$DA|8{~sohGyKkooiL{ODV+Qm20) zhlzh^Jlne?3izd}EGPZU@!8^P$u3dMEjO+qRmBF?JtLLr>4T*c`K2zVsg-ahRVE6+ z=j&*xWbgOdd+lJKdy z9xgWzWsM80F7>4^6`vS9L&jetTC!jAS&M?8 zb;}|LRe?yx{Hot;d3AwPYOF|>J(@IO(0LmOW*(JH{LXFsY!~g@XfM& zA+$6HAYB5`m_t=j6-h_4q-k)Vrf0GmlPgQ1(PDkjLW9_q0Yu1nRKEj+G&m25+L^1{ z8}_n!&&Muog+UAi90&cNGIN)5?1HVUg^!e&_4lEc_581?M+u-+c4FDdT@?*j`|u>D z*c}cg-7Yro$Y_Qg4oYjLt&?7OtMCL%Ukv?UaI$$Aw3e2ZogZ0^w`na(w@HqR|B12))S z47Hxguj1BAK>T(`GE#$ejB0dq#8xi7$^}r%0BTw_?>GG)0W%}L-5M%ObW56ju)K8z zo*{io?BN5~uh|+o#HOiXTzJwZ!AE>nf#VzK`1K!g;5Kqm2e>Ac&HeJ;GREmI?0O@v zS``H1xA?wKWFlG77xs&>g%{kHWSg@XaitD-Y4Jg4#w=tAA))Evq=M?z?mCDkf|vUF z#eJoYApLX6&mZYy*zrM8nOJGjD=^s9TYRwRfvtR|gk2Ke>mt z6?D%orBqcLx%wFmI4aC_+u^%QOkBUz-(pDRc{bh*h;yjrP$tNv9<%?!H$Un>hdFnY zI{NK+*&ZeYxQgxh!CsSdYH6!e1C@3fu#a_tkeNMBXF}=%%C|Sd0$k6rSmN#f0x?woj&1g5}FZKBA8(5d^0y9 zcK9&cRSX0!qHQHi-XWWom8XcGaUW z$_~2|t`fdQj>#Tp728_}nny}Ht@J}tXDQqLKXPbkABs~|6MJ6mFOAY9z z`GJ@EIUTI}SDv*iKK7fL-_#M@+Kp0~>Z*OWkhdyBb?p8`to03ua^Bbd0^5*UbAwzm z+K?JsuzmMZz7a;1O0Y@wI(&-fcHKmlL8*<}>?cn5S&FXjoVszp6-kjkby4x%@bA->8 z5k)j%Ioo7_wVlb&eP06^MlJ%(M z(&o#>Njq&wQlDDXFRmy^XY^JShQD_iy)4cYR93z-TPYvVl!OX1qKjIPpK5E9-0a1v z2BY$_Z62%P7^q2?XM(x}EDQ+7ExX%4;yax2Zl-1Ed|Ovb&+%GK2x238%@ zirxCMMYd*3<-G58f)j9(Sf?sYqdaD)%Svb(tbdou-(`PI$WrQ?Zz`)OyH{t_rlS8t z9`*Zae20J9LZ&81KC4i*(njTQd;%|h< zMboP>dHkWpiEFk_0K^IL1yZH%XT7+u9SCUV2(n7Ss2QeHHdTfMAR}`G^34sQ)vPfU^0D$*{DnI{o zb`eiVZyPCDqzV5wx(#T3Dw9+?T#?(^WTPbokvHpou4$>U(t0!8gajg*U>k?m!cX?u zKW_~2AGLp^4}HE`Tc7uknL9af&EQmhC60;5Qu0zuz9R}Q%}5)PfIc95D9+0KPBY@->uuen3mP=Fn?-Wmnxt=FamyQbdpKw6 z7O7Ffk8N9khZ4s9j}Ju=^84?v z6?zlD-~MlvXUL?rn1ZP(gNru;=j|siccK(hGNXAkuK!qJxmO{U{=W$5(=RY=_E*Ax zD^2ss?s@l3+Mo&OAsj?c0GSa1F1V^9xb#2viSe8Y2rPtR$1_YHqRG)iYhANt5d}Zw zVgLs#2Z$NaTeZeip;+Bnx~XS{i{VouepNm$`<6IR`^Y{BP0HwOXw^yBLboCbS*j_ z9O@t^_z2e;H?b<|^LJzde$-|=$?7;Q4&oTKq#tb-avGd;`boaL%*jxujQCI=9ao=! zQ<$?PU=f()c=i73Jv^PCp-y=5Cnje9`5qs2fh~XSrp=$;+xPG8Zz?7ah|hdM1!<7^ zUUrMLX*ZF$h#og!^Ikv$NI?8Fv6e=kJPjW-NpiV^#4AX|*hGGbwU*u%Bod2!1_`j( z^U2P=%fCL$(8A}?zYKD{;#&G4NtW&4Vt7PVR7(H|$SUS~UDVvwNqIibDR>%blW}V3 znNa1AX}oU77odl8-L#}Pgh=B_< zbCbK(D)T<;D;+$LJi@b>sIX5}$yiwg%n^j#ryzK+spu)>VP+eIFqEw~V_HbB@fzQ{ zR!Tchlb7}~OF!A7R@*TOJ~P9#9Afr&-dBkG6h`A8wZ4CdbU{GC6@YM&3Em9AMb&y% z<^l{z{o${kXTwpyJ0Ej$9|ey|r`au5dG={Y`EtLthH&+Q0%eiqQ2(@l^aj*%%fEht zJc6=i;8)HlJG9D~$ z$5SNu+NZC_2MJxlhtxh}I-JdVyJaIgtOkVMS$AE;>QhTZ=^9t3ooQN$zpfSB8L)%% z#}YX_XOCAz=&x!Iq$)m_Mpo@i%mwmZDb};|CZT3EKB+xJTQ26Y=4caDuMZGrwD1~s zsN~#;vH(8u200F@wP4*R z47sgx3vBO)$F8N4(O0m&NlFTr^X-g0@5yx8!lTg~{V0`1@4PHa#_MnwK3T@g$@rhb zbP?~ay}iBE{hJm05YSg#&dVbN_N)qs%o5SZ-H&Yw=X5Q2D8PDsYC|T$`-Pvb^HrXK zI^D592rt!80&whkO>SB7)g2dipaTOwzdFwv%{|Ce>TWzaXVHNw-FKp4z2sxdzRc}) zZ%nf85zdn?H0?qwL#pJw06(Of`;Q_U_2>wb_)KiC6SzRaoMK)?*0z+@w;g zT>}shXfN#3ylk=A+RT+bS`n^D8HbaT&X#+g^`{B^d*K1NjgU((4|fG5d~T=PiOH{7^Fk$YS%H+XzA6^$G!b&?cP^)Ht6mGaXJ~g}uJBZIOR@Opt)#`~~=z zdLAYPuaS56`d<^BgKvkJbsi6=U@h=`?iZuY5mv#QJ4M#YjGqH%7aI{Wi2o+AXD$bd z{-LqL#FeX-d@A%{2Xm*Pud75Vlfk0g_1>Qyr~nI}3BOzsgNoMWp8=qRgtgWN%MzFY*WO?um|3e#L{e_R!2JQ0@q+z|xSnPvib~K|s^dMR z7s^fnruLlHQY)=0oH9JVK48n@p&<3@xalTnxtEata3=IVLBz^^%uFCx0d_7H zGg|`>&xbNMY`83m>+uKCoJJ1;*l52L$9wgmMqxg&Dr+~QVc*fCHoV)z%k9E>ARqGw zu&Ld!Baa<~`{mGMd7xp8^dpd}UZDNeNvw4aMwX)-@ z)}q1yex#%4CZ}P~Jl=l$`j(s0(43z^da^~>;&I#n`_V_DBmp5Gd91Ug1^R!rg=0!N zl$ci z2i8vxkCYt)~%~fHKF|*Dgoip_YX4&_}6h%IM#~Z9Jv)`dE0J9s&N@E zx5p0`LpTm~e6Pb1-U;3zcHiww!Jw?L?`)K3yt8IIz_seR&P3>djd`%47uOAlhMX|U6l6OFmwV8 z6tMtE0Jo$(4m)<)RnQn$cXYWyhvC_5we@vqk6>>E*WH~E`TPiHp=`Zhf+ro49LOBn zvA?r%l7WcN3Aphrl1Fd3p&9b=`hhGDbAG_OKipBK@;UbGTYz&N-&>usM>~7<9tK_VbNjk@ z(d&{q`_Hf>Lbpd|oP6%F^7{u}xkVh5i=+%ZjMasj>yBWBvFTz%;K`yVy(Q4=;)Fr4 zt4j*M)GrYEVfQFa`731CGA-vER+dv=c~{P9#`h@?v)fkf(ReRGr;}w6Ks+j7_j9?K`CR>4E={1* zyPs`hzy#FjDe=d{|QZX&yV|pSX89mBe=@ffm)RkKt=H}DzQT&-OOVQ~P)$dB5y# zh|HG$bSQ2QNp=bVb!I$+{m6L82+QbI9PP$bw^0rh8SA~|LqV(Vw%@Ccrq0Tm0aSA) zY|pxrmJ$rYQ)h?M-^W8+d`Bw=)OrGdPnC}Y_58;+I~qKY?W?p51kkSVMpn2})!9uh z2d2Cp3dTI>a1QWozDkEb8(nu-iJ{eqYZtm2EtXr(D&Gha;ys)yj~3OjQI*Uio!A0MkXDJm)Dkp|5gB;tnC(&J^4;m+E0dD7V^ zMW{nKBkPemTnDrw|6ZEs1So9eP$0kZz2jI9CEOy9WFFyE5VTQ7k$~BVmOfT;u7rfJ znF$ggB>dnOVlxUr`>m2rqkWh$D8wB_(wjEp!9)Z*8j~)b`Yk-AaK`kKO~JkMV`NGu z{1V+kHsDgi7YAi>y-y-wLz$EBRFLf~1Cm3PGLE#iEPUp z^$g#MvbF!}Abw}(x_yD`3H!esyd_3a-zvJMR)1;*o4vc?56EMT9)r`0gtxsRdw>5wXfx(7{3H){R7m4+cMtgzW-rs@X-YEfAda< zL_skB2fy;~-fd%HVXee?{fqbC z_Wmfcvs{k%VY44FCk8 zMZ~PS$0YE=1>OVMC85FV3f3)g(lF#@d#z1S{J^|)cOMvoIPRtb&s?2bF|W;n3|_K zYtQZ@Q^DYPQ{OhX@>jft-c9A!bAs~8DPBw?TrYjjOCv6+N@!7 zyTi;db^&eiSyD9wvIp~IXdk|8yEe5n)Mp9lzL0JI=15M{Eu_1m0rlLYm*(;}Cj>Rs z&X@fxeuEhQNQG11=f^uD4x3D}FHMcnBK>!iQu-Z`Z;i9;_W>?&Sh`vyr;rX$X3?Cu^n#xt$zXBdMp4!Qes3rtI=C+o#BdMe z&k#TB2ETQfJ)NAz zZR^p3Dxk=I%p(n3+MCnD=s;G{sHWr>F~fCfh2lO`B^miK9ZlTe3f_AZmD+UG^RNuGByr-A<+Yq0XXs zW;p{0rY_kR9ZPy+*%RZg57Lt%R^5ZLUuOkF?V*5n*{iAMkTW4FiTm}7(QLvyE%!Gc zYf|Xt@8uu)z1mWpvtZ2==flC8{ZIgQ@uVgHo1p+Q_yH9yh5!%gnk4gAWhj~j|In1#sJ7Ys>Qthn)Xbtu> zPcTyNq>0@viv)B#|E!z!gZXRA%P!ZKy;xxa+jE>7H_pl1fsA&}`lTgzK`obql|r36 z#ceD&w%OrAy-6w}ZrY0ri)L*M=a(|G1ZF$`4L=GQOV32dTbTBe={}wNL&?&Q1^mQN zyy?fGYNMViqd)%e!l#~9iIlL>z7~4l25%cs9zlW7P{7<5Tb(7#e_P$ zN>LRrM$S8tph=2H>&qH8Xu|F27YCs96^(tgECE};_dp44OYS31_PbRD6pPrAbwZy(izcX?QB0I zat*q7i4*6geG#@a=kM2f-;YQ8_er)Yu{LRa0XG;{sobw?f;kmDm|o;qp+-yJ80fqY z`gdtL!nS(pi5EFHF2z>98EhK@{m0M7aR#+E_FTWVVv(Qan;3w0Xc$PF^zprXEpLN~ zyz!MKzl;N<^}$iC0dGz~ikr-zu zwubiS1_Q;3Ot=Hp-K#5k^V7q@MFqDhb*%_OEw&lWCdLABc>-V2gz>I259ldhP%l}Y zA$;6C2DyBspPM3WlOm*CtQQd^ ztH1PTcF6WR=NcsOdEq#3lY)51@q{0c?d5VF{D!yxA)h! zbY&##`+qCHv?bB8Ze;O3@&IvwRXr}_|77-OiY+C8A{hZ)65;bF%9yn_2g{|=b(2|y zxFV_vG2MAy1f1VXONp!*+luePnQ>$u4zRui{(0_VkS6k4Z}A&zRUPbqaSCyrLnd!^ z((Ga0EK0$qbL~z?J&s@vvbd4D;^1X|xgU&F8v8VA#aXrG@bES!ZEp0%`HmTZQmiZ2 zA2zl>*ZT> zcEDUN!H=8dE(Hq<f~`SgHl&ZJ2G)!K11ekMG^nq_FN#rfy!j~xoGv7LA&IN{Zg z3Ob(d5`m*FfLqqX`wb^~{#c zw6i!Qpi&p{yYFy_*>ga>LOg;OYEp(_3pncWfo|0x&=H>}?p>03qhSvOQebxwC}o$% z;h88S=4nHMee3c%$>dV{C2Ins>g+tSzun0_1=ADS=O|2Oh!Fh2CyfxGRuWJW5Aa-T z(~7L;YU~$XpILL?Gq{xp+W$Ou3tZ*cuO^a|{sZH_OVu%Q1nl1usPNTN>xpzaHn(EQ-X4sfK^s~L#s5^=R-W>5N?CE1 zsy5G^!{)X7XCKm4UH@yhUpr^J3syfP?tOkzE-9dk2cY_ceSX)8!?w?8S-BnUlE^Tf zeH)TsRodYMzEOBR%G|cZQTvHcdG%vmEV#=>xbF3y3@$}~T1DS6Az(edin)!ju&U40 ziL71ePg0_6YpXKQxIIt>cnGyVSz^Q0EiWC4^Z4XWgT%~`>T3r8{=Di3d_uu!r4C5k zb((lKF_xuBr+6k{n-;*u=N+-fM;`WO{i31k5{1uU4o6L_W69`^%067X19_Vmp!{A3 z*TwFULcs)1cl{kt(cj7soN%NcnV_7h3{SpX@=_%ZgS$ooYX`!1t2qcKlFm;td`{$!Sf%ByWI2XD)YFI6o%Akk|_(`ZoMx$i)7F?RNMe*N2X4r7__LcCu9 zefc&tcz)r|>weC<-l?8C&IP=GS$+HJuuQfohVp1ElE3itMt7wb?pxoK3eWES{`xi9 zyM-bGE&X>|x8FOWTEs4Tq9euB2`eU9@H%$&5HqBCJ{*zX8ZpQR%z@9?lYj+~Z| zGM23;xNWbJB>rE#||%rv2w-NgIJJ)loSwR&^nml-I>xj-f_Wp2S4>Y|Z_0 z=ggp7liOMFBT@altFi4xtEp%J0F?Mx7(XKbq~86;0?OVri|tjs3n}{6<*$c!W>qX6 zLb7+uza!?VKOglDeu0V7@aBGb%3tojUzTtK*p#fCd|G^yu%0in9H%5uh-m4D14V~# z;VKF7sGKgXoHZwtGVCdZ&Lghn&pl)^ zKvLG%M?9kxj%2t$t)1L!w_&py`-y7#~+jASQyj<55 zOjf@gr|>11oU#VrhkGJ>v%(@j-UTpd?%CU058nN(4UL<2D~_sa(~En>J5O$rFLw>$_FIN#K&jX?-4SRNZgjC(%#7HOURO0}g%|-; z0GRmGLg}m6utomlKYr_RslnwUBR!<4FDVuL(+3^=&(4*WpY}m1o37f_arwE4e9i4| zCxSL_luF*OW$Ih>9N~${EtV;FyGDNg+VQVk~_1610 z_Br^1%wYS>TnU8o2cwA-e$XZJg`CS;<3|PZeBj9(-Wv4f`l`!L35kTCK4(h%0P~gS zj4ODe@Er+hNw53C1i`!rbM(tk;FCCv%>JPFg!z$8P1m!=4e^=taAg1!BrKZ6{Ozf2 zQ^9q+5*fU!D$_nq01qVa-IvS_Nc{AJ!jG0PAuJN|jvdM_4hjcp9OD|>544FG3B=%+ zpU(V%4fwS&!Oi`sg+kH6LWLgMzm7%{fW~3M&j`zfZ42YDH7@1<%sJ2eN5(hDZ5o}M zJde-y>)$AWAtWO5`0y~WW4Tf^cGXM_M@2*4E=HTI=YpKt~>sQDF<|gV^BIH{B*83hSEFkKVlrsJSn&r#+6<7l6rpIUmDjp z5DbfB$qzNZs`=ZMFZ7ORyHL|dcb(}TF`6rnOqCa=HVO>*$;d9G!2uIa zI=_1HG5@))dKUW2E~iU+3&yk2lIyE@6UjKJeRc@so{gEMbFl{ z5Vt2aEQPT+5dxf;e6P@*#&CejQaH|F>5ZN7%3FRolC> z?AZ}mii%4vjq!Ych$r>BX-v@!&56+x$5;5}rOSw%3LFHdWhrJGHSDfVZV}dgj&ozNzWo9?vFk zh#78|?$*MK5uV5HKp^A^ku7hXro)g3!DGRK-&)iPfuwYrq5Bi$Q3z>d$rBQo+v6-I zacBeTs!6Z2<^@!)kc$3TnYFKI^*xeNv+GF+j4iAbjO?36 zrAFew%Sv9#z$eK`b1ok_au-4!&qA~}b+(+s|Fa1#Fj-I!RhIF@fA=SW5rVYkz+Eyv=rv!z zYFGWbj3YVaCjl4wZrz^PiVByxTi_D}4j{+AKjt^>YaeJDX=aG}OIH#k=PSqm0j3uV zpxlj5*M!ks+s;u7EO)ku9{!m1A%KRMnvo4P(8u=20h8u48fq=^Hk=Rfw%{ECP^pcI z60kw*FHl*I%ARUzDhc5YS?S~Of8%q^r3Cu@NuUv7}5?LI8^r^dRYuma6;kh$5~?l5QTwA5$OUc zynjXF1Y-`Hg&p7##M7?wBkJomgdlGa2tC6|CHC(?%^^`m$XD&J+GfG=v}bz;;P^Tt zCS#Yen57pNWyZuE^4bftF{xJDN>TEzb@nsZDNaRaX3)*qtsH*E>oqJE&am@6W|H@0mQlPdlaujnKbgH7 zQX8b(<>cAwpORA1b}KO2pq>`pZ;6+X9z8ymllOH42*1`U9vuF}0`RY<&#%DhgIq>Z zdA9q~a8$JWU!Gk1WcT_*9(-`yXL^RF>b@-raeqGDCzpWHB{pZZm@>_Ni8SRY;YP< z&HW7_QJJK&+4*Du=&L>D$^qj)O?qqMv|TFsBKpv&%q4D`b;X;xI7;QIjo$BJ6M?gQ zD(gbKe&b8X*jzT}t6aI!4oyg5*dfQHu8o`yFmIHE)VIcJkZFh(*O7b0z1$ZPtr)ie z=W`ipb=Ff#emjix7R9oOj;?$8rzYv?wqIf$2@7R-p1O{$2akY|pxmqQ^n?-X^r0Ct zsgTPuSQ>{G(X*RSls=sm=Zv>O2%<;$id6i;fN+!46@Ppj2BMeG7n8*z%*M>{8Rb%# z09-Q99iKaoR+p2;ATqx2p!j{_^KAoX8}a`eD^!{ODtakG(=e1L7#%(&NGYI#UbE-$ zGair0U9ZV9-r94g;3wbA=T(ae%B(ppo(Cn(;Q|D&E4fg&)}yy$NOPXokr?pvlGBi#k$%0Yo|EaSZb#^qmrju~=Y>7J>KFEIug#mh*5aJwdBNboTp`=+UyJ+s$dReP#{SBXqa+%i ziAUfO5)hRVrUiYU9#OvZUwn$;qDO1rT96U(JU8tO-_GspOg2uu9bh5rSYQ`tXnu4L zK{8{JT-*0+_0zgV9-Sa3kl~HlWJ7QqphWga(OsuKd)z8WZz=okFwe}%M`7hX$*$qn z!h3#*;y!c)XRu^ovCKpRdyzG9CEI#+n=Ijarbj7rLtr@a`A^i#hb~*d!nic;K3>5m zL3bdUbm!R8>#;`s3Vtm0E^+>bSVlqCk*5W@y}3~I>=eZm%2xfQ#;)pM&xz^(kwHSm z+%;u&DZYFPKU%6sa&gulsN%s=g6W+sxEt{2b(seJ|2O_ zJV0FpkaV$%F2Gzx5U^_AG@%_b9oAj6kF9%gq^)yqWSIO3?a`?zADvk`0U^rg`i&B` zN+`!AM+6yY&zdiUm}JPmfv_t#2F|^0uE%xX`Akxt^40wQNjzr$R5&46CPjyWRGtxt zw(;(8g(zXotEu(>%mQdhQI`}^Kt$mmDe|jn=ZVbazXRGinwXuQMQ3)7Figbr9~#35 znRK_wDoatOOI6!{;~)g#v;CA(%^bs!N&V8sY`gaYI+_;aJA+tfwQOy1V@jgq7n0eJde`A{ zxtreoWW8y+(!TAr)*2&ki}7NTDVn=Feaj--&73vh1iI6@{+5>tlG3Fzz1v#7rUg4n zAMLtQ`EF35;(I9~@k-XEv2e(B%Pw$@P5p+|c30+BPjy=#UgY0m#WBL+Ipq9dZ?9C7 z#{2LgW>r(a(Yw3-iy(aKeMM*8!U7(((X(@NNC6h`4$>W^WU^ZNH)%{&euWzv0^rLJ zD8?NDxYx6fGHkAeiZF3(xm9usA;5BTse0+c!ptOX9r=z53Q|&ZWYHcTC22U2KYggv26oXWt>q9xy z;5@kk{{F@>sk&DGUv#|%R~<{YHrfmK;OgokHkBg$MaExN%Nkl?A71pNVd=QG~N-ugF-bAg?_)-0jdw!1SX zIepJKY9bu0YQui?lL4kA$|PJ}<1p5KY?IH%QTXzCZ%f8iOWjQ5uFw*nFeS=34m)gG z_B?753r(Viow`WAoMf?COq}#*3Yz^HF5BmxRcT~E_HK>Qy*z{PsJ;55a`YR#Q4c=hoqPFJ~jiz*`!U01PyfeZY=5Z7-v5UZJ;Oju?_A5z$uR>n>S0 z+)KOmws?JHi1zz5iQ@E%zcdrx{QZ98d{*W74;nVdYLGdBtk_zl4)H&g_4a{-ze|ir zHegZO_*pVN!Guvpmup8s$*}G0#kzqtwpFZ`P-G=cUBt*^si=Mbh?{++n>s)qMiUB9 zQtKSI^|HJ&2oO0)EZo&4OeLkNk}G{uc~D->r*Nqvfiyf=#t?Z7nx#dCOwVxjvSznP z)GvS($?=;e2@{Cg&TvtPOHwb7ni|3u(cU$q?fpd^FlrfX+MlXe(M;bVh(JBQaC+B( z2QJvfH-Ia(0>I-QaDS8;5$n^r-~(xowDEvN_yh?~;Ti<*_=ILX-|ER<)Q}lrb4hH+ za3a;;S`&pR3W;S~5GR_<2~HjwQ;RI&6iK*IcgLSTedB*7jR_E_ygqt}eEKHu8p(tX zy3b>77{c0du}qj6TAT|E`L~L{8F*8j9~)Y~q@2p__kBGe&=dT2YLGkHTGLR)adfDX zM8YVy%6a_!EVw>F6pb`(%%PjZps$`za6oc5Y6=`q;sJ%zXk;CkKnhZdVV9*8h4^X{ zCu?du@!cXec&a{dCIvERaX8`3{+XSQjJiaZn+V?Hyi=SaZ;tiV z5EF{tN?YeSQh||=Z(|L=(vZWC?S{)-h(vJtr7J~uvdZ0cfs4F>Xti+zZ=qm!y!WkyKh@T?Hc1;I8xt`Fa%@riPA;=a0_QtuegS?#}UjuaEiJp+1m@HU#pzY_XsmA1rafoA@uI#|-`kR_boBjP@J3aIp?M^Ip>0ed3f zGTV^37ay_jCh3%3UOJ?^rcD0n8xaMCzat7!Yg}xU`^4vk zS{J8C&K(u^1AQirtb}1WRrcXQaW9RzX0qegVc5IgNt{e!Cr&0rq#g6s+^^CI4#(Em zkEo9u6uNwKLSHP+iYeB8P7jZ4(T2m&a*+Tx9cj>uux&5?rf>VXszdGZE>`2Dg5+DKfyBYr1LP*o8wUVTfvTzh4Gs8#`cy(W)rq)muZXK` z9UmMsUW|3}JL=cHdT|JP$u#&^XzZYaVG1?BOCw8#j*G;i>WDBv7ea;yYa!(F(!%$t zz>SN*ktT`tmeh90h_7x6{9A9nq}a>`*Dvu@>gQFP&2-p{GKN#YCqiROT0jcH{KsaQ z;P=~~^FK4h%h1Ij7Q`s&l_q|v0VW7R3^PY<2sw&*L8#D3GgfdQ8e~9PH7_B6p08d zM3q4p;?;sP%yFGlf-j&`9)JL+fICVWV_R87hyx&CkYE|nvBl>z&i3MOW>xS|~ou(*_$idVX<|+oX z;1G@(yaV*Vm_4xoSOsMt3t&-#vV{mk>antf2%sO&8YKG+4-M-^21hCZkH%78ds{$= zH1!E?H0^Bp6LdIlPZy7YUR@!2E`r`>VKp zYx}((m{Bn?O)V^nOG}rf34)EZlA@xc&$ib)%Kj!}(Hqc@1rqy3k2m*~$aI&^VAQHQ zg;7#c;@{i?fH%V9*DrHPVsqgpVgNPf=c6Y!8UPW*@R5e5f;Zfymk$G+3Yh;OB06%~ z3KSVlLvN;`pPG{K_2%yR3N>F{rXC8crWwl-Z$@OT^3%tKDH=mF3SSed#)K5lv;+Z+ zM_%zzIZ|R(ctQuGD&Lvud15#L#v|Zsv7#cmT5!^H=}=4=iOPr zN|W`U1{_ih)1Gh#!y*v7J|&hFeN#??!hZPsNY^0|K%z^zB*FafZ%vMNKcU!zl_>}| zTzrr@!d3{z|MNZpf$`l;UJt_EL6FD+^2~`o@<=aab)k|FED)tp6+Yod~)uT#Z2`-Oh zkUtQetD0W0hcm-p5{pHL`$Cg>&QEoz^Jg;P86c$9BA?qzuJmw!uh*`r$a4WcD$h5B zu3lE}qKOkePa79r&Fkl-nJds_?IqG!)TI#N&h+nI62HgZDhI+mQ($X&PWSCCGf!1G zNeU`-{ZUS`%E~;M-Wz8>IJm?>uE6f4hop=1wCuq|awtkXZewS4?BV+^Kkivn>~Oat z4Dh|hlYH?%efC+?s%O~biu^^>r;EPH9zJ1LWmY%>W$AYO7U^lSQD&WiSh65%mE-(F z2jqgFP`M_GsEYrz6cGD|*k1bT4O3H*O6nxcf#8_W(b=g@AbCPj93~lmj5>oYZYT5S z4w(c<7*7IW%!8)41C5rQ{o-I6fD4bw9PE9stG7_v|8bX38$E~C6M;%+CxZS8}JE96Tyv{h)`{@#>;Y=JAS>^C%0(pWJ(P#iaD zz;C8NJ5nM591UO~&LH)mD6K(QhPFa{#Y5Yr0m1Yzkp?OSf*7DGb22`b%jLGiHlnJ@ z!Rct)2YiJ1g(WrxQvkxuCA}d#3B;EZ;5d*nR1rB4JAm)WX$|&(c|?N~4D}M(giS!0 z0eTcf*z?jIc$I_zO$afFT+Bf2{s)$R4~IgArwnK4GTgwc14NOZ_dA4Ox}np z@zBsL=bDVAf~jgn2pd-{4njpuoP>|yv#TP_?kNReIae1w=r;_V3F{x&jak6tYZ>#; zg4!1r$56;>xdRJ_B$&HQgkcrYNSY7(9IQw-aFIj7I9t7R<#>5^rBU?SKJ~cEmS3%Z@FpX@jh%;xF%e zqyKzsypdy4@pklV|HwR70JEk-uSS`Cp)`_K1Ek~OIJ8N!0&(3&C za-JT+VR@$JKRK%7031@Ali>HdkYwKSptcbA$E4PSa!9X1KMw&Z1Dl;E%$S zOX0todd>`T$`Y_{U&m&I20HjUKu`Z^6Ya1Z7eCI8RNnsa6EGwNbQCJ9hjkRjW$dZU z)P8MXm~{%jSb?e@yQxyT`fQLv*k5xP>A*_C|9rB~FPn~5pEa7FQ&(gGX*>9NQi)tP z_iNSP^#t$q-RZ)>T!*B(V7;$4-5DtM6lv}(B|76Ec7jc^ut8H}UR!*wY z)A%yWSCVQz&?31^>_Wde8(%A4cw~U5lH*r&+UyIc?{R(}-#q^L2bpYddoa8AyJWVb z;{jnBF1XzD$Is~66-gSzNlyOzwHz;Pl7eSJ{(D6k`nb<78o&MSh3IMM!y~E`h0}@C z&2^V^M67ri+_UTQi{2*rCX=ENH@+#imSHBkHc)F&1j7(Fu+!`js_Y~JD$yq`SV@ys z%h#P)rpHAtChOJr{oc>MyzJj48LYHwQgw}2eMi=@jL~jyVwm9`k0%x|0$_briCy-t zqv5CuUw+Md+nu!rIcEHoi9&&QZ?{!kJ?Gbm(o&J+vE|!*a{6G4UK&(ak0rlGMJG4v zi>`^Xm9N@it0&B05>!)K#~Fn6PLF2~K_nNg#jIfbo?Eq=`qcuceP2^-SBXfvltv-^LjDa8=@(?0Ut3&K=e7JfI%eNH~CIUVGicx)X7_W5&b`T;v4k7lmV z16DFVt(-L>=?;5*$q^BEK98ey#q5`X!NDI>ACeZfx!dLT^elF!FoW7#EjKjkPeB*CEOt%)7ZZ8eMGQLf>&E9PG#H==}B%hH-b_z%ZB|HW2}l@|vl` z4^IP@m5m|@v9X2(C`iU+Xt;+F=pc6QTs=|sPZeZ zEViP!^*fin*+|z|Q8rfFv-#qaiaGk*@6jERy*LpvQe}2bc=yklo;zpTL%kp(jYJ_K zM@;a|P*||1e4sX+C;pENYDhy@W4$A22=F(UbfmtZey)w0)az@mR6_+|&KTp{8KRkI z?#DucrgBxa-?u|077u%cvH^|&t#NFc!NyF>%J3{lJYj}eWtv|DNZAEuLOzCpnhvPA zmQjR65HVmy?mm}=8O?R-O4|Gm2daOrH5)bS31l-nSdX*|_?Xd7d`hK)MoJzT^-25i zQr4T4jFik!XEXYCJe^s^loYCm!g{@+6_~2S`c?ncSU%}r%)I}lkDkxNSYI5tj2F}I z2>%X$8Se!c>*o)&astX%(7n~_>W_~Sdl3keMFrB@r))scpQCdihg1{PJ(fqF5+M``o~3K&_ct1T%fu-4e^} z>mBRSL9hT89!FA-GQu2Hf_kKj3Trr-NhVhnA5(!d6|gFC8PrTGDFAvpgSb9v>6c zRBT0FFB$*YDNOo?X*yqy{X7*_(k`tTVALs-WmC;UD=2EYAqb5dEv52TFOUSuij+uu z!vUnUf=)LBrbO>>trk+GSomkG#%%`OM}U;2Q5EA!=_N>(+R6}8WHFo&wGKx@y<1oz zJ(gR@IN_SW^61Z%^+|&Iq zf=`U!n{OPI>_wEs07L7O_yia(0OTM}%z(Y>p|0t$$6VoAr`^JP`;}F~-26*s%AYgI z9~OVc96VrhG&H`5)>RBT5(05?Lg35ma6~~p?c6+R7?IwkoVZT;Jal^ISk|EB#J+;s zlpXuU%YXjy&lc{fRCJst49*P|E1%YQkV_f|Og~g*v;Vl|m@UO9@|TBAN8)Pv&6uqJ z(5P(`$DU=51v@5|>U&bu4@g7eghg5H=#P01fJreR#edu-i{oX~zdMPCMOS~d%iZ)3 zH=9^2HAm?!oGq>MgK*uip$s>yQQdtRtBwL`*|8~7< zLL2E%9v9YAYAF4~T6BCmjuj|GV*zp+156Rdq*Y(i4LYA{@GM zQzB5f=w0Rs`QjQNY9k95-LlZxp(Td@aL@Nz{Y8CmWm;_2Tj{V@mDELm`e7m7=Fcf) zoV=CQyHr7o_#Htc#7P@}1^rH)|4i}e?^vT0JWa67*wAkVF0$mhC)1H?yejU5;BSYE zWPimzUq|6g)4PTC&CN8l$lqDPBn)U(t*$Xr?JmHsSGsagKhN;S{wCY};KpY8`%cEn zb$DXh7jV~5y12H*tNtV+GO5S*FqF|~u9gi=0pTmeW+t^zn(s5fC!vMC=&g~AEWR1K z@Lw#0fIN@K=<7!he04xX!CBY=o`wkvxWBSrXooJkZczNV%C>W_9pJ6)QKa9>M9kJ2 zAfpezNdEYT#uUJUpFC41esPPl7BvC-Y(tx4dt%|F+KVS8*aRnx^1qrP(cbNo@=qDrt>`9lmqx|cE<>Ymh%`!uAWp6dUeXXzA!L-PTto5_Vvb}{ zYGh;x6!LaVq}ah6FsN5FA~2{ri?R%1D+qm$K}$reM+Hs<#D!Qm{Uj*WH<*00=3TK! zdEVN?y9FI32J?}8DRgx{ zAc7M3F>bWS;GJsS-vy==p#&j-ELL|3@feY=w1qZB3O~OlR1OCzcpL;K2&f?=k?!JJ zGdc&wFbHf{OdZ5B;VQ{%I@pN?9yx74Y?czX%a|ijbiOE>B_o(~ID2U4UzFbkhk#I9 zS2sIn!_b7?%fc`!DJ6CH_sl^3el#3Q{^za-SK4$Yl#a5zo~*OY5=oikk1=SLDm95R zt~5~R}R8|k&a^@C0sC> zJiM4a?aqHnPz!}&y`Qe+^jVNNOLiL@qQ2xx1|3Wc-;sPRMKCA_*YKSXS8o=K4{ln) zlwADjQnaO)4ZQ+CRjKk&#?eXj9?R~7OH!kTe0&6qEv5kXvk#hkr*_T%QCLG^gzIPb&NjQ{RE-^z-J!nFA%KSLpGL-4$qY}78h`GqS{HI7y) z5h>Mvo)#7Izr6so=U)@5p$}6>`AwP5yLTx$>*OS-Aceg*%X~{;-8PE+-*7(!7(`Cr zl|Q;I3Kzb*2ErNB^{K=n^9$|;Ic1=D@&2_+2r#F_E)O1+X7Ew(-~70iR5LiJ4ZDZc zUcvnEC#@si+E!WWCh1$NqeJta|p*wA)0d9xl|T8!=Gt-w=jpa4g}f z*!Ye66%&WH@dX#O6;Z=Rv19H+_e0vGoeN}W=M5`)cFR?9@gbgy_2Ld65b>aoHA!Jb z{yaM;Ia<|?12*d&Bnfca+{oyuc+J;M2uP~_n*iz_F>ix7kM|!`Oun~pOXcsYE=3}& z`piCV;FssV{1{4Gx>~sb!!TaTH>23Iyk?_Hbu=t}HKEOe-qoLTj$dyB|8{k60#d*@ zxN(^!syoYj(n>^@$j;vOMdRNm*TS)-;aaaLAzXJAog(%mipA4<5^a4YfO!Ez?5B&^ z7ha-!dmSi{TF0Bc-bVg=P+Tu(;;%Y=rw;4nRmI<$)HU^JTCVx*`;2&4P zL21H?62!tN1^Um0R41%#z#vl-e-_~3l{SGB1R5%6A6NkrW)N)r&+^h|%5IS*=s?tP z7I0Aa`@blG9RhbM&M+Q8NJNIJ1j7K;!%D%9;SBRlKyfqNg9(88e)bqG6C`*DHV_1W zgPx%PIKCCn2snGv*Vpd1&t{pHgKW*Hj?n)jWZ|A_4I z6=#axRH{z*LHJ#?h<7xxexv6)WWWLwyU@=)iP2mykOqtjtk{(&u>v3DXR^RQq~$Z_ z4qLl9b=^rIOeo15q^~Cf!`ToFfeWP4v@;+S2oojrArlci2&g5tP@7-7eiH#h_<__* z<(^4S#@Bgtgn zf)xDw!xnldR!G|3ZiPVVjMl*EYys_nrgh?>vrc2)R@079l4`IpPyU}(8X1znu-Vq zZtDyju|+Q9j>%N1Y3c9um^{ZZ&;S-v@-&WW{&SvmRnuF6`f2C;WB^m939`V12UVZB zPwN(3pv>>EoE)DdAH$ohlQejg7FQw3qrRwaZpl$d zF}@S7=agxkZzeNyFd`QT&FrJmA;I))PCUqH1ru{pPWp_4F(sD+)H+$QKR)hP*k?Oa zePn6QFxwXFbG@$0FK)ViGOV_86+4UgeA}j8IoLEH7_Q>;T&mrL%x*`bxWRLA-#q;1 zmjydAW#8DjZp9Zub(LUyE@ub)FBHsr+QvQSQZudc2m7{#w{Cs^caj+d=;JnQFZl@` zPO56Fn)J987$uwK=a_)D4l_?kyqj~K|#3x2U z#-z=yl8e7vXw%JWlv#0>efh(awRL0dYS*8dhB;I3dz>ix6nZFR=eg392qusw(JqGt za$?XI)W@ixa%=z>_1+z7!8_nt0(XgXT3x~rj9YSUBl`>~Ff{NOHw6PYvq=mZ@VvXO zHj9M**?OEu7G(-J5!G(Yt`Jj?uVjZOQ>X_2lrO#{!tS02x3qEmF3%}N(M5vwefJ;S zo;>$#tLfTX9#-duh`Z?@#a(z*Ibp%usejM0>7%Y>`6Uvj<7S<2rZf`UWGO|>8)~zf zOwTZ+7;V3pD0KMUca#6ERj)Vhs3CR=l|Akbow>-X6$%KC_mYPwI+nYrtmX?kY~yMeTrrg2|gBNV63>3tgP2egZygy|2WyI6P=M;&+y!34TG+1%TcP4sMRS_3r9n!$RIe=#CF&-AM==dI7IR+cA;boFJ5 zg-JFkwj@4|!pje1yV|%O1`F>v`WjQlf2FbiqsjWAk0>R65EgPYanyc%+2;M^7_DVf zU;UBcA4gVw=1Egz+*}Ioj#Y&bpOV8v_5zU#+4`7TNo4qxZBJXow8b1>LkOQuo1H&) zwL6jYM~J-9P4k|u{}?GrNM~cm-lbyyn?Uv#PWS6HKe zXA|!~D>NZpd{@xYQ5hrphqi?EU|M`1w&u~ATeFk51Jk7z+=u7Wb>wun@1(a{4x1Mr z67a~TdlKmB*1qw$&YgnAjU*FG)#sTWUiKcWGDC({?TC@aD%rk2-aM@rOBBvPS?#(W z`2U=LpouYaNHFnMrD&`VTn~X;3oh*-tsaPwb9W}0z2lxo9+H#NffsUu0hkB^Sy$S? zfBy1dZ&YooeG-6#b?1XbYKB0Sv^@7ewfHqcz_0Xpd;KrAs%x(ZkZ7Q-IThYJ3um_T z%76Q{>xk{vn5FbX_XVAY?{zDKp1o7(Ntxs=iqPRsML;*cv@8=tz)j(=Uc>@+l=MU$ zKI?VZTgFxkdylWfW^2BTJh6ddf|CQTmEhY+ti57XHsMS9@c?Am$K+0?cM(8Ah)4Uz zwdYJx4FPxQ0Me5ClpS?b zZNp}QFlmYu*5fr0?qBVn=TlyZdvHB?*%#0y-(=ArQ&sW!G-pR0^x3JgY ztbJGLwH3>bxCm$x#$&Fv^zv)nr0Snny8)M+Dv1=$?o!>AC5KNYqv3rP# zi20X0uQ(6kr&rrPw!*A9GyC`m9`^mh-Voe5>jFx5ScjWBMZf-~JOIJs4vU##R3rd^ zPGD`KxR{nr+gX&`OLDH9NHVaRvMBe~`p9Hu{%}*wnZ%C*+pz^!&Tg%^M27&Q_7)$^ zuVm`+jr=S}-Qly`+=#yJ38!@IT_5#Q_!26R;mF>WQKWqgMGX@wOIO8tw3f=0-B=R4 zI1n^81OW8F?-_lykFc@B0EJy$c#A z%h~aLwrRhh%(7NNP!~mrWNUGIDls(d5Q))AiBurXcdY~wJOY>5PPtq%HBQt z@z!;%CMS~WCEaXeKnAYem!ti9_NJFH9cPG&neN;%52CyEVZxgOko$c*80}m2nGZ8D z*GG7#t`c3adr)DAr)=DZm6D)4l1`x$1_~*3)FdPN?IBM)-%&a(!e6?68Qz+p0QUD8 z1m$7gd;#@iDT*>2+}eEKC!*$KqtLSF8-H8PFyyITJV6Od4MJ=?l@r~WfBgaDm(dvl z-rjka(C|40((pOg14$+U`&2jq`GmYiI6$`*AiF20r^w0a+d?#nQWqi|#%JJcQ~uVX zbadk4v^~GUe#d8npq`0l1H}q`m{^K7S}8>=pq3FQ>XgxW7n&69$*DVk2C@hPpn{j|pQ=f?dla79F750R=j*IY)O9Yu*PLl#vx zrQ@~=H^j%F^Yp6#S6SG>v8swpLl|wtM_qQmqhv_<`bN|~h%nw83&F}5$+3y&)<=}c zv945&^Z5`@KA}l7H4W#cl6yswo4h0;PY3`NU8G?-E^QKUuveb0$t>J*zoJHU!@{`z z{e+<PjvFm|#hY0&qULPDt9 ze+*D5>#4?1@6G=MbnDvlPjx;WiQnKPX7Pdv(kH2~oC391Cl)EBOrgARYb583as{ey z#5xPQj0&PA-98YcIV`-W)!xq4Sw)`331?vj=~dW?a#$wZW=H#XvpgQvg%W)S<((G1 zw>=tKGN8H^A0K}Ss3ti+(RHYQ{POCjfhgIYadeIh^$7x4^*Wb;Zu7aZ)!E!_OKpH8 zjflJkB~q12fp^l7_>=H5d1-QJlY<7=jC}hP1v0q*1Y9sGZC+7W-ir5dJ^odnhj~8N zPy;=T_f$6cP?l1Y|D!(~HEFk$m0gZOu#^o3By*4--`ve@rqrVB#uXD!<~Xt+S`I0a6<6q~dy^;QPfoVOQsxr0 zSPGA18vx5YWF-qWLsa6E_JJW|5rNW&pkoC<1pDUEdctLA!;^+$IWcgQvFMP3^aq?S zcQ1^G{}T7+9#RShYc=dPYm!XXZYO7%0FrPObUws)2rD6AZR-X)P(eK&V6^bQ(2{=)W8;9Q0lnRqG5Ouh`BIH8`eIt_JytOq$b zYpN};k1A2-QS!Mg8kv>mee=8MCx?aw2)s+RHE=0DlAlqv_c$A*UG{Kx2{#_hn5#_c z95??xu#*eD8L=dMxy41u&yhAYwxfn#gW6gi%|f*-++|1Ohsg2DBJes?uq1{XnUz8i z5m!OuE#aX<(Hp*s_3V-0wsE!FIa+lj%7?Byj-e_&N+C)G_7JOswqyaGhPkB#b2*yDYp*;toK3l8Ui8ZG-TiWSC7{n4-Vkt;43vUP+`(Tjy0znCeA!IL`~13 zim_w<=fhfgwk3IgOCN@V2IoltBd`P@B`)vgHQGiFB0wumrY+a&F9cYLuf>2YRWGE& zwrd`hrKX=ydPjr36J)q%Z{8CG&LH^UsNq`Fm$%h0IoC${+RAf$!URyoSOLr^wumil z7~tMKq5(+i_RGNYEO}X-t9%n(ze?yI*<*=9#bmD2$5VA>evM&S-L*8Co{SE25U_{n z{@|xhDPsa00BVcZ_NdS)9W-ISD*?H_!c?0&SrAARV^_gn1&4qc3XizS%T>47@Z@Z` z6y35M^SZXYX93&xW9u(@ss|H|g>Ph20?cv6?82a+gVdiDml`V33uD&p!{a@{wlChu z^O?M7F`V3T{f~%UKLN)ct8F10=uj1(VYZZuY*cZrpYMamM zT5WK{nHWDA)CC7W`*;ogJlLksHW=SRz@7POn9b@P1@N>=OZ?#qkK830xOb~1i`kei z<+l?zXLf&fK2ALWeL=ZkDSPAA)y?LTat+DsRKM@oM^UBd>6^BBp0FY}{BtCFJaDet zF3ivNS45W1ts@0>rFA@Yf1?0;VDgmM_4RQ3iHdIq^1*S9F%f_+%a)AVVaFxcWk`<@ z^kAv)?=?IT3}#|C%rPIi$FbzcvRy~xYnR+SL}bmUY4i;YQ+3!OkKP!F)E^(GD&qN2 ziF7RvDCq?XKqO*7*&31d9Y8PD04CV^wlvST{8>)-wmzq4SyyqXVPnd%C4zBP`Tt7F zZMjx7=Lb~FHR8}fc(VpD!2A*T`ylY?{f^3FWoTem;tn#|;kOD1Ec{j}% zgPkcL$&&$zpnup zR5`K*D8ovbpGdfOy-go91f^I1su@mIi4$zb!@k0!mI|W()-beG;!IwHdpEON;)1}z z6n)gB(r}EVN&Yj?pTrr0rhdMfkIc*;li=37rt&twI@3NSH)PmwUR^FocP-iEWnjA2 z-CIgq15ggm9i#4}R=I8DZ=V@S85{H^TZr_`3#A~yov2r?QOhjn6InQ)iZf2yExu-~ zUP9q>wyy<`b()=4h~;kdRIMyb7y4W6=n#gcU^>w{nu+1zOty?(4?+Sy__iq&X|9Gh zy_w3XfsIp^)i1$6D)>^-qtc1G_r0lptrlnKyV&b$gc)eAidF_$__i^ja=)baE92-g z?;KM(=)q*FU}|;S(%mwYOb1hu;fO0sEhSDgJ3-a?_PLSdu0d>c?G&58EjYa)OeXvS zQ1f4!NWsf>)wi0!{V9Fl=(Gtx$D2e8{hucjtxRVeN7h|q2hPl;#p!=B-MR>aLHofI zm0a1zm#%NB43#xvaeZ4JM3dvGVlV-De82hNr@Ay1Z{q(iTGxDfA5v_Q1Rf$J2#Kz5 z1k^1Gg$%)Lxx45F>Qw>Yp#jA`Ly$Gu5kmk%zO~1iu=DlD4NP}<&0mxRH0d99%(#bV$qDodC5jqE&V~#H;tD9#Y-wvmzgj|uC zTrnZ;e$W~kDfEcL{Sa3k*=~mbV8V0cN#jI$kmU^>3Nd2)$W`ExAq>PQS)>gOW%A_q zNNM&A!AxRWW!_qjTlIv&Q16H=9^wysHw$+?jj;`LG=zwG5VPF9!Qvfg%DM9CD0OK3;l4gl=AhY`2is5Q}TnSvp(;@b_ z@=I{Rt`|tnf!m4K`aoI5;5Qm^b40(XPpRZ)#?T%XL09RZl%dy+d6>dbjeX2DT+h4zGmd`I-rY zSEt?Wx|%)b^iEiLDCt#5ukFY5W%ndh)PFDfzbLRGp?qR7qGGW<&-!NXK7Y5z34O^E zd7pfySdR9IBK#L@-dEp)Y^wBrPO25StxFXB$Qg7qoPZyhQE(U(zfn4 zw`Q9~c7^{sSK2A7c6K{nP(R|okh%uv;Nf*`LVa*uL(pxk&0VR9Gr87(H>V+b%y3@# zG1WIj31=@^^PO+cQ!_}Nk1F8+fx#km770nKYx6iZ%eW#7)RU0 z<(;%HNvid7`I2A!HiNyKSu{lm9@`S(}a4E3-GdWCxuVl?uJhk%1qKzTYa9ZKRj}PMp6HM8dgW z`J(;HFmj*IPN<6iw>o$TXYj`HKk0^Sjo^PRU?KZ&%;Re&aiShXHnN$H_|BM#+@iuT zi8t5ZG2V5-qvCUdmgjEW__y$>7*b)FJ(nA{Xrt$A@0V+Dc7Niz#SrK#sQ0r+V$|>b z-(;HghGI$~M7x-WVgfugzCdeY9k#-Z)iphUSj+0MZ?1@S{$nlQlwr^KC*E+^o*m54 z=Kb4s{BrExyY7|y;rL6i{W9A{dNIF+Sn36r+UGb zXz@fOWwyjQoae&b=e%QsESmA)r^6>=cKoMkOz(Yx4h+HftFyO7pM@)=Id>ulvR)~2 z>^xq3XJeAw49)r*Mik%BSk5ZEMHIPxQhbcO0~*e=Z~oOuUkf>E^hf^>U9D)x(R#m1 zIGe#KwRLuRp5swwV3_F3i-g_ji>fIt8kKkpgy0+kd^~!j z5CoXxu4HxZ{=`-WUbe>(>Tsi+JoCUePLFX_wQ>|El=02#Q`v>v!}Msi?)v5Ihby5c zR`Pv0Nfq|5N=Q*A;6zF3mRAGp66|jg`>qT614v-&Tv$c$C2XBa9 zyfYU{3vrJq0Q-ajq(t6uPo{^5xepXjVnH0#P4wGZMuaDR(F0*7ziY&hVn4bP{v(?C z*V@`JofFSX1g?t+1AD*-+6VyvZFCoY$TFRi?cPfMTr{U#SF~Bsj?6`ZA22Ul>Bkr% z2|1yFj9VR+lkI0h>HzHNm_Vn|2mdC2f5ws6Hyk~9D21Fg06ZE*jw`a{qIsorf%c=R zyVLOSJ4g5M3)vzJ@UCqiZD7Ivp*z4;az(ALNXchI$`L*ClkqFzevg%$i|;~<3355o zC2kuck~%=_={#ufi=#n-CGmRuO0#THJyF%o1Fic!-vhpRqJsgb;!7wJFLd1hQQXxy zws%v%f4Fzz(dNd$k`E7lwRidspIep-<_fO8+PjfBLcD%$+)|cEf5<;rI{udI#Bnq1 zdgYlqh78mLrawTuBAjC&`ZB1r!n@V@eIs&yx)W5uo*B^N+HyJFiuD-q>c)&jhIM_Ww-XXsW#42E087NqlmMS-c&6yJ*g&hNP0$O)Z(iJOj zs}>gi4L2d&6*BN1|14()f}z1FGUc<)Al+%-y6W}O`%SB{;qY5NR}8<~mY3R3;&BB16GxhfLlePoB%$FXkcTx^S8Lul zB-jvP|Lp}h(N%SD3CZrNZdRKbVX~V(WsntrvXWl;@Uj325V0BUt&qLnUJ&2%xRY?l zye6Ah2l6_q*Zxsq_}cj+Gen)=BdAHk=Hctk4(`Hqqv=LcHc~4yRP|oOc>l%XG8?%N zne8hxWDm0te7g#ZP0Cq`zM_aF#Fk?~bKi>5LY2>QB|1%-RW+*`RFsTt1qwm@GE9B?Pv0 zB8>32eNzAK{M}V)?eEY6L4Jo@F!mGS%FXYU;%v>EsEZZMod!Cc-p&nnk7+iEVF$bE z=mb%Ha$Wn#`WII67PFmMI#X0C@ou!otnIbqm>;Xc@NfPO1SRj1HVu8YpqHpUk$kLJvOr z5V)L|YuUM7R$UrlP`^MlBE93cE&PKOL$OfQi0{Llk> zzy7X`>KV7(joe35>g|le_0Re$tcdPW8U80zBRioD&70P!&CW6qK@D+t<`<62_4bqi zZ-19)Dq1&6=Gc=K%m<&{wSS|b9$!2#$kdvDSL=`37vp)qz1#<BIw^7l4fBkR=*PU#h?r(|mTj}B(U+z}Uy2oYC6~CkENR@LOgp4{{g#g1o)TEi! zqgzzfSL9-g%JQ@!$s;*HTmz+s;Mqvsw#_O#lfPyA{nS%$L=*V1mxTO5P<$0yIX!42<0DdqMLgl{K5c4siq;bN7e<}zkN03b*SErN3QVJI-z<`(`gA$YbaJcB|>#O&XvV{`$lh2jU!{GYF z*je58kULXz*T(X<^W$i(aQy#=ueXefYuma-ae@a64hin=PO#wa?jGD70t9z=cXufY z3-0dj?oM&Z-sjx!wRi7(t<|5Z8f&e&rVQz$&oSF2BG+cc2}?RXD^#f1XjG*SHQxmf zB!sCSpQKj}((Vo(oHG#;imXBVg=l@H(gU$XX}C20FW&oAJayNJ_|CE~w>?lA!p6yZS2L{iMB0~R`O1LdAiyY%6HoDi>p_UG{fJ@lgIfoxnCyhP|}j)z7{zT zESt5BJvscTxC`X7nF-X$$;~P^cF)w|S7YFM-95R9Vg;GsG0fm;d5rAnx-nhhv|~zq zh7xj{=e3Wc7|77#w_o0$twP^#s4~x1qkFINH#q}?@PHv)Y^J2`bGXTQRm_*Mms$|j z0T@Wi&J|Motyhq)hCAQgKxr%cB@Xy-c)a{+GnqlpQ&d4{;4N>jFN#P<+T6}_R@&M% zME4ety$hZc2vm{@D-sDhx1DWLQK(W0rSXq6dVfCK?%e#6nV|K}KyZhn{joiue64Z( ztcT-0rd5uur6k62WV9dxy|yOVp`&sxclly3onoCEqsc^P=}To*c5C!-?fGVB^u+;= zLca!u5S5t@jv0acumo1TdQLh9x0}TP?VG(@HW*5}(OL1iCr6D4c=Vx{0jPh1pT}dE zoqkA3LAf@Rqk6%+A^j#YOJlHw%N} zQ@~e@cnYcOQB6f2US!@V@lH$ z%LX>0fA!1PA>q<#WYJIB9;b~<_H)ZL!4caMu0 zi+l!xj%P+z{DS4ckk@8%EzHN8X0LvUJ|NOlG#OXHr##vWM6d`nzc4Q+~^Sd=ies1jG$DH&0Zdg zpI?^}elDmD|9(1W*vMT~A|z~UceRb`zXn8H(sqlRbTqEh9O;aA8V`Uh$jMk)MI9>S zn{7{ueJm#eCiN&f-rgEfzEr0GP1hrU8OY-}X&Zq=%&U@)3OTJ>4SSVb$JLwY2idAW zEVa}GWdRQjF4&Xjm^*g}*)12T>Pl?2MIMGScYSF^wLS*X_zgAU6)Sa>1$5q*14l7& zof7W9uS%WB5CXn_nxLcMbKfr)7#Vs1Gmd{cH!!;N7CaGvN~lf(skRI4CEtxmFJ)~O zR;IqZ#i2?D5?T2gmow=}Da*Sn6M?>MPFDKbzl!lHC9=-Xe${G2a-Rjw`KU5(;VR6+<5?BqO=6k^1@-DQSJaTWcTW1r z&2e%4+nR<^2QP3#We)!BUi637f4{-d)|o2efn zhmy%Rts1gq9-}U zj&5O8XN67Z`d+22zL*|I9s2CtQ@{bOxYJqWaDN#^T(2`o5#Gk^GbJCiXbGw$4RW z@S3w<<3ti9LK_U8*7w}@u78%%U4KgG7Or|eobk1WnuO`z2;KGcymvIaJypeE6cYl< z8o~i>PO$8av^*e|0%7e#NU4&pQmZ4_in8X3G@|MggdF-8H*M$T#8;h4MdQNrnC>9X zOy87UzpCoJneHZnWn8ed;lnoYTBhKtJ6W($_`_#pJf{hvHrP|3ZPQFCIk53XJ5^40 z^vD*WtH%}cF3LKPaU72 z++IYLZIxQ1Z?$7{)f%L6`Z@y8WTXeZYc+d?eMH@_H5Dj+lM4I7psQlBr&3AmTifQ% zGr}ROgsGEl9bzZGfRzaA$No8;70lVf$vbuytc}o|8l3;$dWpsJvEiq{`075cv%u7n zaH)XJYKgU!V6W#41>n9ZS?_&^4C%nDJbA?ppGIv$h^9OEC=(`GV8&p{V_`2jlAEXS zsDhx8N8_dIuQGmLD7e}gkjY^DcJr3oEAG@*@wC=0hDK;L^CJ*PcJE&QpnZKfuI1mpp%T|ge^5VYrhy>txVwyB?)#Nu6q+59^6 z*>F24wayZPHG?UxV3MB1RaSY?C?_?EIa;Tg4+f3sMV_$K!Y^Ko*x1-S?~fF;-Q1`< zI>2V;q>uWPW3nH{H8fsKdQwE{*Qfyrz*?c3ov)Gg(RdUf6{JrR%S=ygX+`<%YLF^; zB!eXmejJU!#_zRCcRzw3hd#B{;5&taUigcz)qc^3!H_5YI6UL#>Z-PWWX~Nvb=0(; zb|jfz$8w4IBvdA_qnL?Etmd~~!Bp)u*ryj?=#rTe>kb?p$E^a_rqRs@$+MC#cO4+@~{+Ae=#=999 zX3fxRcJ-5C)W44sqAW3#>!g0Gw@|sWJU*TSNkM92!gC$d{k>U${O5^F4934=pP_O~ z;1}bQgRh`0iIk%&MhXX{wUGB39ys}%*> zT)@|Qf#^N~X(xNvP@9=5>qepMd~c`Lx_FW=!Ic_&YxS=2&goe{4<~XCtJ_nF)?LrJ zyQ_pY0%nu%g2$>f*l2)nKf5}h|9n|<{J~^ri8c`J$oy+oxwBR9NK)<&%+$1rlrx3t z#C-Lp^jzcb+l8ejlFCK#0iFB%FqsJAMh#RPD>Nx=v!0f=!wVrdG!OUo+^)6*>7)j{ zEJ0O!TG;}1A?;%HMY-6I?~~EZ=OhhWcvYus8i8u zlyIf2TK+}+<4C_BGjZmL;#D~Zk{IuBpILRAKu+9$JJ_vBUE=zl5K-@d(P22@e&^+M zu#@l1VEP(((#f0mQiEKDmSW`r^aVV%^$O8#)VT=m2<@6r>c0>tIqN2xM|4w4{Gc~~ zi{+gOS(W~lQk{D(vH~XjIimg6A69?UKFwHi34d;?&>Qpw9w-bkr_cy}y8vevWp;pvB(HgW>tVzA z7|ma1{)wd3PT}JSx{B`n?06Cm_F30A;wrO80zH<-0ydARjcOoImJrab=Zb%5Y@Ag# z*_mpIisf!O4ZRoh{`?e_cb?$^wflTcX{&y=O=3~kl08ioU5Z|tH%T`4bIjhsD7ocr z)h3TE2e-i2tpzGIU?#f#P|8PDd2R{ayHhLKH|3Shoe1Gn#E||szMB`GVkH@mLgSCa zV)6J^H(wwJU!eRPDPVtW?Wg{XfZnJ&Ukzn>Ld=2saEKlRRZ0_xThoz4_gC?3;TV$D zmufLT=*ek)YFIUibx@RT#q&JgtqpvD6qg<|Q#;8F!c^UVgdy(BAGpxxUPDzYU=sWH&C-p%uX zOD2n@nr*O45$UFwNp*RLU*2Td9vejCBUSr$u%e9x{eOjq4hYQ=C z+{7%uxgW(6yI*d*t(eM9ZJU?62Ba5r&{n#*xn<9=sTAUBT4~YVAHzxPyuOa)c8--6 zvEcL6Jinz6c*&`rFW*+BMp~Fh?#Gi5uKs+@Va7wkb5$+dSKh`xmcU0weiJ9?Y=1p+RgLR- z)maiO7Mjea&ql@k6P|r3N}3PP&UV|4O8!2a1XKv(m-xq?TvoeJJ6|VxHyv!JvTSJz z-{h{XA73x}SrqMB!Ft>yb!P0Z?!5S0g|x0f6s$(J+wox@zFVbV&$Sf}E?c>ZEn7H_ z`h;;L9op+R>Y21x&fr(e`s{Vp@qt+46?j^1Q|C<_BsLuC0wr6s7i}vin$lyp9*~J{ zjupXo*NDcVC6!JgLYmh)Y7&a6$yMQ2Fk$p%mq9})aHfUNukJQt4U9Ce_pv)?Peu>E zAYoT4iS%?t=kWdzHF+B*4BGs1jY z%WJJpUMm|?s&iS77o_fAP^guWx##ESf{`<~d+sxz9j*#5+KU9rd(Df+)ELIS#;mr! zZAjScd;1cbSYOgrdvqpEGv=?Mz7jDX#q}F;P?(B^GGr&h?PQ^Cf@EUi>M=N0 z+pYJdkaNhIFkTB0ZRSmBE!pvGnbx0i-8_v8!LQuo30^PklXVuq-`A_)^1XUsJPME= zYFO5w^LmWHm2NX>4)Xli<6$^1RTCG`HmLx&Z74BzPupkh7JdgwYUfT5og2L?JCh=t z&qG$K6UsV;WYozGmxDkps6IKATh1$kc0Wc5h?p+Xpm1vM%Vk+fU#nC|)w*B(?F*kb zUzZyxhp^bsAWFw$7Aj>SJAA&XGtg+tgzXg1**ZT&U7VbO^v%HY=~TVjJlJaT>(X-h z0Dc0(+sxsl5^1yT)^MTGT3k!*Jn0w#b&1dOS6+ayqJq8w0KkvN-eLDFBq0o;@r&9>3HgbI7skn8lwi2^!>~?oevdXanE~39inx2QBp8-7~Z~@<=#TsDEH787dAE zPuqESep8zrXMzJ2mE3XDuazNM8D82fdOx}Xe^rdDMXFvqfYk&sS4~GA;ul7!bF`}V4z)mx?1gzv@irmG9N3r`Q9X?WPJh0%vpQj5lj&o!-Gr8(xMVU zP+)QL+p*ez{n=mdVZ`JgyC&v#m1yuaqg0nXHSecu!`}Gw9e9Y@7M_v8Ga<1m`6fG_ zFT$f#aav|Or&f~A2-*|Mrq08yuuRvv9XMXw<>a(=DMlIqmRh*J#rbxlQ~dxPnD2V zUKf$D`UY+^Om2wp^putHaEE(gLxaGh|8vuY;cP&zCo&8Vo$lHDRYrxR;yGVFo2K&W z&I14Wa29}soC+S(qjP^hA-||#9%9g9iKA?F7*ck{n%C-)F zkPhr(*06o^5zUSbu;iQ3({AhCkZ9?YYi0toXYLwpUgFPGd3V4n`-lX-Vthvpv6|>_ zyG!%F9D-*cl}XrClMOf{MxDuTu=hR8u~t`J4H8*aT(3xLEoo8x{I z!lT(MNV%`4E>YR{u*oFo%>b$4d8?ZNNb2S?`aLO8GEN9wt>+KG>avT$A$jYku_?M4 zis#Gnnt#j$IrY|t0dI*2eY6%66y=eg(Am=GNw2pgphXDqxdK?X!eCyoQWjm2RY&z2 z;j}+f=3>^?Ac@ESCtp(yYp>Q^#pS0TzB||x_qENBI_m|=S+5BW50=0<9bxhH!1!Ce31NRt+#*k#c$sCMaIM0h`!e@9`QqVeC*k*dPno(Pm5GHg_$+$8A!A;(TiVQzU(DEDbFKNm-nue z;`vj0*qBwry|?i}*4eY3`qNutj@An#E>BB2KJ`M?Q}2*uqf`=p9jWDBI?ejxuD}r% zo;cNh6c?++@vCq(nrZ-@?mvW8oteVU6&eP0fFgS$F6r$W zhSPn57b8A~3fsoDux{x_wZ}d82bs+7!Qf9yyziUO{kO1bwmQSoh&<-3WyQudVmUEo zUz^`!MsLM;dKPZ{#(KBUcOk<0ExB$*Div_lZq8Tb!1 zNV8Jm3ui|;Maio(CC7DTA}|{br_vGvh4jg%{5z59oST6r!4dui_iU|ZCP?mM-(OH9 z8z$peVD&HY$35YWwHtoRA^|At1a3?DF=piuI!!?h(0>CHqJo*D^R5k=w`c z0g0V~=yXnl@B1&pA<>6UsWZS&>_rni6IHP=nNTq>YBIdac8QlW>V$fN<*Jo+YMo}J zy8RkK&0oH1>?fh-U!526#YU`mEnl1{TVSJEsaVbRqSHjs-+^6Y zf>!?Pv`EGWAgHU^^MMf#o7;`t8)Z?R| z!Te^AHHWcN*eM+Tngr6Zcd{)Q5y=L=Y^Kagu` zI-YF^rH~OxDXlKF7USmexIKTmiFQ5SZFhd?5{AJrHw@gP&R{~dEDHL9j?bp3BBO$| za@!)&K+{!vK5gc-Wm=L~B->BK0Kb~ls^3$vS>7#|c?V6CgB=73lV*P9G0ijex9@W& z0|EllSS>zI@FGi9axhvV#K4%X6TKM?{x24|ku5?n+vIW}ra@;?4{(;>%C-?vLn50? z7;R1$kx}iBmw=E%%EA$U7^B0pQ`|~eae>QF;S^9zK&$#yHO%s<8jG~qgI!+LsPJJ% z$b&WI#p=s1hIEI!4yrlIL=X4xL95KXf(V$7?aPYb^iu*8I@^DE#rDZQjlNJXeGkc4 zD9#G@z)5^rFkQgp(K9;}|rWadoJA5`& zddTKl4y<==YRZaLvlxLcEC;Gon|pS;6d(KV@J*UKF*KaCO+H_{O|WX|Ih~t3;9V>8 zTA|9U8)iKMm{-IvbD zB*k7YRWgLl$fO&uJLzK_Z#?&I&$)2_NPQAD*^3&OrsHOClSn)m#&YNha}Sqv#ha>= z?!jdull!;LsRo4<)jx+iSa@6NtcJ!vZ9IfDU_Kne|8omorLe55R3qU|O^2L`cQLhw zcUytJf7%MQ^`x{*I?-aX)sfH!3Byif1*rPlw2yq}1ogJkCt}&38qU0?$J^6Q{k>rO zC;EME*v^H;IGO(n$&-poU$Ya+s@xX3AnUaw_}T6B8XGM)WYO?+Of{>d7h`ArM-byf z5JDGkcXFq3v{~ZC2Wg|W-*X*J+|?c>_#crT;DltHS?6Y}+5UW1lf-U+f4+g`?3ql%30*PZt7zz7}(BqW4aVhobuhCY6Oc5bimXqY#vcG5l z%^G}teSyDpw1NjVm_GL-sV$>;evoH;Qqz6YI-jTYx_?BaY8^ZO{5T*A7`sar2n+U- zWASaJ$)AN0ho4IQP463&rC|1V!b5i_7ro1fb8jGWtMYucrqJ;~<{DwAv*K87h)SC; zu~yogZ4ndQ*^G`a@0Jg|XWBm_PFwTOyloy&X(28Wj^nB*;}V}b3ZX&;KZAIV9A7m& z05RMJQ^mmeX+Ji3{D4&QKY52Q&&mFA4Mv#qfw!13n^Z19FZ!_GM^b&8x=7V=`h%D9 z2Nlu+hTnVp4db5m9~-2hPd2pT$>^2YJ4mIp9DPy06PuSXI}1h>G6k(6G4YAHL@1t# zw`|G9p-oaK!qPw ze$Ndr$g1B7=7z7K(Sa(?*03$iP;4i>O>@3L&gk>C_ma~vRG1Hq2P~Kky0R`9C1ou3 zyO@NC4vY-gA_gly8EP+K!ITjC9@AayU)a?-tw8)j+Fu1QER=HY3FASfVug%R#1oEL^j z@R!O7piDt*|N4bDm%sm#egTiFwt#P#o4W?^dC5x|>B)q{qF{^BhJcj7yKi zAkEpXlsOjMhf4_J`>_pv*Xbk2Cb*#}-K<*gmjv6#BQYmvTs(m5+4&*2_drz^fv??C zf8}zYv5a%}$qpz?d4(HHzooO{;GsTRRHUfEya2b!vb;?iPfB>_j>wmg=eY|taj3vT zox|cXBANit#OK>Jk4)S+KK}c4Qe|u{9K8y)2#~)>>Pg6|tMd>`l1pXD*$1h~^ z6K)q$3j7VT%Ol!ppm7Vz8-ip1MYrT{XugO5JT9r`9)-)``Ax9)92!z^d02>CQn2&S zpZw*y^0y=w;aw)-sk`mnkfQ$fYQSXXO*-OAYv~`;1-R-EZZ@l_CUsP4cYYxd_aW7!Jr0ArWag5C!C6iRqeugfT>@vJc4l@q9f-Bbx))@Nc=(tTT%6rvZs6A7DRAieEMADPoA5ts2-~`UJm%^P zQFM8LiS^*CqX;{y9zw?F;+K3y_4RW5d`?4kg4VABf1%rTd7P zhVd8x!jevJo|kVtixt)3Q^8)IHTSuanU|fQU3(pqBKxhB8bu<&%BBkO@G`37YP?4S z1{f~!OU#;_kUogXPY}F0yc|Y1V<372XkQvk&hWoQd9SR? zK%~eQyX=2{-fNhqV2>z0ARbCMb0}LF&I}iT*zDSm6j)=W<>P;e436r;LlUsi_1U@> zwOY^oU@px_x41j37SU9XKU@5@MXfHAM_Kpq%rAP3z0|yTD;^!j0uZB?M1=!$-9H zu$N%t5c2dp=O4OH_L|;gw9pg9+JMmuacRNd0v>ORmUlEIBiVgY{5n#6ecu1920X6| zDt8H&U;I9+V|lNUK51MB4|}ope5g^Qa2#vj_Vu(rzu0;wju%rDGu`dRV{O>|jGCu8 z@_-ne+I)Y9n}(a} zM#Nf23OGMGbKMl$zATWlpM|cr-sqC%o7tI0Nh8cN-{=J*BlT!1zuC!%45N~nekEy+ z|LZ(_@5bO8O0V7ORkWlo0oy&!x=9ck0j6H|yw&jHCHPoNv4Wx6eO(bFC;+>}jDY6a zA%_`3LQ0~t4+V2GVI696%f<}FVdwyl>7vn!!$OMu#=1g>6>JSVrl+@v3~w%!7)$V_ zV9WP+PoRjS=tG4v`HR*67pqOj?+usY0f+OzR4^GwV7_WAZ|=vH0G&KPkqzSrbW15k zW_Gbr)e7HfT^pheX@u#BGT8YaJgN3&V>wuwmZepIQG-X?!*-;gC`bA!5_*KBV%^kH zcB`5CUmXQsG$@fZEng0cCl#FpzpPrfR`r=M`GJ}|nnCFlMi7|sW+y2oujhxO*-d;I zjC5(*@5DEfiG#wD)`!J;JUX{TXgXRovhISu3I?YtWM=ov(vD^)$2}9;4z9@`;-Wib z6S>#Gc|3Rm9IjFdhl`5YF)#xo_Q_-7+~_55^kv*@wV&tBCBx`>5>|4YAthmCFC6$$ zZe{Y#UVuKGw`)z2*Y#%XEN9o@E}=uUeICOa^>kFnQfCBro5+vfh#f4rg|X6#ti~Zt zbD=J2IH5XbNq(B!iojul`5#NYq1abQL>L@GnDVMPJvM4$y4Mo!Ntzh1lo}Sa7;dus zM&ANvDKCuZl{(d%3?>L$0uyCNtkwImgT4zIj2-jwHwXuKqy@&A$^fAP=-pY*C64tO9z2ZFR4pfutfIcm)w`RW5LsSEn&S{G#OCbrF&+D+uor8J^f~!eAIY45951C08~(v< z!wUqm!}vy8GjH%^fHaA0Dff78G-ob~d{P}A9d8Q%Ja7PkE@R&|=<_?);5#~SF1cre zIn5#1a$z2Oig6x}T%h#fyikk`RGNZqa;Q^sNjg5UzNXLz;b(Cc!+g?{CxfO>nh*57}y7YzeUuBp{Kj{27U z;KMXcZnwE2T$yDmOk@UJXA#H--JAuTA$^ocv~t_AG230>e|{|$A^W@92;D&4rJA9ZsjLm^$%uC4$;^;UZOH)fs*F{9QK?Mn>_>Z zMc5ewtW`)PL$u{m0Ku zf_D8T=3q1i?5|KS`kxDg%*Vr7Kg;&o+7XQEKC6{`Rw(RU2mbqMxFzVrkV?G$Nhv_k=KU9P?frz?M)Y*&D#B+Ailx% zj{ggjtDTUu?9pMQELx0?NB5;BvVNq|CHpSBL=$wxT!619n=fMokYz6ixcwT&(b1c2 z<%{eo;&Nzmk4>{YoF-D*g-rPZJ9J{bnHke{cQmUWA6|BjVq=ac|r z{*}^VQdE%!hGZ5&O4TrudW5@K5c>%S=L6~(9vrb9&S2Rlotg}$WHFPzZ5Xqki^hXX zwkRvK9#`g9Fo^ay)g0zc+J?np5*~?&-V93x%G@@Mm3=O?>;Em0o5cS1B`+X@JO+Xy zvTx+Eq_h-uqWvFdP)c52KAv0#!-`Y_9v==tQv{q9* zUK~WRcZyg)rcpNBM0O*JvCEQkkR1ET^!)y6yy>)icMdc81ji(rqMGITLP@yS+H8Sh zB_uBZ3<(@ZG}576l6{i4`HY|1i`iwbplI3%CCI9vP~qnlrv#Vb;CU>hii#53!A~g( zr|}(<@dH+HPxHIg!i$eJ(Brt@IwF$Pz1tx*Aw1_x|K;B((Rai#dG~Hq-GWOkTILY# z-*A$i&s9Q~jdIfQ?5~y;`kZBEINb7Y4D49qC!vemFFe@F7pBq~&Gcyp=ZANh|9^o1 zHNP#*|2O?eH_pXmt?EKmuWie)Sju83;$e+AS}$5RYsz3;`x8ogJz zPg>(;-CUvc|DG`t(7dWY;7rD`+TPG*aRHuOj3j+AD)@Mtzb4#Yt{q=g<2G$gK%lSaLH7hu?>tY0Rb%j=E1}rsHYKTJrA{d{7 zl={e&4Y%XR;CWODUJIYq=vk81aT>M*362Fi)8Cu||Bcl@hZX$}|8|1O_Lc4Y+T@~+ zI;Pysi|}sv!OFCmfbdPZ_rGF!zxmvo?&-g>RiBm(FG__h>oSS$odXt&u`~X8{{VT` z55!_sinH`giVCGZN!%r7M@UkMN1*U8z4GJpE04x7&Md#DS|~kS93<%T$C?$_tCo(0UO?h znh9mI%3Bnuf4OX5cRvu3|0}>TGCei%G;M}JPQRgh{7|EQ0B@p8$Zl#k=Syt-PvfAv zasLPLC|MyC z>cZm^OWw#Ge=foqzDYx^LOUc(l3*(^_Rb$oaug}25nlsgW`nHFVbDtk_vl@rBXV}H z+%@=R;H({1D&a=mPuUrg$d@b-SWIJldH)oADz=E7Fkv81l6M5~Gp7g+kq}Cipqcl5 zj{5rQtKdgEf#G8@b{mOT)j)Lb@)1GMuH;?xF}U5VWZWSRh8oS=40}_QUa5)G0`EN) zEi>{4XERodo+;>95J)1mrF*61R*18LE>RQ^Gt&C5b}|sZu_fBl%ePG{EuPUh9t_pt z>}j%HSY{(}#{mwn*V^M%ec`@lpU=JSsA+nGFrr{z)I#Vz%sk;3ibWR&Fv<*O&vsqQ zZJ;`N-(1Q+TD_J*v@RLh|w{aGlq-R z`kF*pU&oKlo+#!tJ@qL`hk2##dML1WoX^ZFQNO{)QNx6!A1BRam58u6$*Y_4>q30ia&*;paWb%%!oJKDV6e-S z_CQjIa8_LFj3V$F4JkWIn4tT-_qCs(=uSE#!`+HFr0uE~rv^HP=-L4bWLLDJ*mFK< zK^z|M{uXi@Tz`Lgw$ai|?m@>6BZm1XB8#)66(@UBX9G_u-}|~lMJ~!e_R8RCuig;J z^m2J7jOknTtKOJCFuMNK$%F894O3OEK+HBnXVE#!7HDwp3~Gknd{x2q4iRTKju6c5 zZ-b^i8YB{GnWgVHhZb`C@_(`~*JK6`t*s7+P#A!oPQKaibS_?A5nXO5T%hqgJ813K zGuXGSvZP517BO7JX8Aa+4w3p~(xX^Zs5ceHTn7;?!Y&MdE*MhlH+X>rGF}3gaqD(b zZ>@QTUBCvyie|JI+}@YPoU+K>M2$-!I7~a~5y-cEn+{el_3ucd)P_W%a65dv7^FzY zXeDceC)Tk{>talKbRh*JizPXSOrpfaez=jIKauD#l^B14mq_Ja4KAB^L>qorf@l=? zZ*z_45J(SOd$J-&w(Ec%qprK8;ny$(993wn-hFi=m^%$U5zG9{pEZ6i1cqvs+7Kvo zqyEf}=A{uA&BJWXBJ&J+s@{FiQ^DE0*_M*4#!584wMWI70Ex{R+09Z?)@@aPhfTP3 zHYx`|SfhS-yUyPTDuTcEp3JccIKscyvDU;Yz^fT7PW{jieozqyu_UqDHKi!@&=yLK z953s+p#->$z1R$$1U;K)4TrFo>jTnC1_;!Qf_m5w(6%C*o1sQzs@j`ma;Jj+dfYS3 z@Ecwe#T!`X3D8216Se=_F3MS8DJ^<*=*39hc(uvQtq#Sn%KjN zKw{~m*cs&W(oO+dZr1KGRU7zQY1~PV2BQz)io3IrboIq?yT5XUNKAz4{$7zyuk@g$ zsdFveq}uT=L}o*}H6x>k=53YR`vu0*^Xpa59YH)tHmA++->TL&mk&x0?|N+2YM%Vh z3qgj990qUO?yjU})$cY0lNC&UpjABqIc}%Nl5Z;2%9RDUjH?3&V_7Bm*C=;ljNJ-e zO9)Z`F*5VTwCsn=(7E`8rIzTZw-Qs7O>(9j3P%CbbMl}3r;Ae55vQ3TcfeZIRh9K> zeAcebYPc2|%q+Bg@9%Z%^zKf9LlC!M7dnVW3L26VV|%~qb!TXxy-}R?r@rrTHAdv~ z`GDgKLspZ(smtnnkxMy`Vc=Zgmn+sA!0D3|z};!#*SXMu3`(BPT1Gr~)09(st^C>A z$T1U-@}Ng$aJTal%(%!$B^8Gykj%26I7$uKLf3TYl^4a<{=vG^jGD^w}NoOJMmRcPRI5+dEu%&K|i7t1w*i7wY?sK z-GMfCB2>@lb_u9Qa7u+7c_1};5U{%NLe)r|&h|%;2)@dr3i+<)ypYvXE;tz>;%qg% zaUy@{ARgjno~H$Wsl?%SM7m`Kl>;x&opi@kSI73UqRNR_^-lozmDk`10;~)O^UtG5 zacuL4#snd+Ut#au&#WzN6}o84__&EO{+A1&?RIiE*?r-H6L4f;VDy_44s9LD!CHA+ zfmmXFq{)_Q0q&x%l~uY;?6_AP4?f^h+XJ3MJ+m(KF@{S$yC zaGBLJCOBY2L7FwyHoy9_SRL02+eOb?++Q_1k%E+ju?ASw%u>TwwOM z8<-rH&s#z=wcR@unGWM%U%v*|z;8E<#&8=&!`=fQDZzxGBs2&6Zz_ z<)_I2gNnyT-!(}g%W5_;dGX~->m|cSn~*_{c8h*LF~d9H@ViU@KwCbNUUfVho+Rs94)kPQQg0Hl^0(%BgcFbVH|4fa@<->3Efu4@3yj!&Z1hpI|a(1)Z+3|f$+b}W@({MTaPJ1<_P z_YMmlVZBi_iF1ZKla_FPfEa}O-f*Bur+ofclbqC%H=6*DeLWP3kd7aTCYvY5J&rHG z?zzy7SO-UD4nzTl9Gcw6F6hmp3YxQu_?(1zS%u#+(vG(^%MFy*z|$v3<`BKq_v3w} zZ@I3+IMOaCV;1nMzon`BaC5~v2}i+MR+0p`PinSt@#7^v?cdXW7oWZy5T_8q&+I*D z$7#-NBZK$(NOgkBvsj1P?Ov;SJO*UxPIwc|33L5r-^K*0MEp$wqxA2)Z5lmF&OA;M zBiRdOC!l43b4VR`B2-#p;q9KSl2U+$%3AvY<01)Kdgjm(oVfA2Vbai?9ll`*(K6yJ-@Xj3oPw$EoR<2dt~hm#!r_Iw%#dupFY;Wp zP)0TT`##{Rgu#dDcLyxW(^B5+8b; zgkqi&6H|){Znm_qJ)p>2tY?;3TzCn*c8{OljNXi%ukrD)yhN-UHyh3&aN)cLqT){(~^;{qq4d8_D&9tE|{kWv)Jpk?*o`? z@Dc*Z&o&ofkNES*8mn8AMd`j(%X~Y%XXqS>!$0`T?OoXWDIy-{n{|P-)vlCcdYM5e zns7vZE2xjqliIMKaiZd}WSjQ)E@^|8V^>hkbMMfF3Z#R`yng&3J3{W%1sfF6{R8Z+ z7qb-yn_Yld{Uq*gI7HL8_6u>S%(`1ItHZ%F0jph47wl&3XO;v_^!)jp>%rkQ&O=}6 zV){)5hl;_wSqC6&Dji4jtktY^b4_zpb==h>RRE%l@C;n;rHnV8Xfj0?=H3Cq;a?+h2>Ru%n%pnfg445IUIly)8gv;zvz0$@W{5V-#h3e z-C=j^q&v3lq+{Fe*tXTNI<{@wwp|t5c24bm@BKXIy5IADsjJqiT5HWUIp%Nv=NK!y z;RJ4ERTp`@mmN&D-(y1((VKN8XA7vnfR2htSGjGp@|;dQ4`uf}d+71%SSN4A|!=i$d`a$L1&2M$U%$a#xU2$(Eln3m3@;Xo7flZM?_Cxa4XF+Gu9_eNPWFJPAKj7Ww^GnE)YAt;R4l1PXUew$qZLEzAe{n$@e z+F&cDVVsuiC-!6$M zGCbk>D8Oc8iDs&xs*m*aKPq7!l9y6xZMLamA0$Hq|qkoVF zC)2W|h&IA+MRJgRXr7ceA=%1~9PZBicODxPtHY0o!->keBP=wM` z($-iiG?%tKd%R&Lc>kS8K(hu$tXr^?mY=An=w!JRdnHEGl8d4V|K-z%6Se1qj7E&- zlL16_((y-axKkUl?~~+i?f}?q+^tz@@FbK(swzab-B9BX)=KrUTzt+m_N!md3yFb_ z&go#q$2(gY$&GHNT49a39!d7^eu$Kpcx(H!Nj{e8KRT9ZWmG4_^uc>ha*oBUHwHf~ zD;R=8;o}BGs zx5k()Wm{sCvV2tc87?v6+_R_r0G8rE2wRL5aynVmsdRp`Kk|#qPl8=$ccHwxo0n*f zfcX?j)reN(bzR#y38#s|Nta!mal25Mi6WYn;!b*eGKRgB$WrDg$y;~jE0v7{Qu8e!o< zz|d#QQqmQ%$~U|}qy2^Et~u*a@D*Dw1n6UAN^j^Mdn^#(CUySOPxH8E(&`mB^>bci z{_e?)HdB^a$0Vbr>TWBj9T>&F00kdAE@bP{XA$n4#PEsgaHbJvi143+$P}>>#!7S zwyAOT04^^z>gv5jg<~9(vWDaO?2*$ZUV#kN+W1pyo(Ucr&Bm?9Gxe?CTb?Xvn_{A! zz|ea9*_aLT)o5L^Ei*XVL)aV&(@MooAXCrrJMK4uO#Vwb72)pphL$<`?y-zz?^Q!F5^G9gbMc=gD1|kRrJ0^~ts}j4=0NrId6O9cU?G&6*Pt zH!E|hu?fXVXTdfL2EsMc7;5*hwP}$~a<|tRH4UFX`q$Spx03FD{r^(em$QfD{Qzam#8a)JyFo*U`Kco>Vd^*cBVY7Pu@GdT2wQ~_;W`OzY)!xe`HCG{k2Q8_ooH9?y2k?kwU`8+0Ov6>)g3;y(U zFv2k(+N=F2Dx820?=aIaXmEw_<0t&uPELoi8_K}&*Z0q#{67eP{QJ`*(hq;`|2a*U z2LH66=jnR{9*5WJS+xG|_1t}{1Y!$!XH;8>Od8bq6 zS3W{xF++eQC+u+55rLBW_(N7)v?K{(rBgYq2lnOKb7>Zg(bRQI8d*y3Q$mnU5O)NF z|Fx$8lQ|l_FGMRwmjT@oX$)0EBviwG+XnoT3lmx&!>(wtWOm8(b|vg5e;)#sS41o# zx{7qF-A+i<>=gzhIP|2t45mN`N!elpl!TwDWRcErI zL8>sRJ#lGD&)G|}JugU%xyyN?S=P5c@%5p_i_bg)o)9_%hcofVS-u%Y0ynqmETW0h zo@6k1BN|Q|l;+!ED`3|I87I+4D~DrAR^#ThK6R9D@^Pwb!B7?|p5J>O>(YqW zWXiekt4ABVEovt;Bx$RixJ@R%c@Z2yFkAdAqA-=<;}Y=kDnVLdkWcR zI8fT~=m&nkLIFfT;kNnR!3_Y~8-D-VsXdI*mYp}C0#>xL%H+UvQk(Sqx9A^^XHuK} zmYQ3s@@2%;PN+Cdan{*pknTPKgQMzxudONe8HRQ2&i)QbcC@4ZWpvq#T1{yrAJ*7; zJ|E?KbW}EjWN6p-?(By{Mgu3#4KfOZUthy(s!3&|xSHPMa}1GGc=c*S$1`)yZrJAd zcsC0Pp6V{59d-bktd<>~dNXWOa}GC6mkVQYG8=Q+*B0OKr#TnvEEhGL_C`}HwOORo zIs%FOyZl}D83|KSgv8$cV$kO^dgBBV3#b)NHiWckOOlq3)2@`>xiOw5m6O=TmY`aD((;Rg?)`bERgjGWlrSn=0@#He-7tO|~nl7zbLlC2(>uz@dbGU09~sfkgrQAnabi zLu($nQP$Vu&cSmZTGmF~z+b3u- zz)f?;lp!3-xf3!PU}ci4f@0I${E-8JWvpsoi30!%#Giv{Ce}V7O3KbvVUr%d#zdP; z^I(Q->*?(}N;qvED&cOrLLMh>1~VALa`{ukArkaq zP+Ias9Ze(fW{hw#u%p&wv+h%)fP%b+2wxEOSh5Y)|Ju}m@K86uCRx9=nRvG?H9uNP z*ck$qWs5bN8f&_xSP*wXw2s&sA!$BRfi)JH$ExzlZ-h=*($JEwa}S%xD)iylv##8URV2&QDh#oVQVVnG7rgF2N>q;!&*z z;|pnyvu+jh3d?B*#|5>P`gacd?RY2Gs_+LYtMhZ@TEpuon^fw$*N{VWzv*T{bq1U0l+YRk}3~e3$2~9=2#CN6`^s z7cf3-9m*FacbxFI$BtJ+_*AVdUnrj^SKpoF75rk%Ed04WbW?%eN(l@C0|%Zw^2 z5Eky)F+T+;ZiFiR*(|_P9>S4@e9Wmv6SIEq5NHRnRxZP$KMk znV4?=Y7o@$E2YU8Nq zIJ@$nND7Z?N$t4b%cs{moai{ye#5qIZrSATtwix~Cf53s5#|LHA?nO}XXsD=c@`nc zF=oQcTGC1?`$lvbY!Pj-I>~0jUS(NpKf3eiRkhGgV-}dt@XL9(=-$fP>FVveo!fRZ zCt~=z+%JaNdzE0pAmwDX^el;(y+J$qE2AA*OljR3=Cr#Z{|PD%7h$X~N?`76K!pJWAH%W(gKQ4QYY5!z6KRw`ny> zF0L}Qh8Smryascs+L#(!7DB@aJw#Y;00x2lON>n9HJH9CV;Sn@12~EVHGkx_R&#)* znLYhEt^CO23m7>Pe~yS-1nfbTnnih>uYJ}~+wv{VfaaF+c${`>1Npv*p8p=yI-o@m_o6=sUc|Wy03m~u(%t+y*YW64$^zA>N(qK+$~9WjnV#NTc(;jFe=ZkX*+e<%;}r9hh<6Xz15Wv zoWwc2l@KQ4_aq_Rt`yXB1t$Bnk8xoHv}IQc8WPqgvjypZjrO+;qNb;&jOpHD`l}*~ zWO(6?de!@-&f2ata!gqAjvM#EBu_eG7Ck_$I^{3Ro z+|mxcW}-Ut7m$+D*1?i*j|Wd3D#ab5G;_q$qF~tMR3v{wCEu3ncV120+~i(Q_mgT^ zymY2n{gc~^)BjTA?6fagzrQd@EI0iH!4u&BK>59BbKg=q{K@&oXg>AGIo$l_fON1J z$1v3b&IOZ`j@sVC);Px#sZaL`9QE@jAEGD3>)kazZ)^`~N(Q@xB{sMY-ZzqGsq2cY z0Ea9SvaRx75eT_}y5p7an}kMO;{x%MP~o2%ez($PAxYMisdv0R);_5vk+|X|=ej-6 z2**INCNSm=q zyiJ4oq~lg@d+ECG?}US3>GVSH~uLKElM3K{#+YkemdB~g-m%@s%B^({>_ zL|WRVvHIu~(V+vFhpGa~C2hZ-ZCDut@1SXK4@n)Yn6%!rntNn!NfgmotP(rBrs+w^ z=31m(bZ%zi&YJIE71qrPtcAjm`)DZ~`;B64-d_WB9|Ca8wP8aj69kIra&rctb!UVI z(}uOY)%$w-<=Z}hVEj~DOZ%$r;TY!h<@&5Cped^p6{oG|kYms26;yLUi{ekbfu53s}#Bj3G(UlsDNab zYv9LfZ)0y~PkAG>3$#rhdA1_eBtz1&vU0UuF5kr|nW_wut0oAxX6)~iEI2b?E1+LXG&MXrTj#fx!7);Xm7K-B3XysEM-&KU~{Nb zs&zcqsy%i{aP+`_>`)89T3P*vgVyP2H9A_FBjoCDWIS;|1HW|44R5AW1!#(@OCk`p zT9uG^Tx{_GkF?l|Bf-sFG(SBB>w8NZwi}M_UX5jHh=e07GR9e`JUlTvQSVyZyC7AP z$&gd$$*FZ0G%^z$DCP{Z-%}fd%PUU@))5npM`g3?+$23=UG= zRO?7i>XO}C?r-@uh+#vdLC*h!n3ey7n9(?XYYqeqkgHcFXTW|KvkhXqw=ii6_?rVVe}*8=>5EG*q#E^?t9cQN0@}m zV+nvzF_DGEeZfpKzKz>!Mv|@Q<*OcNvQ%Dh>q~A4^P+&|dV^?_02dy(&Tb;x)AP$R zU2Cv&K%C!Dl0g*P6S}R%ndjt*a3x)* zS?uOQwJ~bnBGVmHYhVu281?+3kn+60UJxVXgO-{bpQo?K5!Uhc!O%O+({qX~VuoOIlw(TTi;R}Ea-n>6o=M%!_rOYC((X>L@Ju8lK z(qco228t%vJNHBg-}a&C7;EA}V{xzx7b(<^O+W_A z?)piq5fK^>%zTd5?W&4yCDRR~*eo@pH#G3+IzWUsU$3e7E#0V9E02`nobJl_W-ckn z$t44(ba!<6!4HG>7-i*fG{(m&6AQ4wD54_kOn%2V&KT6|3rvw3 zR%mvnv0CL;B@RG(Gq;vxS2KC3#U7m4s!TX$2A(v&G0iL2W#0TZepbDg4;G)`JH1?P z7!T%=DI9Jp9rBu4g>|s{DFXQ)*)R)FN!>l{L(>Di>vWe1992(T3jX-csz^s{>WL#<2{s^ zYD`Z9U3aRk*%H8C<7Ok%PdosCZg@YvjLmklJ7&#m$6Ay+six!c{v9XdT&ci0Lxp;S z`+V%Fk2OL|d5H4wii2Xd-YiQNLGW?=IK4&G*f=G!Gl?lSPNJw8PyzCmuqA?wrbX<@ zobrVghsFF)TMCQ_esXpE<>d8sKT%3?d*Qy866&li4PLjlkUk54oK!w|w`92DJ4)AQ zov@Ch{sRpRRoU_ZEtiy^Py}duB#p`B6tO!sgji9jVu29Tl&Z5QZLmeZW^?L) zI#Fq?my)5Gn_jBisOfuf^5ftkA`^+6CUZTwmZ=!Ao*z1p<3T|5J{L~`LwXZ}h=B$SOlMYc$3tGVz0El&^&f%ka4rZ^rt;%hO9$bPloBx|u=d?qD! z`@$y}n5k42Dh7_HWWNwb<%U1?=R|};^-|5TqOefJrDhcARE!aSI1IaWa-(PuaQcsI z*ZIpMs)DbNxd*4%PG*Ee)6yZGVAGlGCVq#6X=qrm6*F`rpe#w}Q#O}fF72;RFSM_I z3NnO_fMsz)oiMV9>z#B=C(+n-_ZiDgbBoKZrdj&rtxYqKsfGR5T$sytqu-2ZZ(eEQ z4$~SiagfvPloAeIkL<0%O^k>o_Q#BFHVPJG&Ik$#K|(^JNs7gxVq>pX3%nKi>&m1U z=o3!?PpQLc+&p3SLerp|v`je5Y`x!Ar3Oxwp_DizKl$)X=xjro;FzY9Fq>s9(RC5k zdwTzrlgjN2w{)3h9Yfe5oMEYY84Bk1zRObhnQPRkwJ6Zh&dY`TM@gPBX;MR0hBnvT z*d*i>x-7fW>4MP&?Mi9OY%yq?GK}vaz90bFSkqJIH=$n^b{EEang|@Pxo0MwkxoVU zpC=iSOjOrN1Yb1k{m{1?G>yDPsV2yRg(@@!Kf ze00g939}M*Ok6~M7n)Y;ZM*?m1^&g<-;I6~%3glNzAKh3eAH@WYTmzrJY>vCK{#bk7Y@{{Kvq=+6?`_#TsT}R|3^FOm~pItjTh`LHMbL!ti{Bd z;owA4(*fEAX09(ow80$0ZI|Es0_#0nc7NUn0?Fca%GAQw@OQR9kE$kfk~-2maN$^j z47j7BlIqO3yOpHiePM)Cm~Lh(zemo<@U&f+J=~=FYrpf|;@lV& zT_klp2%P2|Jv~FAzxoJ>>y2@>Yo>eSzpj7TK`0|J>g_ZLMC#Z`R!MsFqMJVKK#-~w zpko_U`mx=H@hCp6t0zG9jK1}zaQgAJ9ALILDwyc93u)8ZR&6s7zHGQS;kg$7Vcqoe zb!EcGTSrkwa#X(4W&m(byMb(=WA^LD#rAEy0dz$B;Y|U=27Q*aNj9CBRCZ9t>+G9j zBcH!NxlQzs!RQnZnDG>P&)8kVh3;;KN5vQ2B|kG_*XHIsT%+u>NaXg5C`pPTq? z@`VNw{uk56?+toq_F6ukFWX202?9KA3g|+-Yv|5j6PHX&HgzXY2?1JD6I0@;QyvGH z^OLJJnL-Z5Y_V@Vu`2Xqv7~t7t(FO!Z-(<1J^l)&-ui};5PZ8+TJoxy!_kL;;OJa& z-Tt7NdX4c}eU&c|HWj-YuB>b%#E~Z}LoMTfmt+kYaKk!w!eqz%QwT}Ho@afVH8F8y zz0b#2$#f|(Y$RQSupf(^yU@U?9V=baI#GxA@rCxZ7#$+^)9yV{y7}!`N5p-@OLn*% z62SXL*_33-u%H3uT_WRPR0hizaUyjo!Y`kUYpT;dmi&g55rqN*(xOjNX?)}73=XW= z72AfAH=~4=rppYvxm2+$pMi@xikzJ?7EnHH65K}~4(P|LgdDq0_e=(pjCODW4r;f& z$m7n2Qj*Y>B-Kd;=m-(%G9`$(8DWsPHvAn5o)0Wpucj-@W^=zO$5WIaS5bgbrTP&m zy-|c?{{K(1n`mTmT38yYYTL=!s3WCx&jwyL$`t-lt6~IcP*%NE1P!YTrfBc}pV|umCns-wbCb za(`ZvD{pEpNujKRBx`)eaADkeHsaFc!}r*BRN*dLv811^S`^NAuQpR5E;r+{cwZGB z2P<{b(b=|kdcn62eoObD?b5UYV#x$+xUnHWb}H^JSWk}X$WIl%g-2SyJ1b5J^59z% zU}+t600xYuOLe&3hi^?5B((aQXogfPfJMXA@|_hj5mlk@rAD%ZzgANTrvOR&O$5qD zQgT-uz=li7wraw(NL6pGr6Cisl*x{8_$;N4o`R>1y2aG<^T!s&JHlueUh1{&Yk#&Z zTHdG?u7@JFQLjyqFX`A=L&^qjj!tN^DUswQFRyk`s+%_ayU5pRo-G@XG~ldxvpjVt zCV&~o=d2#4ky*a#Z>&aIRU}!zw7eg)FRqsHbv(%r z$at-L&{=A)pmuzi4GdhkPnPOh`5ts<8weH6BmRDEVH&MFddU<%aCAxIS+v^xaNkR> z%vdx$#=sj)PkS2tEz#q}J-8=l0iE&FLUWz?YBHN&4-K7{Vqsm$Z68@O(Fz>H>39yA z&SW6~b#6!0u4np!M80Ak zw_ZZSQ{zy3+EXK_+w$)1PBKwqBg^7j*7H31o|gFdmdt$e^J0(fB7^VC<9NnjsQE~I z$L|=%`BOSCGU%vhU)tWB0RWG+Tsw8o=)_uCror(5(B}BUcC8t}DE?5`vD7 zyWRv$8crEQiuU1aydPFfTRU^uusxfft`2rk5E6N4I{l(WU(3mRHla)9YRRkga+|46 z8xJ(+5)>bW|9aQt>|{>gd=bRUz+{8I>UuZ)k^}$%>B}B>?a~ric}lg>p3;Ez#st=q z?e6S(p67eVHxP&g@2*2u4*h#qOW1Fxo%XvPvISuXrx>=+zd;+9gl2z_@fMf@q?vYK z%-uhApn*;U_kq5(bzP&)IwV6;?(V%46Y-F%w6M<40y^$%47<|VQ; z4XL8`(vSG!CP%UH1V5vw>s(x}@QV1jRlk>M`0-zs4x8N5s3OscYZLBY$HFF9fMs*H zqL+5(4H*z$bVY>Fpir8O|Dq`J!Q_7Xc^r5~6~>_s=%gg|^OrH*yg~oDVccW1o*vp_ z*fNm($@j;k_6w9IRjM3KKb=AIfC*oGBaG z35VVhkFr78|9>k5qEhKmTXn(4_9G?a62%MP;lbX;4%gsA^f9AR`S3IcA`vatJ4nAk znU>aV11$KY4CdCuBq zDi~IHj*jlxM9J7mN3Iun-)@2(Q$2-FwyoqV1dMwlw!B75{7P@2S*Wi@06=dGzz53a zT2<#tijMP3Wy-|Hg75n9NiSDl-DvAQey4GB6RcpFr(D3VmQR#Sjy2NazU7;rwaY+- zs$xYG@i8vSL)^PfX*m5-pBi6{9xe67b9U2oTBf4o`RT_W z<8#fiuRSlWSqsoS`Djx2u>&vhFno{(*s*_+n>X-T`M~HW$XdJEiHszz!UpzVGvn&X zO^bo?wN=k15VL5|tJQS03V=_GS=t+fqv$)QNaj+H@}hAY56Or+v#V1*&aeK9oEx0} z?_zajUx5%#w`6*6O0adTj+BTIPQ(BT=uON z3mE5@>1(2&EGh;#11GG!8r)I|G|^*6z$s1Lb!yD;&OdD z_8N=&wW-=Ob~5r~a8wxAT5SgMFB^Tt2mdXW$Rp~d_q-$aMY4EGn`R?hWr|ZCIAQNd z@dz7<^2!uTfRA;#STv|Im*}N6HOg~%rY-LEsoIJt8ZDhApS!nbfKq^v#qY@Qh$XC$ zGm2VNVQbT};(y^Ym<5isba&fVm|lv?!AH!z5y~FVHABE(w(*5E%sg@omNGX8d~3e2 z?mSXWq+`1iJlU77wU zdQ4nIt?P6ibzB@cj@6G-6Pzh*d4mp_UA7&&^G--_z^2$* zdKyh4nw73yjG&dYPCYQHEX1-N!j6DN%LIOr^#GgZIRTGA>Rn}hJB)@!;RN-~5k)d2 zcK18h&&z8njVJkD=vl@`YM{P}a>OS_bwRnoRHZ2Ifh$!C{#GvNjd3Z*l*5FJ%I6m9 zLqm$84shNfxn}mUjRdF3^Hr-iBv2{teDeg#S87-Jl}nA}^LkV_o$o%U@33upyDj5G z8~mm^d;?Jv(X`+RnZH;HEDftW7esa^`lbjwtjd@DHT)av{k2R_mzNv4+V`)L`_QrI z2?+E-mnP=xdSxK0Os_Z<{z*m1*8zW@s+q^b)NM!(jT zi=_H7Zng29ofTM%r#y$9?$&W3jwm4*d)WQZe|fPD48?yG$ws<8Xn(1Tb++6i&;)1*P7ui!~J;vM2B6-~IGg&q=ZRS~Nebe39rdCzXOI370AwZM7o;7c? z#zZ=QX%4L8;z};^)H$I2YHv5=u5+mQwX?OOI)H8W5AKfn{V(ngkD&Z8w!vF*T6VNK zh^H44@#)F!ZF4Vj6fQk@roUmz?$26p+#lF*XVAGeFSSY+81?Fq@ZjJ|vhmVe_#xGl z`3Fn9DLwpJCAALXPMg3OHx(b3$6-6YVG*Qi>-q#It6lh;<$9+Ltab*~Y1x((ds@X4 z2PY}|9>e8}?(Ir76)SBe%pxB5UGZxSN()FvN>r6Y|hBBtw>|ALIrGzmNPK63wdK-%=h}44*G2i1F9A z%4~|!fBK?{UxV#XNHvLdA?R^Odeg+gwHl+JGF%k0-0!Y7O@0~LSA*c8njy~pR6Sjc=$3~>|M)r2o}D$=50;P>DL`( zRXzZ&XDb)SqkfoKl1025J?$`Y!n|CeER}@294_)O4dXCatEEN4h&FmMxk^b684R53 zA_A*FuBKxQ_t6r`cedmzPjYOA*g%1-WL$nNBBk~65OUV7{xN91;vodKfDgw~Nz=lB zIi+lgsbHm((Ydi~gf}mvR^YUn+Iw82QHqk4$Vn%NTJS^m8Bb=-6d1itHn_u^7SuF# zp}LzdjBkvSUV&5unll(z<9hhq$6Q>Lcx96IE8?Ff5(I(g14I^+D<>h8 zXdCi-Bd-tM6=$3B^7XjkVmeX0Fpup`Uv(79_%DI|f-!7n0@r)tUwm~+KgMVm&m_S1 z>0-mtcLL;XpnOgiOz!Qt3_S%~ngD4lh2~qYK0aUG(JYbZJXJUD9)FlqyEiV)Emq%d z7tnnE|1wYAE$i9rrh()W(p0863wLbVUTfZx&WKg9q4b)c0Qlm*i!MgyWQGp0yX+or z(uWDRsJ}t$y}-zSb6H2KxCIFMM^Tl^pWv2Qoe}b5mu0;*JBeouJO5Mm08_~60`TH+ zgEa(k1iiIy6LnPDRR&wnib%H_j}Avh-!z0XTXNm%B9snOXP2FYYN1ZI4q5_^KfImR zv%MUgT?DP};Y1bj*QounOTRX5$e~TLr?NKRv&@C=!+F!zKdK1ka2AM8sxy{21KjQP z|DT-s*S&5yaw`F11r9;`(Shs(x|oEkQm%K|0}wmajK8NG8f@8FK=GTc5`)LaR9?uN zaA_OOw@)$ozE(|s0xo#@ZQY%w@fiV&?P?n*dpjiY%I! zlEH_PtH?3*!-uh+%pN}GS36CuZ*+=TPSV;BgTVGAc`k?1i91Oduq3GkCAqHWFWE~W z!ogl<0u{ogQM-#)Qob}SB1ApY-^Z)J#)3GeZ0um1rQe-{jUvFz_7`$q01onGf|)db>%nBr*d#*q2$e+`MU&G-=z#VLX%| z<@sp?Gj(Iqo}QjM;|U2V8D8Vf94TcQ5{C)}aXEG?Lirv|X(Q>vj4N1=I-F`5Sttaw z%w{{GeOX8-V)G+cz3uu~HY>RReAa`6A%?ug+_e3Xp#{${2n;DL7K1=W^H-LY(%fH@ zSPYa(GYSd`ZZARD^a6ck1ktuA2X&ZqLdmh3q+umjOSY^0wSr7|-DX5f4pzqJd4sZs z>J@H{M-J8-=?7MHUtdi=BOoBa!z)pL7gsPfHSL4G%YyahFbWGIq$2=k~lx&d z)#kE6h!-*!@>&SNqXoemrLime0P@ z-yI1Uc;y6RyI4;`lkh-y*HB-ri_uZ}k$2w3stEPB9{uyDMT5JSYKhsAf-Hha%6XPU z8bVqQ1lvZR#wESMkE;>0D!@OP3(*5-pdCXt^xon+j$skM8kM%#{D((R5TO{gk4ZS} z8$IQZlj8qmL=P|;O(2tk^!6k+%UX%;&2#b+`WzXo5egRKc~?|+YL;vW5_GUv@$)Yg zJSZWT7zPx>iueSXT-NrcTlh?cNL6R0-U?dzu4cq{Z(ORGnV2Y8-%C!z&>uXt6Jh^( z+wwud7#F9P-jcRk0Y%b>3Xrsj;^Cfrb5oh;^wO9fBF6cCn)M+pGK}5)MuqsF?0tk| zXbY4f__)hG^JW=yUi$dOeN(Qc>6R^WvRrrpV__0ie87>bwkNR^l?8C-ZkS?@B?i^& zzgG?j{8|VvWa_tOcia(+Tu+n)7q5e;_5_2lrgLv6{#?LRY#g_4d#8KoZP=Z)fy{-8 z#s5iauU5=~#w?Gkh3)xu1ckasC{{*$?;4Uj`A$x5{pzzL^*_bozZBj=I3F^nE_o05yW#zvK)zugcMQfS@KMNWp|dxaG>}Z_ z@9a%7kd86w$Mi!E+4V2v-gU(w`p+JMur72+UH^rUsR}Op=JcY2KTR+iB!oawx5raC z?RO|0N(Su^W+mYm9pIofY@s9=r44c0(&DIOwr=zwhEq`28mN{3l_Kha zJ4*4rtS=48v&(u3ziMp}W3N5*D^WwFRL%LTGR()iE%WWs*0y{e-13U%%3^XsoAqG- zt@&)Z;>I(bb%}C57Q6tHpznyln^$;}t8_&>yg;TGm)EQKfh_6kM)2QnNLY=!8$_G= zH1PcA8WQ8>u~oO#*5*x?h^!19`abK^u-yTxH;cZRW%#eTiR;3y{$-4xCps&Q2H(>B z7op8D(noD>sk8IRuydm!fK;f}trglLy%9=DH%7%ym}r6#U<8y^H3>=j+St4zoF5y; z|9NJ&XG{_1T-U~HvvE^rd>gu=UrFuK?-Oa2(>07`0=@qW<+lzfP{G>6OF$IIq|2jC zrb8>o#SjSyo`rj2>@k$)ipi`9E5_vY{4OO_(2uFLSR@k7%m2=iOZhyGH%H^j4M<|> zjH3+s1RI9G$14F_ERQB=KOx7}>Q2JxAMvji;7VX2`~%CY=`A-ek(+VHg3_Ki4v%u` z^r8VX<{~#A)N9)N?EjAQ^~9(z?qCr1|E6q5yhaU6@Es^*AMEeOk_3{#&GtYi;KT`4 z(z@dfC)4V;2mcChc9djz1HlUR{xG!5o^Mmf_)894c zeI^<1pU$pqi`poV@~_U$%ENr$ygC;_W9lNG(%|Y&i-hI%v8rtHr;cnkbP zoNhGP%_a0dG8aUIm+I2kTpVY_p89#|FJV}2XjS{}ys*I0a65BNh)qdURsdYd@>D)9 zPq(esyt^#O&&u7alsj-MuneXuSL$x2@w{?%C`_r8om3xOiH2J?Ep%`xfE}IHzz=Uu zWbeF~3TgKpe#0aVO)Cj#2o~p-kS3R*}R$!Nf#RI`<^(IaG}9SKHK)>u>SqC4G%iRH}6Xq@g>9&irIz} z`Mgfcx1mY6wg(c&Q?=}|SvVwXAi?%pg$v(DD235vl_3&xCf_lrhV4BG=Yw%;Ywzo8Madn|HvZ1^la*aN#Hx)M4?orFYV&%JeCAU+XHn{Zo)ui!qK*QmZZktVUT{(c@MW!NsWmm7e zx4Vf9JbF%9`$D>cr`FBP#w0)>rN(_owgSj)TNo>pVvOa#6cL!Oe{+u%D;*s zj>zF&$(BxEeIHS}RCRzzo8DkCoX?1I-`Xx;`p{-{?B&QPj`o6rkb6$YH z(Y55blCXdRNHY0gy@huKqqcUNCc{&rK_|b z8B(o;q?D#NXIVjI3FL^E-7CIvceQC7Z`X40{Va&+a2cD+8?T2PLM)&_qg>RQZP5`3 zb=xB8)U4a>Ao{lD7flk`*E_vqfnt=PJ;TreQ-3wh%UruF_=8eAcru}a@=$;AeF%u( znb?Of`e1JeqjbLgJt6TArt3}8%hu9lMYE^Jc-iOc$>Q({ocSg7v6w6&d_WiT&3pmW z-f?gy9~Tj&^bDsg{@3|w?U#j_Ypw^{3m@`r`$+Z*ZR4N!Vk%XqbCoG&thQ#4k;A`% z)_mnUp?o$vZ@T3I0xa2*Kw4hfohCPXP@%M9|>(!(47c+CRO2T zbA8I8aS{6D6c5J=29ZL;gVRl-EMuj>Wy5vAmeD-eaeenOR#1ZZGp(gr6MN@qx6^3n z!&}F?Hg3rB$2adHg$d+tQ0&i&;}%?U#Zvbj%A2&q^i`Ghj^kmAe;X*88U`qEgAZ-W z<-qEE6A=P4}$P2}T9t6r-=07z!0S6*)uUFF&(; z848MMLBs7fkLqU;X1TMitMD>eFaW7<+0p1i$koRXz$;kTuE7iJBWtC%7eX?=l37?l zSb(~}Qr_@XL~7nNH=4r6oo+C>n4!>IN~(rbBvQmMqQ*eAA6c#+A{T=42VsYGM#=-E zmB6w#T-@ec+iSJQ>N-7v6sw!W|-XK`^eVp9lGLEx(f`sE0}LF{v*OzHQ$fHz$^2Cy#~nm#RDN46^9zL93?5Yt4U zIBsq5zBVqpK*(C9j`yq+b)GdPQn!0nR+RK#@Q25G35iiS*pR-5U`M!iEY0r=h>)}&QKzIH#HU8Bd;^3 zr!=)#8WukFb^9bHQBy;HQh@69?KK)`&FwK$A+-a>uTa_ISyw;#SQQ;v45%-BuK9`N z0R_h9Av|CL6;PoNtD0LNX#C!|?luFLebN z;k1lS?0H~mc|`OcX#XHL>(N?G9~QG*C7RQ~vu#ZG zv0u2;#H7DHbVrW8@zpAzz-zD~LF&z7_f#Mg5f?JwOS{2yV`13Oy0IyWLLZFKsDbyS z%=^~@Nt4Pq!O!237#+kj)zCXk2gw*{<2#eNIKC`HJXkqy#G19hUMkN8c{4(9`!y-Yg^JfZb7iFdvfMafZZE-Z} zYHH@P(Lv(lBcIOAu0niBVd3a=Qt=yC(FYa z7rP^dPH1^siuQ6!$0V8dUm~m~390eYpHWh1ewmO03lWy^UaUu()8?swHOR6U@Vlvo zm&YeLPvG+;9K`P}3GWv^a4>K{gaa}?i9qH-aty64IPUoNQZsU;Gy4tzAlOA7Bo4*~ z+EhH>Owp>lh=*Fuf7Gt(b(Ugn{Gt9T?)o@KDF0O|BjaW~W%bN!b3kUypz{k>A z#PF`Fw@iA}+R_o94QXr7x`S(Q;=9IcGdP0xN`;S6!44LOL=z63zhs*h4mhpRZO=wI zGBZy6b|-+$rtzRpBbz3O*bEDJ7|X6rj`d_MKUJr{@)^`TbR&z-Ap>Yg?jNdzgfPJj zH@kfL3=K-ot9|W|lf#(#nQ|rjXt5F|=LRS88bJC{+w11n%otkBBD z2d14|aY4Ev=pG+x6%zW(;P30_`J8Bm`MC`*uYMCZ{>hz5y+zbcXPIZp45ja7efYry z3>AJ!pt4ymFJZKBZM_}5*AYI-L*3`fK`os+c;3$#OgL^t<*u~)I2O6<#$8fhZFlEk$OS^cz%39&K1t?nvuXqh3B@K%g)ArwtcV_-k^WY6M*`Q`xw28s_s8swA zCxovz4CrPR3fRrZjH0}i$kka=Qytl~EvVfGuYyCgJr3%&6e(5&txr2*W5mLe6z5$6 zVFnD90lmRPo#Fg}{+zmwjVUC+d0=h>hZf?K#H_sP8XX-{jih%#LO90N#7|Fo9qi;F zpo~=68}8yY(@(+8o^5pksGA%-4D0j(lBwx?(>5wXgOalAgheFbJ7=N<5`Z?w1FK0} z)#KA!X04#9e5w-J_YIEP=zrwre%SeO;Ew-_MZ&O>ybWYK zN9c?on8q!f&(p}Z$bjTxW)Ms?0M^6GdD4}pA#X1L+Du6e4nZRG_#tay)_ZAz}<#%l8HkV8J2V}l)&`Kpv8NV#$;*OV=LM}bn43)(AK`)8| zV{@V(J39R6u-1{V;#C_ZImvF^^STfFx4*CPVPgj@IffWkkUW$(p*ox7chgX?BGhZ~ zI(GX%bnyq;n5S|cPEa1W4Yq)_c$XSTS%e#{^+R;9P2JVpMc zixrDIFio(caA4Bfn3kw~f<_(!1CUAOsdgSEfVs^OttgNgauGhbg zZu*;Cej1&{AbA)fPX};m8h(e?#C1*n6oqSQo5V+mcgMM?0(;S#t4|-G9CfFza%y-| zY>L)ny^kylS7r3gf+I-YS$T3w>snrlJf7zo*I?3F%tJy2%445jLKsds`)Y~DzHq56 zy}k8Ud)+*R2B;mWom#Gj)mp^u)%=R>B5So`;c~Ut`y#OC2Pz6v?yLC8l%M4#U$ho^ zz8CJXRqVZY=m-BQSOZ=`9o@r1w5sTnKf^LoJ*)LqB;5NmlAGj*j+)BnoZKmmt)i-> z^A8dCgs3mcf=px*HyzA2>Q9>`2d`?)^p-u+Xm&n7j}W5BB)!FiC=0*ILRxk#Ipyo8 zjn?TQ<>z3{m=_(AgR#W~c^`pnIFgFp1rC=qOr(3s8f`phXt5+r?Q|>DY>@f8_S(&DsZ@4cYg5b3 zY!a1G;ooc|C)hZn-{RY^STG_+qzD+NyoEm@YSQ_5*y{TH6jbo@*S}Ilv&U}Y@!a;2 zv>s>ay_xX9$jFX1%A23Je}Qa}UbX!hC4d(g%oujGjc+@lkLnWeokQ!Nil%gHq1ph|`HGPY&f! z=TMWHPqvQ2hdTZd%YKN;MNjP_3opH^?$e##(IzQXWm(8ebNO-5vP&&*rGET#JT0rn zV!Y01k`nySTUDQ^UFLmY2OR_aYKcp=EQ3mE;~WxD-mU2VBZKMBsHXkIyPS%&0iI7m z^c+k&6(8i|xm2fUzGA%O9l7w8uHWv$=F$1Sw>EBJAj7)GD*vBic@?G7qB54xSOYn((nwv00WYs{>RYJm+T!9KAs`X(e4`^ zhBw5itnTCtkg$vuF2%S+) zo{L1)?SnE-9JbNX0~to!7!K1MUrmegwiv$5#qo`$da;;CS7Cxc>s~0>Z}jAxZF4hI zA1y5zwHG9VPW2+^(DMH{*Z|<`!~?GtvGr(D!}RXC4yFXNmy5^lTDsS_Zz(I`Zy5y> zBAqEl>*U{({|1Xe+pi1qVA_&sZj~!QKVIt=7Cy-o6$mz=2^z1pVd@s1#xmYTi1z#c z42^||?NXMQ)Q^eWa9k7TFCm-8J`xRmgR)$jd!^It<<+J1Eks%+ZC~KY|HlM8FAMm1 z_3>^?yH&jR!lh;e*A%k#5rGB=P~d@mLIqYk+8)ACVb?gi3Rn4jZzoa6;Y9^9KsW%l z5CL}Yu!~JGD`41@;6dK_!(k`j6c?Tul*=RKqZI?6GYlg z@KY7&);9IIN)a={fya`Bsi;)eS=_F7>-VtERwkHYk}oq0GHkq~BOXrgndp>%s7isu zWs_1(&45pa&!+*k3zBqJi&CU81LF~rO?%%VsCwbbf)Z>C4Wxvq$JH3)ftlWWU7)(P zG$eBA|88H2|AT|4?lR|y*O*G{rV?{Lr;{pt(m%CN1?RhSK!g11_!zAQf2cak@q8v4 z`L2T4H=Xg*LX0bw4%TnFGN;*u_l}Jr89e2s&)>0w9 z*~qO7O^Sa}b#KkFXVU}T%CZKXD-~V_H>uaknfVpXHkafi7B*I{A1EG~roXk_j@`NQ zE;KNF_lrJ~vc+hQg;R4~Z{B0&Z7|7G!)`ozd%&Cwro)VE>H=PjkjEms_oulHCgv^Q zjmr@l2Jd(ZY8jE^dN49Tsp*H{2L~n4CCXxKZxU*_K=!R&jnknEG9&tYd!weR0ic}n zYI{zCJ;it=MOU-QT~=wmKyjB%tJI`3ooG)xFS<*?Z>|4@uIZCb!g)nx7J%8`tjB#Z?`p8{5uH16 zvbw>l=l}RmF@qU4|EG_U2yOA?nOs_Fjk9tyP2xSYj;F_S%%uOvu&oYxp8)IuYD_e zT5tA>e*34X;=J6$cwHQbPWcuDc9@#syMyts+8k@2V0^@q=12+tY7|t%eBvQ?7*Md$%$k64~lN~Bh^VfZU^)q4Vl|- zTZ;~zR*Ub@q-o(r1^^K>`uKV5Uk<>?mVf%-H5W>aQXZQ&&6?@LDx6!<6}&c9$Yd;{ z%aZvUmOFX*l4jpB5|N%)EfCaM9`u0Ti^0Nx#uW~+ox8S=_0|b+Nqc|jwDZt>k-?&e zROn2XJ$^IT@OP+@JH`gvZfJe9Z_JcQbfjB3!;!IJ`V0?2ZHNL~ZTVatPN`wxK1txx zRUs!&VVut&>4?m14M)#j8sh5Et_EfHP@P5|>_)O5cfE)o> zZ-FxWpux)Cfb}7{Xv5l9ULfaf=Q6=n$j{K170d;k*#Cp+Sd-1G)^VVTw+D|HJaHSY zFB~Bw)B>BIfR8E7L}HK<*3sPvVTcw`0GS6s*C1LcDA$O>?wkNs1m{^i($$b96xAru z_e{84n62v%ljSonFHb)aJV;XLiVI0W?{xg5@ib^?$t!EF1qS$T=ZyYr4n&h@&;$0! z{!OqbPiktkn;R$Z1UNRI0{<$}wxLgHHM;E;sbp)#y=L(Q>t-Q_L_ce-COU*J3UXJ9 z@8qLRSAKo*9N1c!NjW___sP?LM5HAW_<*(9)BC}SLvxwo2TN;EcZo$hE0Nl@Cp&i@ zap-6e?X6`)pmf$$u*yg0Vy!m%N6TwMGfD7CAP&hA$G4TluH=FU?A@+HzMcZ|#_J45 zB?dM#1UUN-fg`#|Zcb|xGCOxr4OLKp1YS>b=+?2`1CpP8Z-cp1jd{n`8NRgJdgupeBkX7U)_A{rvpJ!d0w5~ikhvI@Z^oP3+OMl zfPzQH~;yW8tSP%m`J~~@lqHo9)Ltb6mdqCZ` ztT0vm=gAnCH)O15D;rq@j>}K z*&puE_Db*!rYbtC7{=ZNGS4F$(J?VG(b370I&njTgLfwyjY!tz{tUBoM&}vq(6cL` z!lLP&esGfx0MFxjeuUv_DB1{TwDK!reI(P>mumx>wJo?knEKc< z9T|;@lk=G#-Zl9l^#vI9J=!dUYQLxz(Y{s^Di_E%1lgng$3rC5J~a}Hre6Z;AHYN- zqh)&!d7Bjb{gr&D?+F+|QnzXKGlOp#CQz5Di`Lc_TKFSLOZBk7Rlq_m z!Rl?_!ezMin(BCw_mA}MuDd{gZrd_Qb4c3h{&BPz3SrjK)bRXz@w#`^O9sFCVe7KH zcbcJKN$k7Y`S2Z*;rEeAo>n3`bypU$(+_DjnX+P8pkTP2E`G!(oxJ46^{Nx<3gbCdV6z%nnqO8t5N19Alc&+ys`rAIS;b|(6nx%-nTccaMKlq%T^ zL>Ue(NEG;;ac^m+=DfMdyCJ~)f)>?HpQrAxB|a6KD8|)XFUXj*`$`xR7CYg~A$#%z zpe-oU*LiKvAV3p0q4hMAG$p|Kjixb6`uw|1ksx@ERj4)}Q^VW`BQQJ;sE@P@3aZXg z*P=}Vgrv#h2V>m~LiXEOo%e;EB$WN+9SK9z<^Zy*xUmgJD;1H1xzM#-^#R4+PHff! zuGVC_-d}!@0B3FPl$tZ~>8`MCaSn|WOsS>M2`nN!(5ysd&^Yrk-1ObHJB}jLm;ug` zP^2cv9vr0JMJii|CWl6n3-2(L=CnzWgCZ|MW1T-Ptz%LqtaWDC%|Z6}0IvMVd3@$0 zG>{;;=}S*=BE^z|Y7rPM;iI8JkN+(2ckr|+MH#PdQg}VIgob>fRQ|^ZZ20Lf|8U-s zz8Kg#)|>4-{M!{`Hf>tmb76?og8*4^#*Yh?NFwo>!gqm!I!m9D%Xe0fKc0so6*rkT zeqS1iX{H~zJt!R^x!K&i#PEG*@8Kb?^=~eKV@!bGwG)B{vhpp@%%9S?1Q&*aaKai1 zHMEz~Ei_qQbdSqe105ONV&4}8Vy3%N@mIO|HQX4j-(p$G-JiTV{qzU^+d#AqkB5PU zV~IAk;Zuw3JLpy;l(?owWhEU?Rx($^X_-{gw&}R@t1?7S2AofNcO13P4|XnBajPf4 z4+G6haE-1bvO_~c7A~}x>*ZA5u;1#VjoXIH2*jhQ$Pa1sC$>h|Er8PP!W9WjA%|I( zEV-9!ZRX^O);=W8m22(R;YfHsjiA#GK3FetkDxOH3G19L7aGT59#%%;_i`l3y#z=k zN3&+Gvy&5Z$Cr=zB9>~W;kkL1MFY@dY<2}DSn@K>j?+d2tYb3LBNA~;3@Z^D-?qK z6`N&^#mq|L__o;6v9Y3^-+LWLw<>PH)waM*^{xEOrEC0&K>Z{qSrHFXpjRm)l z;-!?(7jT=$8fnACTZ?ePNgX~}F)XVUAgWt#XG=IMRj<=A)@IZ1?Y|Bas}4(Wu5YTm zxP(tTb+{itQ_iw9nq(c#7ufOpj^{POYJ=m5&wyFtb0{2`1BB7t|6N?J?JK_DS=33 z@^+Nb%;~V+X4G*tMr-)8`FcRid~&tnMsGhiqM38qX>Pa()T*g2eD1QgFWmCD0SkDU zqJ3+d{dE=Sz=C^{S^qV*{jedG4@%dn6}S$Ra7eBPz@be>TOr#Qc@1HSDcCsYoqjFH z2q#w7ln@o+H(7R5Y@jD~Fj^U5#50=0o0$b3m4n=p*jDEhe>-1x1IITvPeX4hQKDIu zQAg9NBlaB0Gz#sYgJbspi{z_}ER6ndB;V4KCI2>Lg1Xs>bkAshE+!COsCXilaJk{} zgJ%G$J^$5{5@k?Hst^I&dTy5O*WM8CU~zak5*lXY{=FV3;> zrr}M#MM>y7FbQxVwACwhGBRMOg@{#^B>6OleV zRNu@i*m~L?kH)}=9rNA-Tur==6tfzq)3PW&`b}UFi%rG)C3!UU`m^TCJ;GC_xa1z^#so znfm&0u|)^EeL6o#dUWC0!_Zo$04p~@w^G7fASxsfL2VemnN;bEdL2LM3y#50t*4Y@ z2-W7;h{lbV(iuu6%qe;zXkk@nG}WpVu62Y5NVRm7e$EULoeyR_i(eh;tneJv=oGiB zRbz3exFQiPRh;vGIL+6hoUTq%6Ud+m!7w8ML&Ln65{P*Z!j+bTj-0d(SBn(PkFS-Re<>+-xJ$bVf63j_O~J~aBN3l`<6Ri*Q#r6d(H6)1-Bt|J zJ)3E)(VPE{CBoWK;~P2yqHpCC!jm)~tL;~Gb{D3dnKe!KHNE0GrHH&aUhJDd5N`se zuG!s~rRN5FRLfYm7y9J1|C}EbmEQ8&_wz=JJEEGCMa!+tRZ1tq9Qq(>p)1F0^b}Rk z%ke}9!0tNzTTN-^4VFqxeepsRX_UC^7 z7KAW~-SxbYdih)N^hD36D&yX?9%KVYOWl-~6AYG}=_3q!_;(%~LS0fX=pEs|xk*`E zzsXF0bsfd75!9HBF&FC8iqSO{S(5lu$m{%_rY|faZ24PVlN$L~PxMf&1tERDilav( zOIbnebachDC41CZu|mw!xD)k8u*#j9z20RMu!hPk)L=5!!XC`6NWwTCtm5!pQQYzP zt0!XY_lI$!!tH8@r=f1CUsJE~W-h>~9);?2nZXlC`yAw!tpqpb_3ulsT0jnPPUq>) zPZtsWGbKmQ1%cxMihTa|xOn@=(^=x%kN|4>t;--uJ3QCm7DH)*+*G;5hwy556?cJS8-x>((ef;+z<5G z8{TBRCmx~ds9d?;x#qr6x2lzA8B%N9dwkYtGMrSS_tv@icw1(}SzS7k%z5il+7|p) zeP;v)rh3sC3OGBr@9cO2$&*8c^zABI(m>+X_v|iaRDUfeN#Fl&XGVDamz}9x{m~Ku z67M9#11=61YL_WugZnTtpvBsJeJOmkyQo0GymcfiR!AM02wWBGKph8ph1fT-KESxd z2$mjZQ&tN0p~5smU)4cHxB2-3}3V0K>ucz|4A` z5~f3hLlAMoQ=e{WPG?&EPHfti_O*-+Gyc={SVYpi^*D_Uvc!LSYN> zzb`*2{6vV}kdBO;fEtqA(WDUz8lj2ZGw8)P+&>dzR=`Gyi0~n8W2M-N|I!PHJj1wGU?|@2fqC z9Z>f$9E~Y-=q%kx^|5#gvWDBfMkK8e{|%&U9zjk$m-;i_>7x1WeYG;NlV_%nTew3o z?jR_Q@PM|P0+MH+$2%!)Dq}M)rhJ7X#0HkS2Sm%77dvm$`|Mcq%#SdL7tBfdhntG} zr2=F|YEhebx^)PwBtxL_8j-1uivY18-fDbX;z$@SmLP;6pzwNFWj}lL$%V2ZEPkdb zFKA??g3Y|jXmz$cnQ){{!Wk}wRx-K`mhWCDeZXjSe9+BI;N(c|+$Z-~~@rp?Bl9xxY zk`s7>=~#v?8g_yq#n!tgn5`h<6NJ0y$+05MbP%1Bo!80EWnq^dYN4Jw zb#%Vz;gWYTDyV=2#G|H^M#RT*aXRyhK!czAW@qkXgI6Uqq(vo8cwbGfc&OT!e0F%C z{|}1X`c)#N^i8kOGDdhJ9ltgP*}Da$T1MM|7hHMSlB5S-4`yEvonfQz{ zXQbAt|9LRYRPlTcJLup$w^#cXp*%|ztM8_BsJpE)yMjmKGkQ9-R$T2 z#Nl}uL&hz56=~ep7h<(#xHUbkj8@{)it^L1iYOzW-A7%oxqBZSxcmN|B_ES;KE2xP zm2PCk7jfSN>?PFmckU3nD^2%JqCi+s7~DaNe8!chs!E0NU|f#owYIB}&3W)ak@hW@ zbRIIlXSyrfM@B1JJB!|UEGAwj+l%VrR^ffRFRr4Ka!(e$0q)IR^~pts^es(FUW~jM zK_oi{T*SY-%JN*yIY^lp^*xOumz$HBF2{b=b*yYE{O~1S6rkeA#&{zzpJ0_}jsDrp z{sL|i461QNFc0(l7)C<=q8l?RoLzEMG49U~vhhaPjb-y`XjBS0w`)s0zIMj$JJxX3 zH@orq$);E>y=VmQuMHg>%oTQS)o9h=9ea33YW+J z3AwA&A==;OeKVnLHE$nW8)5#0EMBc!j$r&Y7r5m$p$;fU*bUKbUf(V6B+8vY8LTCG z(4Q`d=?lEnjca}^cIkhHZ?){oSF^6xT@!aCOF1BeH9{5b;e4njlIzg zMhTD|4-F*RaTf%7oQMmr3~ZsBc6WNcak+NZ^D9hV*RwsE-l|ONPkOw0;Ou#%6rq2K z%_vUIm|7wM2LwDtwJGQNCsk2cptaW}#iA7?eKYt>28KAn^3oSa_c$bQ08HF#wYCw0 zTRA9gr`2qM)4L&YCT}qcrnN z78fr;VZzqxG4dPjV#jQ|)BnwnT|E;T$p)xyfr~KQX}yugCYb16lxlYQe~?4V?~c#% z_E&6U+XA5hvObGU9>c9#5`iR_En+wo8-|iSyKeYqnxC=fz<_h%t_qZ?`o|xJ-#~3r z9ojDDj^+R537~TP2RqY*M1}%YA+CAAHAoyS6kr6vr4Mw!WF)5gYmrGu8OQz7Rs_Peh!;`(xl zOibyYz-CabVW(`mbUw6w?=Dkb)M=k;*7oobRZ!r5KmO@DBKBiwa&WNOj3xr^-Ot+W zrsW^*0#J&!>|Q}arOhdn@nsTz%|HP0l+o%pZsd zxb?*flRDm|u5lBRczlAy+iLruX5FUril-J;D%$2s~?hufjgB3~%e-TZjjo#8mbg ze|l|Vy@hQ*J{?&DY>=LUIdD@_k!IPlI+eIbH;hNTR3hQSNXx5LT&gd=sogRV?X$V4 z^<1X2or(K;D?;}9AwAescR$4BJX*I-rz!)Mh9XvPe znlB`}h?83uKkM0n&R4jk?UuydZK|&@U~+go~`6ASvo(gWeT-CZ1gSvrk& zIsY`gNsD)vq{(kGI@Y~Tw7!T7H>}Y^UD{9QhAh~eSInsmiN{k6snw> zhUAcWql_xlx7jy5+je){Gc&FgaD=SH%OarHjsR&egnBn@tAJ0GM-Up?x@F5>7LKH1 zHs$DNMR>;}&WuWeB?C%Gx;`%ul}p@SSEiz3uLuO1q3Mya-*3KHtA3Hs2Bs>7^vmAvU{4E~D;v<`TwM7FYj`?N;hA^{2DDb$zoq zC8ga;xt9B@QG&%~6_19WC%2r(M^3Yq?rIzG|GW)}#QiTAvdr+2L}kg1(W^Eh6o&jD zp5HSqD;~K)?(1J}9h%}NDi=6ep|jrO#(dRo`*fI{ot(LX66X`ySr5vueRc7gb$UC@ zY}Dz?RFUs&NXY-O1QMms3<#-fI2zK;`eY&mH}Tjoz$KKzRJHCtdp&C|qdio!eN?<2 zcRYTdp0Up2!iZR31VvySTxV43ikeL~CK=Z0sL_h>k{i%DNu zq@KI)+z!K~{rgIJf?+ZlqKmQeNJ^uW;DImm-R(Ru7J>m3^^TR2oNoe|VS{gZI_$|38*_{WK;?d26}(01TodgWN`TpS-8_FA`Do!|OPHqz_Ufr(H&?lS^* z^_N~o(?hpo|8JZ*!^=>O)YJn?t`a>3SBLkx@(3(pT`lG0RDa9BW@nFfa@mf$ZLC)O zGt4@20`&311YFArRN#oBLwp~Od?A&m*5|fnO{#x~NRa>kL^RJ%OS!rH$m-kbL2E8q z+B6vNwc`A9zi#e|ZTiIeZ&{l{5ag*fI{7yCQmN;wsAi_kZ4{?ZB_bUB{M%tQ0lO{b z89|k^L&({5a$Xw+HDQE||7yG-2sHoQd%1B)vZ8KD4-KF=7YCYts(o8}F3(yOEjrEf zH>?NY?LngKifk90iFK@P@xGsu+D- zCz^(whFXLh0m&^l1|SHCpe#19W)Y(Sw50X9(l8g`SrLhs>=ya|Lvx{USpOkM}H0{?yHtz~W=r zFIYx2QzECyVYpC@gy#L5EhlgN{2FxMKv-E#8yIE$INHInLTxqBpyXZfuYK zoYhRIz|`2u@TFI~-0s`eQK2geM^&BJC$x^#ZA~p9j-(HGeB4@0_#H*9T=Zcyo$L_m z-rC@}Jx{cFz7z3uhXJN3EL`wps#aC__3!dBGZnS_OROf6FwgU^#u3KG>nGMlJg}-u z&(Wli-XlhUFhBptps9a0RH^^;LFQX5E$7qOC!11+@?s|)K@UDZ49OHyhkzqKF-A(q zNY{5t@8jVB7Ug7v32MK^ri(V_lye^jlQa^scDDeS7djAcoH@6A33=pazC35k5PEDUj z3wz1UwPjyO*w2={8&3+wskYS1^BxMENN-`06Da|Q;RC949dMEyy4i54RX0#Tq-om+ zWI{G+?&nRN$**;ea+6lVTO|AOXk0?;Oe66eaekp_-eV%*Kvjf4-U?v`Ru*HX)gXISKX*ehXaMbJqN63((?L{3=Lnezu$e|G4Q z=vASzJ-0p<(#4jiV9)%`!X$!2Nc=1;Y-9wk{14YVJb`Nm;KA=XnK0W?gv9+ zHiw7m+s9|Om=dLC7J(PL2960RM-}`x$(HoRi*m(TmG983ypU{#XL+E&4QT1Dq51T< zi|AY8x`Z*m2GkwUfrD9}ooIQr%q9fsz@JD75S?za{BKUPot`G~^ZL0;BmZ(k<6&?e z&#@z!w)A;_)-b-)Jdsf8xgsR`H24tu*ji45K31zcFp55&EKXa{W^JU0 z>={n$J(-oaua~mtn=_jmQeynix7FLaL2a2bu{w&^WX)wiUywN2bxQwmWHl^e+#%8{ zD?#nXMKm2nhJ6+yHVps`*+fmexp|18{+r}}4PCt(z1DQK+D5ItRksC?k(=>GIkk zR?%Wz{RnPjQM~U`5u9r-FO?ZiDfoXm-2oBBtSM^`B}XA66mlzAe{mtnrce|C!(`Ux#6Y1Li%>_f z;7N<8aEo-aNTL8H0WnvmmPRwDQ9V`fL-`0k*Z#;*oRU+9PZ^_- z6XB65FJz3AlvyS+L`MS_tVOs@hTZide-EGt zzk2xI;uxKoeEa^#hwJ?QU2fj7#x;^!=uV0=H)8Y`9kuuM)Tj^g4FSKczW?)5`d_PT z-{!xQuXvZ=)spCc56*HnP)5&~=><@VH-*H*>x`NQD8|0(@$(zM?v+oCmgt9wV@|w5h%!^ya z??L4|A#cUHG#*WLC`#URI9`4%@qKA(1TvZLY5gz$ zZ3L45n*Vsf*VJ;mJ==lHamYYG8@|+2+Z^ z2UYs@(?I{B`6AzJUDX@!?{*4Y;mfkiL=1uMyAE$VZw6fXDGs!cnG5i0a@I^T=qp<6DgODe+i;zQS3Yi-ofLK5q=U0C&u9z)#rFg_W3k>m9-)}0V=Y?8gFLkoMazQ(|cQ}Up&bw>opE`bghHbj_ zywOk2b6|>aA<;7t_brMUDi9i_B58FVMKO^Cye`wij7CP8hc!=6pD4V<5-Hx{?DHn$ofFPgD%>m0Y(X?6{M6U^2XTH_G{g9AzWrdj%ckKTP|EfaM8`dKZ(b# z8ARcI_MCT|sz)sCZgoFj64IYe)4ZU}fNyKO!x<6QM?h#*kNRl z#M3T*(b%)W%y>iXDz-KH2>-g_ntjPA4;u%mmeuI?xz=gfMuG5{QKKR2nrd+)>O3V3Q$)F3 zC@G(f40#b!($|Q|v-3U7n)w818Ttknpo09bF}C5czN-kLeYOm}HZWAQLkzlGP@wEc z)g&7BQhLTzzlLL0WpgH~X^*RUCWEEJI1Q$yy_p4Wy76`gk*z8FF;tOAv>K?)T@QJ1 zICSzWQMj)fXm|Ktv7#;nDH!C)!qw{-G!zINCHcf)m&;lgOlRjOWQJWz7A|bis_xT} z(|8vZiV%G>gd0$1e_1&loqkp?h0q94>!!WC#9h~xUk2!XbBKTpgaKS@Lo^;AQB*lBf$~O;Dc^`@}>i=d&)n8s9~Ypfi#G{e)V}s6!Zs5yi2f`&Gw{Gtfv%gRtPsl243DgbaupkJYwgi|!ze(E)pmSc@%ukOzPVyAwvaJ zYuF4Da1s1hcoBda{ny)!A~NfeAnz7rG&DZna5#+&yxY+F5|v<>SW>E>Tf&Vcg29LwJW7`5{)%9wrl>330%UGzZP$SH8HzBzrW{RP+pI zNENsYS>6!0?_Do=7+MXrgRAr{=a-qvhNoViG4DR{>~HdRR7IaTH|2Z4Xd<&HVuE3_ zpWnR&M~ZBo^?agZJlxV5al>_SvJ*w@q9XSe5%~~foF#5*0jK2sd=9!7DHS-#TQyyx~@0k6@c^}4Mt)DM#hc}&rdX~YEq1v zzP~RL7k`?#wx$Un6>oqtfmXg1r7=7sKA@%{=cZ5-!=>Mi&xPV@T*Q7&6?>ChP-&$V zm5+{bVxnIa-1&%;ivj>H2R}CkXI5NvX*d;ouXdLpU$OCnTP-@hBuP^@lD=s}NcN|=;sn!R9{%5JAt)z3v zJ$IewmIxVS{=T8E^)ODe6^}cnDy`o)FX}Bf{-p3NbWI%&teF{4Go&?pKEOR=G75V1 zl$!S%X`yJHS?qjCW%IXTzn5sS`+#?)ne7#)jK-VHjn_CqORdqYn6m(r~{QN4No%{Ta^D~&sFo0;H^TqZY zfj)-8hl)*`705{hUf!k(AG4GRHR|`ZMc?~~Bpb;|jHE+M8XS?E^8L5*!y3dahTA^* zn^>{gm&5%F%G-hs^-hXXAB;TV^8zui2(yQlfN#G$2kZKBFidKhia}+&t?3#(ybnLC z@+Z4GZv1N_WCnNNiYR+Aj)rOSj~W|CY_%`zXNrph@^=zrU2|kJ_OOfRqxbul+Bi@@ zVvUse^A5lC+uhs$I9h7Q-pp;N{zz1*uQOQ_)|$rlWncsTlKHrC?KKQ_elAIP^PmOs zK`n!IV_0D=Uq@5#jIkqu@UEmmFR_&Ya>ypX*@tw#)O3w+lT8YHIEX!X4W%$a^P8ie z`V%Ky7Ng!HmLA+a8WolQ7?~>lbIENs?s~k4=ta3Z4`IF;bzXlcnE=dFt9-NVTph4T zW|{j2RXA%SE;JsSweJgnpN*d!u8EF!g}0F}e-~WO+{3{c8EnpLBnw^Q&CJ@2x6^5G z2?#7Md8l&wo6*Marar*S5{gmwrnTsP$j=Hyop?0AJBzNI(XKb4!d$*c-di+Z4{q4M z9cNz4Q)X1HxqrT5YK^|==$k+3x!Emo6lw*qHiKv4UDF#g`e>`z#@(h`Yuh~L&_(~` zsQF{z$$`q$R8a3fg#>X$y;hV!s@-Yg!G*G8jFm6mGwfAae9Z&#DSD7yk7ZlAq&sAy zsX@`ySN=H}w_trW{n=)1)%*YSbd_Ok08Ki$7k3ESQlL03Zo#Fv6n8IB+_kv1xE6N{ zZovwrP~3tCYZKhvkGt>g-k74jeY%l!g+AFb( zzPCou)I{@>iNPn6Z|Kcr9U{n%YCs3+^lGWRD z(56O|rH!9Ub(2Vc>vUEugN4<;>a0k(Op^)zCj$Vo+eDQ-J-e%C7!6K+*D6M9 zB^Edno%LM;gP?Oec?j5)aqiNB`DonEGQw3gI2o5-Y1!TwIDYb2>dRjD9$zT9?6?C) zJy8wb_r0%!+^Ib6smcQ3_Botuq9rG>J{qbw{tN==|IWZ5cY_nM&l-A zLrh_P{5P;ffordgSceEG=>DMv;w^?Em1usB1M~hz^`VZ3$$WG32(}6xVpbe8aAP<3 zvl`f_-h{Q`We2ysg>!~9mS>>jt>2_T-`sDodr9fF=74E=EsSqRsR1U0|0=^YpC4-m zlZcHO)sEFKZzf#Un)hMZk6tC0@O82`!bdA40LdI+$jJ%!{k(IlA4v$DZ$dSQTfO~0 zarU?njF7)Fyym_7*W>kD&ZgRIa9|7ke|l@y5Tg65MS-x*K0&Iy8I9| z;b^_5q4eRiIIVW&G{CdG#CJ za|>Jlxs((+?h60Wa)0XHq(86(HpfBa2~Lh#H0$-j1tx z@Mf;`8YFKF*v;#;wJXlkD|))b|M{o2td|As@*$UAjqL54N9{85FRi8rKSc&!UFZ9W z3mnme6pXLP<<4`h6Tr@92G0_vi#gjw?*=y8stH0ksweX(2^{E1(nSwPzSB}BAyGH$ zfm*7zxrDrrNBIIRki#V+;>DAL*-r#R&d3)caZMo$=HH-ysAChR*M5>=Y^%(!nTX@< z2`B66>i#Ae5%tZIDIiEDk@}7uv9%vLiivDI9yp_<APb=GNN5*z4l+d1^B~>6?R6uc|(bHHH2~bC2UCx%MFPC&;w(`*3nP^g1 zHx8hIJ?}gH77i%SPXQtoEVL><=FZ>$z;nCIF5>g+KMQ5*sd@fx<~|)_jlOpzLb{Cs zSoFBK)_uglz!hK#{c}Y&aOA^aMhc+&b|pckCPWe-ZC$KtQ{2mYBG3 zBckOFzNF{!)Zms4xr?`4(lu3kE-U8@33d1P78#a>sU13PyPah8NrZc~eZXtV0EBGI z9jhkBsR8kTeAPHesq9NqDROwN^Z?PF6}RX4`cd+(WeP&>qPmV2%mn`j(i7$)T`>SA z4$d*+snj6y4fTgZ(3Rxh{f$^5!}cR?QKGAgmIcS8jxNKe;_`Bc%Z*bZgtI_amQ?>> z(?7r{kVySQn@hv&DM-bEC11cp5^xGf$ZvbR7{$pW><7(6x<&(W&JN(Ke|9c^Ti4l! zFFU@|G*><2rKUZuG%Ma zzjEt+ftzg17ov@dCc7;Yi$=5`Oa=pG&c*8C{?JE{t9`T8?L53=bL*g}>>YcM_LHDt z8FC*_?9RUf7r77W-`bP=Bs1hTkpO0_Qj>(1-)Kz*J})~+27Gwieh4@&i(J0?wYjjvVg&oGK~10PdpJ5)9SeN;COTbV9IJ^ zT5%v;R6yRiNQ3x(-*xi0cH~`+;@~@T6m@JF;50nS}t!m`1qu}%Fj}) zI=(IKHZsb|tQ?ve^LU%g46(z+lC13$-lGIyT-1J+Dgy}$e;N|?Me8d&7SQXV_H_Vl zn|xip=)9oVpTZAkU8@2CL`4K@*)Hm84&zLl0<$!^TqN8a1C`0&-ZMuVP2lX zQHF3PKK8bjdrCLO&VSb^8HrcUnzQ%_eLN#tIxmw0w2o(XoTbASjalwmlVW8Bo4l-b z`z8VZ+|qJ4RXj{>=T)v-L@kH>5>~qT*{_oI`7)Xc+j^JUo`R=P@h5{*<4Yi&h(zHn zs`=O~-4EUIjHIO&kA_d`mwHA*8SE`c-%U#9QZ%uQE9&G z^eIp_*&RlTa0jrDhKNu zeVI7<`_AAQ8Fw&v(o!0OY!_H@!P+&)h2RiZ$CpWB$W#53z}OuVOvi9F0+ z?Hgk+mxSHd!}aP1nf6>eE~$2yE|xsz_K`F1g5*(Td+yil)??T4hFP&$)?x|l~w3+eoB{HT~7CksMVqU32?y5|5uPWK3 zgugAo*a1qWJGc0ss7XHA3a9(kQbdDh=nZHsspxl}=G*#7gU19p%gLZN{Bc~3mqmhES<7bzR< zvYj?K4r3sF!mjl=l=?S-vP%!a@!wt>r-j&3X>WJ-4;YNE zHN%oCl-y0?jBl#;+P!fs|9YW(4GR;twkg{c#`grDBZ@>tMIApXQeFQ2+sfLr;Q;a%hBF*w;zl1X$HXiOoE!UpgQ)!d}NMEbtZRuHj#K9A9;! zPN~p_VCYzTYdk>aYXbFnj#te{G_{$TS|xTqtUdp35dR1o*41PrF6`l2_G!KGOwiB* zh8+S7NEO&tz6-d$ z%VkH(L8{su8iq?yISpt-b*XPWX}l4tMOkxi)zXYX?8PzkRkD^KctgKPN$xhEH3td@aJ(h&z%s zibgF*rY9tj^O~r1H4nM7RwWH)YG=b@;C6_2QCEL?g*1fjb3do0=TisxtOSGq+q?z$ zOI`ARdAbQ_Bwh#i&IDCkt~fUvU8ZeZkNj4im=fZJ?!5s-%^Sn{P1b5N;|)`3T02ZL zQroo&O8jV$LZr`a!WS8N_Kb99Vl-@712OL9THn7B@EWUE=0PL(dPmSgGu7=1MJK>j zuS!%Wwl>)sZ@+Lpf}L>EEMF+Z`-hyxK4vWyN#u$9A*K*wZ_eiHFpeB} zyss+uX5EUe2U#+z@A=;ci8&#Jm482;%+}=7bz?pf9)pYU%UXjzJs#H|CB%IcF?z5! zS+s0)i#?~-cbu!?VQBRUIOp#}0_0G0Z#7Y4Oa{EW%@je)nn+cU#RgfGiJ z0D$vPQASFe2wHwxzTk3tQXoMK{#@HNM9x(+R;$})7<8d3S{s&>7|-}N+dPd;?hiLe z^OG85oQg_uKIH_Ra7I-w_qFOu#j=wH3d(r`HJyQ>`{h1Lh-AU7mZAR?^rMnWs>%;G z9^SipZM*Cq&;9vIKHCY?u9Kl+86@fbxJ%8MV+0(L!Zy-Z8oHZa_{y-mCZJQP#vfUR zR?9cXx7Z+V`F7&cH13Q9z|=!=TR(QYdNG+5-lDSgTb>%@>InE{yGQ#S^LQ@C&_id6 zZ>P?s85DuVmnMctCnaZpz9IC;yFX$5Nq$sLM>!z6_Puj~{bYiA*6la${ef!hbVEUu zcyVL}cvZaK@;>C+=l%BPty*Dciwxx^xJ#Jtc&FlrbZ3xvd)MTdWgf?R1Etn6XX2d` z%d?Tqi&*aR2ZSpGeX80~tDEfa{6ubfJ3?*Uq}~$oj}9AMIp;(9+vK^1 zvAEUpSYv0VBySps+jXnuV4>C`ImB%;fb!(L)a1FX%7g>r+99%&<3S}FJWA?9mtRE~ zTO;9|OEdfSUPHSjrx+YD8~N%7`!<8U`Az#YYgM{bQzTzZPG-0#Mh|rwc-^UD(m&v^ z>VsIStwbkfKKy7+Corcrg^!`3x6PI;r?u_k>|zP0Zt3cTO(oXC^iXfTAc(9PK9-H!zQ_GSVWP%0Y?{(bot0By9XW!d4jxlODscUMc$ zgPFQ|<_*;-R2L<#(J4P!e0>vT6EGyY*2i1}>-FgQ)w*u$!jY$LS*hG{Tf5eX$mn-Z zSxh~Qjb4iD>doXmBn_#rKWTM_S-IdjcfUAKPE^H%wID@bTf&^i$A^B6ET!tTfo`OW z)w*7bEi2hy@7~xqo!uSO%!+&zQLQMmZE^Cx`7HI+p?DBy%!Pmd6vWZ;?V7~SDc*o$ zOXN=IuZPtLHxyP{TDZ<>(D*kMb`9EOX;i}w+1as6s(48jfH+(L+|RT5@Wny=j4v}| zcagke4dILm>3#u2gRlCUhsSlZNY)n(jn_D9;l#WYq(%JZj~*{`<=Y4bZB*8}g%S-{ zlMc{)5|II>y+Hxbvsz9P%K@Mv0f8n>gfl;ugGdT?_5akH^%wFfZaW|Q!DbNbmDh&G z22F_s0wHoO&MxR?SHC^a%Z~h3&x1NVzuNG<0v}sF+#Zq#Ms?r78AV){`xx|xVCm=r zW+`rvcwp0-7?1h$r+bS@4_con0)kXfdg5WPmkJ150%5b_r61n0&g5{_<-pP=$v50Uw{p ziee$k8vzV6=Dt=-302cY_{gtnP}w{1<5t2@_t-DM#@%5Zoj0v$Q1Qlrj>CRzp`~?e zoxAD^nH&rC%6vXm=O%=VG%V&`atfrSNkp;KJKgC&UmV%4XB=>$sjXlS*M-KZEUI?X8ld%a5{&SNU4-{x zg`@|48s9-mNCdwwyVtIPC3Gg0X1xa(>fzFHwCpxtG%K1rI52VbN}FCd7GV_Bou&LH z@DH1+7Oe$W-nJ$raCt2Gm>mQOi|ohzoqLV(paOM%Rw@l`{JN+Wc%Ci`>}ibqk&gCZ zI8kwd&&uzi%TWU#VBQuFd*ttWNRwLA;dGgoJ~dPK(qVbowy^?|heSZ57d(Gd=Y9?K zr@HSenf!hj6qxhEU+l8oO^x7`N~z1v_-(yQJq`0Z)}LW#+sZD>)0e}rn0y)~zg+W% zS==QIfs{vGzLwo}N;+E3Y3g*YD3;}8o|$_2r09K4QedO>IoL>c4r#qQJMM=hg6bAImrOtW%!>a2j{cwYiw4*P8dRj5c!3nm*C^(~B~_i&L}}l&hI>P36CIqxev7 z9GsJy+Q)0to`6TM1N%v7_|2CijPN3bCc)mPpBUD*~!C#?{9k50iIH|K1EEe zgrzU9X*k)ZWig3~xF}Y&Hr-FDClVRybz>M`>5>>=uib=51EVOY*k0Aja)aZWzDt)7 zb)p){5&+YF<_W=(p zR5$Hswc-S_EvX%Q$Va%=0a~076-j7%|3Z;2&Sm&dEz&z3FQ#jqw`S9|jqd)2_-d3T z+%6YExG&}a#vwq9Nd=*fO2e2QBwIzuS0vfm*a2VVu;O|w3dl(R2!*pv>ti;J#8($P zum=^+e>LFnQ>~VY?=p4o+X~BtVnJC=CA>?X zDPPtSiH1LHLH0@X6`|4viBxy=6=|Fu70^OGBtPF&R~NC{w0$%^Tp4flF>OYZVpXsE zXfsWcCIOf1QlXg)^av0KOFA;tut7^HWt2O#tD}BmHxu+n`sQN*4r$;nMH$SVLbG38eEw7b#k_ zNdYt`xw6Q3SV-g=gV&sEOD0dA(XwFwGE#QEd53?OyR+qT=gN4ajo1-IH8m=g+DfIG zF*1xqG5iS(9~F{u@$hP=A7+x3R6RV*Wl$;5X)rEtD5WSo4jpD1Y)t>X1l4k4bMo5G z^|+TLec6p#hHSxNMiWkm+X$yoe3#(^>OjwG{RC6otfE*=CnxRN0hqjRa*~UW?|ikx{kZ3n?%VRq#V4O3Xt%#& z5)-{VJ$2a9bTFXtUDxglx>5w;GK@(I%+RnoGAKrg#cJITSBRJAx5EL=%A%2yYT*i= zVgKFF=*=MTQxzV?pp3-h1S;1TZrXQk_D*tP$;soCAE23s2RRh33lsF|7B_wU~eS`(h+Kcy#p`zF9$VP1Wu z#+ud(G{i<3?2344rzcMvJ{XGA0%lD+k9T z1pa?&o42Mf0z51%BuPM~fXmVP{~rc_Qr;3;1%1Xp?Mg8dYQ#S&@X0PJ_ diff --git a/doc/src/JPG/lammps-gui-popup-help.png b/doc/src/JPG/lammps-gui-popup-help.png index 0d692f17957ee7817920b9b9f363109ecdbc4594..395e06ff432801581de91486503721d9e30de91e 100644 GIT binary patch literal 132908 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%0DavxrtWt%mLX7X+7C{9L9h1)^?2Yx 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 JPDHLkV1g4){M`Tm diff --git a/doc/src/JPG/lammps-gui-prefs-accel.png b/doc/src/JPG/lammps-gui-prefs-accel.png index ffc558f736c27fe3721ffd1e949bdd55145edc59..3cab94136aa44c91127bafa56a44e7f39e790e56 100644 GIT binary patch literal 38261 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 s{9mI#$?sK$0zxH-h-S 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

88qP_g0 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 QFa%Ij)>Nucc>CeM0m`#lH2?qr literal 44506 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 NRFyPeS1Fi({681797O;C diff --git a/doc/src/JPG/lammps-gui-prefs-general.png b/doc/src/JPG/lammps-gui-prefs-general.png index e079f1596338d4c186b7c819fbabfd9aef386227..765ba8f84deafa702bf268b44f4ac20d4a6c0190 100644 GIT binary patch literal 82533 zcmbUJWl$u|7c~wx?lKHAID@;p%K(GB(=af&ySolPxVu~9?l8E!)401kf1cmF@0Z>E zu(2H#k(Jq*m6i9NxLJAfRD~(ZOQIm+Ap!sZ6sey-lmP%pLjVBc4Ic8dg!44C^)rDs z6_FDG0BT~8UJYPA^Q2DVnocUVCQhyf4#ogYbrKh22S;;T8xnR#7Dg5ZR%TWhWl)ICF{0fmxquqJk=k%@Wu34b)UeRnYFSBWIl8jm z;bLF_MH?Ot0UtLr9+mp^W=|7~RMLF>;JU%2$NMnmn01qJFgE5mk;=w~8P0N_JWYZQ z4-L8X!G-U|g>8eR`VsYF99dVVvfk>9e2dZq4DpAP(*H4=; zJw}7=Lp%t?2ryY&VnM;@WM^f6T~Pn>c^Ced9o@{4iq!0!oEUzgg~9Gu-dr}%A07LY z`5at~d38lLo($&2L4Rx{l1?;@4Ub>?_wNs8HmcM|^ix+(!(vY9;@qU8e8M6ghjWj& z&AT`&)yNKX)WU>6#~392Z)F6LKgGlO#KV(|R@PX{=HF6B*zigV4~;{xCT0AA5mj}& znvJ}diwm*>&z=$0?tW2ig_Mm=nJjEez{t3ilEXl0sX1D}#_fq#VqS@@Cf$FQL8pbO z(R|$$0RTxkn3$6DTO&9ui#zozEScdq>)7Ov@osI`F4a4DtDJ9NObe{A!>u@+R|_cV zr;=O@p$BkjbP6T9sCR9_oq8Zu+Ab;M|I8r#hzBnyFCG3C{AHoep%WixLrSc;A@@l? zGH($?NI$6}KLIs%CSODWniy_3+#^W2Y)n?%HnDMK|1{E^TUqYWW0g5AQZ)b&>w)Xu z6M{}HSi&$SZK!YNPuPs>Iq-|~;{^QZ zpYu6|CQ|%_E}&9kKfdHwhu{~%_({Zlwwa!r1Q8VJ*?k!-40z~XUr`zZWy!8CWtyL1 z>E)G+3g3~eXMT;Rsg2-sC48S8gT{kW0W;;Bmxj2^CNyi|@mg~m8;-o}DeveT^FUm$ z$#e%)86B42tj2BdLvP-VdW6&TTZwBMb!YXLSvN(CIiDT-W@xDB%sL(_3zta8w6?JE zKKfgl?P(ISKSJ+|`; zawW&a;P}s&V%bNA;P!pnAGZC&apGvjTmAsbbhcXi=|n@Ozj<(Yq>sR{|;b-obq&lGoE=XRA%Q;OH8G=#0l z64a;Bf7nEgI?oJEwN@*>0Q*UzAj(ky;^Si)&|XT@Ii*KMb~^(7DgCR)SDwK91CQt{ zK=s932X~U`t*$O#RKoF5L7_=dXizO=1D*fZKqh+bN7Bq4nwlu{+0J`;7y402iFO&} z=J)~M>zvC`B@L#_R6h*#fEh@96hV}LV*twK=4|%>1m-tO#g(V<#|l#x1bQ^U4b^

f*5%P0x&tj)Np*tA*%!x3d>!x4~w$DHRc8 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

Npr&& zL<=Z!Nt`XfJr|WMCplHpz~|1{cqHE9QsrFBKuxJ%_CAed3RE~}c2Zh1sA%W)9mG7q z0gG%DSi*UbczUH5A4TXK2%daOEHNKTdrKA>X}lo(BZ@ZjefH}S#BF$T0T$x>*`iQve4Cfik$CVW*XN| zsq?>tfMCEzUU!sw?8l4AzZ!kxoM?_s$EoV0;Fdkc2>(jXr)=I$bv-0u6@_Z{>#)W( z{fV`N+ViY2x%dWG-Hs--^5i) zmOILX%^TzGdK9eckPPlEkv0URk*gY^em$*6;XjyEkDN}O^ZclYXomYJ)k!_bDmw|F@HZS!F zvi}tvz$V#+>ntDs2Y?+~5NG|zXSWplzivJV_)91$DGd(~18{e$wRcw(Y@D1)(uMQ$ z^S~z&LDc?T1sZyK=~7i*9-c%O$)Ok)a`J6Jo--j~w@sa&wUir!nd}-4b^Z-GpK#aV z+p_JP$bf>AwM-Q&jv<_cxL55_%gK`LRwv4=ZhS7x;v3t`DYKno8 z6XJGHN_3jeN>z%bTXBPYl8nQKso1?_C}y3&r&XGzR!T)9Nt4YD3442xSJ~5!NE2lHb7B)O|f)?XbUn$B?5| zeqkQEgyu~0>CcSABkn1ErVW+B2SDX(qYW6(kw-+1v8}oVO}MbPGUd zTi6bAcD(XGXD+r+(=X58->WWWqWgCSsI8XEs4Ta#_$vwO$vUNh4QED4naQS;{KXBFH()p_ zijA}<_jNU=71fMgQ}ibRj26qKbnr932mYU1R35By>S%qR>ea{(PyVj7l~t+xQ{QwW zUb?)R>et*#JvUHNktk6{xIgh?&LNm+I_e-mgm6Z5Vw-`%%cdu*Fg$6yMONEm_5Wdu z@CkUBM(ddO||C^oSvq) zP#VcOac$G}{e+kWh^0`?Qk;gv4aoEF@_5%$>%FReO}kwiMCsKt{f58(nkb-96spC$ zIl)%X|ELD#I8|f^&EkIqtjF^K)379<<$h!>}Qotz8!M@{m3~`?^CY z5~2wRLkam7%;mfm5yO9)aUHOY(aL@t1T;n{yNuJ1Mv6b$A%RL%ulTqi%*PuEvXpe zq>Go)q8`crg!8!WHZ8WR5K*>w$&N{ar2NyJ2P821ost70`qk=fw7Z2SNQ2DB=k^rG zuTw?QKu?BjH!PnY5sZ0DP-7QY7-s0d2~HGE3pr*gowphhpt>tCG1>VGG~;W1mHqKC+g90QZS1K+R@ z6*3QQGbp5bWhp#ewzR?~3#jq(6ZvBF3d)PG0#dFxAn+mG@SN)CWdzY*xbF@Zo@k)! z8kVdtK50h{=nL@VC?_QFfN1TIh5-pwYC#{>BI#Q>n?^}%EpZn2@{h2J+TK0k2sG!n z6HsXl{a1J4*SF876zOg05ik{NZZ~=eE27Tn__do%g?%KEy?boOd9X>y-rc&~D--j= zpv{3TQ5$lV`5?LD8DTWTKh>O#q019GwNL(;MObyXXczk94TM~I)rFvdmsp7g^Xr4E zftD05?V8K4#7$Kz?Xp^izr`QWaocOX%%M1E0^V=C8|#$FbW&?wLgSnd`gW|PL8{oQ z2A|AL+Zs9#}>L3g#Ry-s-o)y@i&m0n&a~kNIROHs))R+uB{nj#)g;OpVqvr^>;Q?47Bp9`bU> zFUii%=c>>t%2%{221DsDr*G7VR53of!Mx&J?O-+q9t)Z(rlh8+?Mzir72tYsB{jJWPYrarg5k$Wu+@F9#AWT_C<*$d_ z4C6=V*O{yI$;@M7**uty%{|y`P3kb7Dg)+s4G}T8Ri2j3mkH+N0QbMdzY_S9BssDK9i)vX=pN`~1P!`+l zJSzdWFy`nSPY0XF(c9#p6x^X_Xi7^4ml>3aoWx% z1+z9Oq;3MayH%44UID10%l?<%GH7QLX)**OH-$3DXQOjk#e*Jss-Wns_AqE8aPN!8 z-!u+XJj0^(yWHfaI`4c9eJHPB8$mYg89uz)TsHlytMYqKyUFG(i}Y4YEf>UYYr?YW zy7Lib%E7%=%kj}b@*h{>vrU`R-N&X_eotZ*4k!Ue-}DA{uuDl-i31zaDJIp6sLh$; zIy`j^hg$&)X>DxzQ{BDE0S3r5JeJZZud2NAbwEi4e1f zQIslu?>+YBv*D4~`P;0#1)I%w=t-y$uR)oz3Fx_P5EVoBlvk+cFq3?vrl6nzVCp`P zrn6fa+uAY_#7uuGJmHH>_ z2=A*-$8=-e4xVeR(Z@mX%gXX(2YdKVPrHw~7-vyQv8`=8#>H_eEjMHtk|H~D@VwugRlc!y)rs;rKQd>@HG-li`QD_g>cq8b!W@VxEGco z?@iyWwr&e)Z!e3b;rpqsxB9EHpQpmtI;I(JG7DQlqae^s!S(!^#10sqe`4X@d+(8A z=7lgs{uAo*w$pM&<5tL~j&H_{^8dyH@J~R%0O~yOwzD#Q&Q6~f2dkR>Xk{#wMu?n( zf&%323}ezY-8phWXG-m;ct%dmyUV@L!fp%_LRFNFm8OQQmk>e!5i@I8#M9JIZ zwzPxZ;ats1!&q#(-W>(B*DyI>{+d(?1JF$jg>!zCH#H<=;XU^OI=7IEi=oHEt*x!I zGyU%`WCizF6S%3(PJdAwTO|kX85EiR)4rn*dTyJP%S;nbWSYF-5m#7$*x~p z7Pr!3WY&nC<$pgw{2NCp-V^e^wEkW@dL-0};{?4q5mgo}my{r{K)xY8S|Betae`ag zp>=Mm((#etO-7g;S^o`<%+JKNxBSd?SlS@k)TLgDp?2w`1u`7V*+ZtjHl?EoNTShX z1F_L~{r2tzs=UJ3XZp&{*--z*vD5s%Qj}(4ONVYEUQXxPEBnkl_%OFs69icCsHt%V z{$wu=MFqjMT`Sk?wU#0oF3pLSXI)8_HP4eIPq1`pzSJnT$Vu;0c2j)!Id1wJ1l#hM zr+R5wH4tt34sUsIt$Or_4ch$p7W$W#i3H7Ou3}aMAM{I|ozB-gfc#}};Qm1_i>(EpK_pi-zElhzm3B!oMQh~&vSK8%zwn?7oaT?A z8Ir!N@WLfT;C|Y|E%IEH=1P%@_pmudZ_I700{M}|=-w57C;8!JoG`BICmd1+JNx%< zDeO~raXd(5&oFS`(_GjL1qI~_xEFcJ+-`PxAa_jF256N=3z{9KnxqRgHW& z6Yza{d4e?At>6f&E{1tk^4juy7J7fU%}+>(ZYWo6v}y%vS|F4h?fUijG*serb~l0+ zp0jm)Q36>g{Ml-YiJ4iU6;t0QZ^+rpCKuxW?&}nds^J4^H_Svvi*v+Ydc{;IwO*2i zlHgzjdl`x%hfO!4s*w^E#D?=P!lwz=mqN7ocd59&@P5qKIP$B@1?hy4yRk^A6Pblm zu;Kzyfan+BPo|r?iXN6^8ad{BwW%K|-pwr%m4gmp>`=3n2`c8vBR4N$}-t?|J-p1G5xdqvbU@x zdu=@yVianu_3tDc_t5ZsGS}}arJ^{s=Hqi`bkz~!#&X(V3}h6(xhc>1 zdo8ysX8osR@y8?=038%6A^YIv3cVm*8@q}hPqSZ&uXEJ)`3^4FTR}>Ha})$<2MvB< zm7472_ck#}ej}dj&QFi5sPj`nz-HMcpkCj=;x<(ih|S{^WucK*7!Wl4-_V4WuUA9< zDkx+*T$Mg08P z?0SMjMfFgHtsqN3{zGQyx%)fE_aXGj*Xi`F?tW2E)OOhKSD4GNzc4hEb>XwoovvBd zQqLuTL9X}5j*MJ)8ETrEgnS=eq#)m8CzKgkTTBC9gFBvjQb3q*xJ~*Nit2Q+eg@e{g`6Jvz)plREwGY#+Bi7*x<~qyrlA zBVVuPCR=>3IvA2t(2^-;|I|IDje=C^SHq=r1^gYk7UBrW*FH`@!4hu9yQ2dI8}HWU zm4PCP<-^19AJzSgTC9Z!o$IezixiyBbOpx+$l15L2W#)@JyQJ5)yO%kB2jh`xh?5(n*LYFfy?>}`nn z5p8oSu7#e`x$p{mqLx{HZS_md2Rhule3u+W7d66qMvM~)(sRQ@WeLtRTodDB|3d z#6riv*dC}^(XO{df_zrO!JSfq2v&Ttjc^W4BPM97GepbsaxH_f6Epw*2o$8FY@zPez~&&qLE{PzPhRrYeX zS1%a%HpE6qa7D3lyYx&7M0>23Lu<^fD^*J&!C8l%BTiq3I&!E$rXpKsF0y(ar{fL_ z^v`X$-NX@9NEr**3$>5O_ab&Fb$+@#PQl5;4$WheYp8C%)|Dc7=2X=R=Qec>mCXyEA-2+&n_=j2xIN9JaxGVi3edoVc>XH5eW~(pf^w#(qC#* z`vStz+&a+rcNk=?wnQf>#fDXZ_uj2FZ>vwN7Gb|6Dpd`%MA*TmUJY$QJ zGtoOVUhwt&FJgEd#JrGL;-E=_NYFV;UIHN=a`zWk!V%3HFU&bOmv1)|*jK2VW|#{a zT;ddfR?09iDfX#>=SQt5RMH0Uj$xM(^wi&fWBcK>vMx`n3Y^5iBFD~Lj4r%AOc>}DeR0^44u;)5YxCp=6lu~ju$8^ z9&CJg3<{BvIl}XH)d;8;G2blA$Zm2?@)uL3N);)WNPK#sac4g1d~cYw>MfZ2rCKZ9 z+%~o0v$!opBSmK1+#oBHtLNI`Kq&g=crd2qMaE)-1ewO2n2+HB;$|aIdVEyXLx@Y- z_Q62K01_;T#67k?lF*0*>d#k+=Q~C5U{FzWwNEQqn`iRZ0L0!Ho}?AFN-4$S(^?1f zKKLPtA?{&2WbNvfdpwCPtSY^J_H8t zSd52EvLBQoJy9ox^bYxIZKW%Iz)#R9=tM|HRHrGA)D&v#A@w->a(23PfKGhk-vsR@ z<{L?TC%5hrxU_@b5zas1e6Gyv8BEEZF(cq8OlP-0Srw7~#2YHTcz^eDRUx5jgqaivv zHY0u2T%U9AUQLDzwQq*6>5)0`sFFIlIDZJam4h7@@aNm0GSC?2+S(gUJ{Zp&?OFw- zE`~~K$^nE~Oy_+51UAMmioW0UJfITw>M^j*LL5}MBgFdy{s&^6u`k4-=Sk7{mw(I` zkMv%$m(g_Cttsze<*U4&9y8mExp`JlbzyU$=xRk9`bTU&!R`Tjp`3BK+8y(N8m;b9 zddo-f_=Ab($nHlZWg(N-F1_=t4Lv_{`};*GYPw}qHS?Pcu*XDApx2zYlvT`!(8fwj zp3(h#$_QT=ldSdR%N~m}5M~V;Xufu4-(F(pwC=UGzl)cvXt0E)GWjfJNg7u%xxGro z;nkt>nlQ{o?0(HZeX;g>s}$XY2?5IVn`Z36RiYa_E4ct-T>kc_Dt~aFWKTk;X2mNV zMH}*bjP%0?%N6Hrg2{%5OekfWK<+<@IH+4RE~DM~dicU)$8+=rs1RCTI|PY|_A|_7<;i#VPz;#aI z&94)WX5y>qyYIRLtoZk{N#?ykUdxAeL@$uZQXP@yPE3OIU0eO^o;Yk0lQfPCy(Wv< zpz`;@{2jmA=7y?}B<8Fu2C?dpL6}@Y_Z%RKck}R%F*i2vrf-`APn{B4bQYKdDKbZ4 zLHTe@3U5Zt?3^?r=brPc^!vZnNDGgjO8GD#85U3sX&dMDm5sKyI^`5j;ABGE9;+Q} zjQ`d}TE|?HWKC4rS5W+Y81pb4t2#Mq;7uW|Q(fPBIMx~+HN}Z9W-u7NXB(A&t4&;} z-+vh}#LTReaVLK%-+y3RQxOevnZ6|~8t;cgLT_$uRhIZgs#*JIchS|P)p?236>s)^ z9&EaAgM-A*^h-2)S1BH|p&`w8Iyg|NS4bZ@7blh(mPx>?c~jS?O5boiPX`nj`kKWf zJA!kL&)UfNG4!yDZ=Auhf$5-6UbiJTe_t~N=uy%f4!?;{?Fqyji>Tt7+AbG-O9e}< z9Pg&|%s79;XbTe%d>!)n0ne)p8ks#sav0e#`*x8nybVko7RlTS^=Un?oodSc!`q8YBm@ zjBRrWLCd&qP^33ds0gls2CnlYIsa5&pGJ(F|8X)1Cg6q%IDV+SV8cw_@r2gO4l2s1 z>py25G=S6&=cx?E_=|^ljA#zgI}Www`X(4o=3n%2Xq6l`>r}VR77c- z&bAUiN4C{2+Yk^%dk(*rFA6l1{Jr)Aq0;7$Bkpa$Kg_F^t4BcthGM`ra$95@DHWjw znyE=;lctlrul^gEMCCs-+-*e`2+O>VVF3UKC5>}!I${|~wO4cFO4(0>);&gpjm7>B z{wx~0InrRz#C3g}8rKoOP0;!Ky@;9$HLZTH$49#r$j#X|_q~_GaGQGfD9ep`@N7C3 z^29Y$Tg;)^z~*NqoKMT~=DyHNcZ2rjt!(Uc?#u)IuEj6q zA12aF{jsH&ufG%UPuRdQ;GmyQes+8KLy^D05mG?R@_U$mf2D{2aU)iJv{Cy7JC*#s zP$`?$74yV&E91nq%7Dv_N9U-ML@Yk;b)D3?V7<*4v8r?-)^rmX5&=CO!U!<_)m>Rv zvM!%}f|9L_M)33UYcRUW8q6UZH*2xg{Y??zs{B2n=U8g2caXE3S_~hDaEEJgpZiD0 z>B#5n$ieZxFC%9y{6dLv0sRL!YM7?DGl=tU933lGJ{9kc5gWv5(>;%-MNki(b@U$V z6Eh?QSm6WIo)O{3Xy*Pc>pA}tQXw+)k#1Guul!}TCDb8azH~VawB$lukj1|YdkO%c2l-H@9sLu(|8Fn}|5u>G|J(V02XOqq^YTADFO-ZTnK?N*EbAD+ zL$OPEGt9b_^X13(Are3-yn6e%n=(5y!w~KF?~&Q~*vk3;fu;G+rBF?H0u1nWB>_hU zfSiAIwKw|f>?`Z%&!49k7Mf~mXdS^DJxWd49W5@e4;p843#wh#TIp9IeL8c`v*AE} zAvRlERu--A6O;CD+M{T!wx2(LK0(ekDz!N#uJ(GAj_7Uiwv@>`9@C1z{E&$-9SR*C ze`Tg{DUl%sCMv4_;o-1@2Vlh7dZ4=EdaMfFbIrU2J}>k(t9kOqS7Zv<_$w|=j(;l_fK6c^??(L z39$u0!x3|rP=<<%3K9OydcL5v#j~n3*U7224bIICJT2#}{B3hPw;e$rIgl=>F`!`4 zt1|HPBRme~e&)2+kY@P70}Dr*?ANa)w)*QeB2|tpF1)-3Pejd-nd~>h*mDg`i2me2l;U|j&4xYxc$%H~OlMfQj?y{R8efv$FwxY={ z!o*}Spj%Im*Api;q3k|LF8|IJt>qn40s|HHXkmkc%`vx;pib4b#tJTo!ZxIl|zfLN+zUeo28{zRt6u zqA(MUKa_{kQL`M==k}?qekt-1h4rr{nvFm8n3gSnk+1;3t)*YT-b3Ke+-!GCoX`Ds zV{@Yz)NL)SmPYwDe!Kc!hP20^be;d&ZJ>GS?;1 z%K;=Bui&=R-z2N;G5pYY3k|>Mm!syw=Rds92hs`(8=ZC^2A%jPMoq6Ys@Hd);|dw- zBFf&oqq$gdKhAHD5UM=y1f7`lA?codt8k6kr!X*h)X}31Q;s zgrvrvP#b_rt^<($=^2<|_{DAknAtHh{66OVIP3jZPGk^0iLKVpW0>!!du1z%1K;O< zl#t}aTNDdI-#Gf5O|8@X8aC~^N8j~GRT_iwOJ5GKqvdF0d0#?0z|b_z1HWDyHF@mpYxJ$a|=XWqTOtpyY; zXmJh=)DnCSHRae~Cawccw+7aAG%`8~9hk9b377jJ`WK-|w;+&zjAp49q)r9tWe!Rg zlkJ$aHxa4HJzvtV3hHjVmlHfm&J6R`9iF{c>N0XIi&=z`AoX~4S=fwjoBxtxfu zljCK9R8?hq=HTUIvQq!es~a^TtMy=jt&jn15pM)L_=Md&?J$F^?k9 z^XgrA;?$-_fppbQZ-a{>cv1p0cuk~{kbUE_bg}i4sYkrg?r&sl&HtR->HL~eQHT-N zNP7^YTne>7%)Wc>NljVMTj7(w;+Sg-#x7?P@YyFAG`mSqp(0J0^|fw3dL}Mk(ZIy1 z3~li{EMNfQ8#?LW?`C+W`Y1c9_}q!~{(wc(uNhSz@Q6e(`~7&))?vipqeiRQ5D{!b z0}}nCR}r;Xq|IersIKgd;-WUY zcb%D8o(I)M+bd_S$w8kAu{2viq1yvb*Z76~nZQAsePOHk;!<7|_1?FK*dE^%FK$7Z zXe7nPyx+FsR#0P_yUbU+UR~EGjO)*cVlVzE6gDx7N`+zy%g4`m3e% zGU_c)7$A1r7+X_|)n!RIYd3rcppF(95(_`5g%QQzo?}Vy12>V`+_!yg{04@jFm94+ z<-Nj!kq-;oh;p2`SNs@n0^{q`P+_uENMbxDEp$!vmcHEH@e>wIY~Ei)Z~=@Io8^2F zNB;0n(*%2bB~pY>_ZARTI%lZq?)?-S(J_~5Q}%!r9A>#P>S_i~a?<#*DLVD#sQia= zD~9g}p1Qh%e|p??q9f|W`)76#fJJ|14+C4BRyJ<>3dX)8a5@UT-I zBz)JUGcx+4O(G6RIH}5qX=j3wkHgY6!HZ`Qj=Zf|%xOHnD%400vIX`)w3D zXYe+-mZF%O(<*7M`L~bRr(d{E3!a@i>(k*HEZKr=-zrmY2QOE~_tqOmJqoJ{_y?~` zz~4WQ`9Bqq;N*PmllrgNWQp>9WpndlD^IE%IaKDq3#flQYLN&QLQDO2XMfksxMe-m9qc$h)4T>4oy^(z(0pco z>8R+=X4qgD3Ph;vsKizLm;D0NTy?P@tzQ}bxbcye5rz@ug6SKFY zT|z{IMha-r-CMqUOl?}pj{dK^Zj@)ZuwF8`=AwqZ+}iDAe!#}6u+-wrk!a%jIP$kn z6X#qn|EaDf4TPD8;f_d1b6YyN89&kYOnPAZyNT-7Vf^jnjE(ni8K zmj3hy^KGnj z)HlD^=re1(qxz!rZ9c*_uCMFM0xz36gx6`F4c8HjLd)k9Tl^F0bLT{^$ER(mDr&W( zBGj#+$%Lp9u|8IG*#yG}DQKa$y4QdRVy(&o}I(a2( z<|#HEzNU%RJ@$pbW36HlNTP312r1q&t(k(sQtg(Le^dHo;{=q;&Z6pBC1&i5F?*?+ z+HBE@LA|22sKZ}dC`*Cin}g?nWsTyo2dJv_9N)m3ew&+})X{Rf`n$Yg1h}|_I3)Ya zJ$jjOJQ|6J-=F#9T`IWzcGeAOHZU1X>!gXx-h#0{^|pSoy5JZ3rh7gPS=?Wfm%3da z_P&30kY7_rt`3#s6H+)J7Q6k(I%XYfA(t~377CQ7P55-yz6vb4?NQh7)gnu9Hds8f z4!7}6Tz3-x&3}Ds)nHpbXAnn6ei_djPknyHSUC#3!=$|R6)F5FvEIKwCKM68Z3Z&o zV3Dn(qnEp}6V!ztY8l@Sb6AxrOp?stVS8q16sWY{hl$CM>6LD-sTGPkygupjH;*v?(9(MOova&vNQ@S>r^`KD@p39Qmq zHt!*>oq|7r@k;2UnU>o5Vg7 zFsR^Y7=Vl6SydMq=#vdd>(w=hD<-Om}zOEIt%U)VW|C7&W*y$BSJN}R61E4gJUz$pf_qNUm1hzj9v)U_7+{J#oX7em(dXfV~wh)6RW2b1yiA^X*M9E?uzSF6%*{jcTh&YirI@2T41&0SP2SqX*cYyb1T2qnG*i?FxzOk_YVnE_l#1&YKqV4Loe1CL?oUzKUUB z2GgK`6k|H%})qv?h7MGcj~ zzl&ABT*PeB6)L~}S2(R!u3lNtrr0adRH-(tckedUcMOz?Fr#RJg!F%~xe~09C&x+r zDg^vktOI7$e|}99L`O$Qwf6R3+P{*AE{W4Ul`lCnJuTfT^p7{wM9#znKAg%2;eq`8 z;${A`lgnbg{oxgf{%wS|HT)w52uMv_q~yer4p87x8R+wu<~{?vKvLrJVpSrB-~SiI C!6woG literal 50767 zcmb@tgLfs*^FMs!Y@BRtZ*1GPolUZ_ZENFXWAnzgvDw(Tv2B}A-k;z3{s+&TIcK_O zx@M}YdaA3dUlpOGAc+Wv3kLuI5T&KWQ~&^QV*mhb4;K9E4jTLX@z({?Tv%Qh0H}+D ze=~yms*}2iYq_Y}o4L3fIhg{qG>F|yot!Q0?TFbJm>HPqS(sQ@nb=u4!&tQz003fu zw3x7(N7h-kyB3BdR=9tMH*MErY#u4Bo4B&tS(keZy<4HONmN9H{&#lF0%eo4u15oa z$v`#LtoJ3B-SYZn96YR)s&L_EC-PMP#dvx;>;0L+vTQ!=?ZE_8pb#+%?B^z(etYGW zPTmKn{l*#(1A~EqfrNxat~4$9f6oO3!N6J?n;IMH8|DZ9fH8fwS=gvrZLzP(&%bU1 zk)gmsf^Rz;o0yz$Zxdn>T^<~q93Cn{)HXLi+}S*|Vf?=af`MYB$BQjB-8ljPvyIL+ z+to&PX6ENL9n>%Kz$?Q*BkTkz3oA1kz)uqs{rStkq44mSgyFx0^|X)?vl%kl*T4Vu z!qcucSC_Vo7#k;;EdEigPHm96auykfP5#H@2v3WQ%pM^wJ}nO6ZVUSF$y~QJQdtJBO8+T|CyRgI+rFS5-=tL%hd*1 zw5<#X88wAc5(|FCsHmvey$IrQwlj+>=Q65(u`5KZhKLriSDZ_v|5rUFvtq|Pf*rSr zf?7N9;F>CJ9jRI%JAxIIr)Y%P#FzOskuvfz3Ea=6dFsYk*voxKy&TApBzjH z%AZ0hU<}$r2~9~QZ_io!xNXb1msaSTuq9?qp*wuO5_3E8{V2K`w;GG#r7Yo1!E>kH z6(7(NDxptOQtFGp+#r?lqUH}2;2-H2-BKW@7B#XJ=q^rhq10|oiQn6fG9F1*R!@4a zU4{N~z7NZ?-hL|u5nA(lG*6Q8s;*ei1J$iIHX8mcVKslD8cV4IChmm{@(~* zi8*CEo)%J6zWfmhz6AMYvdeA1+UCu_)dVN1IPJq3Q03jZKo)BhtE@t!9Hr>Ma!V_J zo3aOIss_oej@Pk3sS6|zFTVDVk=bQ`gPWM#?}NC{l(xTlLh*C%~B+7l#!%Yo6>FJs)j^aEs3Q4_BUxBUpV9K7_;bjX(oO-8WJ| ze(x`-7J#fv#$PrP3AqP1=aXYu3)i6KcRC${ESYjg~j<3kJsy zkc?Ep#spz)j1;g56dIr+oh zDcI~A;~&2y>TBpsAg=5~Ps-UleCGVsKv4OTHN@`(f zzdd7-k)oXKlOO^QPPcv%=85rik~WChB&R}7_xA@FrMV<;M~K#Fd%8*KdHDi_^duMn z<}m9AO-1Nbgc&z0u{fp|4m+2E2&4O8GFvC>%?Zg8A1@`r(v{&6Lf1I4%Sp*KwX2Ix ztbf=MC*0K&G?&#;wO!FRJ$tXkvi~!ul@c0@X?l24 zZmo$7$fNn8qkc0NAFik}tAzm{feq~y-6SbnCtL@i_BDOTZhws?qALzJq=fDKRC{PO z7By-!6^4!yC6US*a>hfqf+n#7FZGPVM`9j6y%C6?8EkG{UX;|)W=y_EbsR3t3_mS!or zSa71lLYu_pq@;H>J*CmdOL1Y7bil>K@L4!|q&yRllFE)r`nWT2aEr|vt0O{~lVN53 z8P)d9!bjv56lR1Eq906kU0vOaf) z4X?zBxum6>Lv=%%*=Z55y>e60)niYF0*ihjCXY9wiZHgg$_ic!aan%Do?$cGR)5Q<`9 z+mz)OMRT({&mULyFR}KQm^wGTQP<0OvYQwRO%^WJ;#WQ>`-h6K8i~lqn0}wi#u!-K&n(b`@NvE4DbDJaeK$ zBf1K^wJ=n5LXuPW&@NQj{+OUOIH3dB?k7MOX0e2*igy1F>%%X|k7mD78jsE>jIDK1 zlVbv41TJmSlgRmLHM~&)&{J_ zHLoyC$^M2vx3cQ^!D=d7Q~jz@9dEZmx7oHTKIY)6r{!-OJhK8Fyeq<+wse*&lFxtRX{T^Go@0hRB=}-dwNBwvxJcVUUvK&9v;cn!OU?QX1j!j;eFL z0Yp-RYRuhHp2}`z=U#%WFkk#wFoe)4Pg}(y<;;9PPt-};1I_Q`A)r%RS=(Dhsw=E$`gX9j^Yg0){$jBOkDAjM#V08uqNMR$j z162Nu&V^uDRXiFnyDM6x9c5r2EiyG6gc8;5rV0`J2-uwAuXOdqh?SYK@LNI+W#XpM zk4ot%&Sbb>xG#6Vi$!4uVH(U-txnFcrYEO5OD5o1{Av?mHT^DrdXzaXADc~rzBoHe zd-;0&HKwURD$UlQ0+z@W(Y|Qf%5)13nvuxE3vj?jwtF&5ty?AP^_!g>2kkVAE7Rh) zXa@etQQ3pv_+W70`P035W(2yN4R4Q{wz&K!I0LQCzZDLQO;lNfAf7v0OGe;QlhAP( zTQMHp+GfPS^3`O0>8BKw4S&a+H?7On2fr_Mj{k+o^ziNtrsb;q^Xa6T-aw=cmn5aB z((Iu9tWsE0V@d@HfEym3Fm$~4|AP&Hdxqgo$H!2U0Sc)ZOUjw<3le{Wu>F!J;9H_S zmv$^8f;I3_<9j>Wm&l~qZ8HwU_}fv_WhE&i%E+yy9SSw>i_GjyvG4+gp5j!DC2nUC zKizs^y5+&?#J^F?3_C7^4>EBojyeuchGBQVkQM7GHQVjP*Iv)SDtKS*X5QL?Zf~un8VwH0~abbQ1J;pQ|1Op>G z14qJCR0+A6Lh&qa@$4>h&^&2Fkw{(fi%3EuC5TzsuvA|R%3z;(nkwCn`>*K%Jb<`3 zD(N?qprz;{Ch2;Ca|7R0Qe#4L>Sq9XS`bPok=!0wIWb*sCOCQ~4}+i%*!1%1v1O;I zh=_!nmxSHf++v&MS^xCH|9r!4rvI#;!K12S%j1KJp<(C6;zozDtafDjJbMQHRFqcHYW#o!im7*M{gwO0s#cS`;i zkzSWZkF>nb)NkYDpUzQ(W#%>!c_n~?oOL%lt?<;b!XQI106mDc(!)f$?6}*$dqaF` z7`72oFNYORts)GS3h|0X;0F&cv+OY2hsQHA{0&EC9jXO&>)LOuDI2;*VvYbB(d6_W zOfEEnItJ+#+3)S4>FnnD{UWCa=U26PjpR7bt%8A9`^xhYD@)vsj}rMn{M(7w%#oy} z5%gWV3kL>nuSl)J?c*rbq)}JZlE`*#TGfu= z>uujg#6hbJKV2MGP)cW4%c8d#Yc7PQC|pfUbhH&O)jVr8q7Fwr)0jX1=%2D`f(XbO zFZYdPXs@PP_3P0Jb3KBA;K&|@%?6^(P8;^n^}{%Kf23_ z*i?FFV_;?2P-g@+b1=LdRYJIYEU+*KQmvKW=Ic)a0oRqoVGlqcLxq|Wh5(<}MPeAv7?jmI*}=&thn6>2~bdwYb>C=J;r@mG8>3joQySnVcl;0nG0R0hl91f* z%vS>x*0xk?$IxcLK&cQ>p{!B4CPg*P6Hosppv7<3u0?)Z=F5UU)SDx z7C#WPFWRA9t+nJ4V+?wyXEe;bH^r)0=bt4>6(VKt<)br*|I9CPX5-uz0|S>?QiPg9&WxiGS5fRcO%yTX=J&9w4Tsrk@#^z69urIm~37 z-il@!6#X7lH<*@q(JIuWi6-WmT9?BLf~6GPwCIFSblfEWy)mDMstp)ylm?>pURjnB zlgo>Ztt$?bA%&ZpbN?fQ)>P!g?`vMSRTdlDUELk}yRD{*0u+A`0maD1?xBlkw|-KG zE`Ct-zd+Qz(kN!mg2A5vYm>k_KtMOtBmo>lJC>dtO{)*yLojlP#?J@09-?Kp;g~O}U7Ek+!z>KZ%ba%jvwn zChJA1vClhnB;H)zgz~+viT@~Nfb}gcB~+0Gr6es$sCn>+0xq z`@Lt(YpUln%zkm2b12xt5E5C}*ho(Q`MvOh%*e>-|9#)R-OSuPG38Ob*AZV_*{Ln- z|ItiULFL!Sr+gkOKPJ@J6ugQeg~TW9$O`ML7Il}SsH7R96x9pB8yeOnI{%**xlu%j z)o5{)1i(@eWDo|wMemmQahQ_jwZk}G(#WRD2Hil5RSDy0$cI4w_0K%vO!UE3o9Z(U zn1xjR-iUKW~nF4JdjyY9Vm6>@W1{i+}l!TK+SU87y=sSIuZ zdBOKgifn8cfhwNwRp{6G*CyG6o!zhH=z<&q#;*Y}>ptDLPmV#S^|=|y9b8Q~c&?3T zbu@XcZx0Ih=r%Yj4y54_i!I9FU%pfV=o!zaRM z2n>JMkGR;ZqyM^s2u0-koKiXjNr}Q5SL*Pl56jRTRZr^sY<*X% z&2A^}sO+xim9~;zNGU-){D7|#I4mBP=h$AKxbQuGCwLIRJp-lH5_8E3M#B``>X(z_Mm1kz{CFgDzD<< z{__DrSTCYnok785$4dzQl2U0-4@hzgFo?L7*9p&n`nNsrJSs#k_=e<3ZkiH>13bjO z$;43j9yb~a@;?6#1_&nH559>&MHny@m`90SLX#WSUK5gAC;GTqo#e2{L_OkGaC9bCr1nvUV*xfjH`V^G0ZP56ru0ChDTbIIzkr?~Rn&G3dO zJ>OP~i}aVsGj=C}93m6a^STf}HH{6_p71j)I)pHUQoH^4t(`nCq{y#cCpmVL;UPV+ zi`nMAVO3(1-vbEs=$44D;FyqpX3?-s^<3Q8^F6H+Y;spbg}HOCX*(~+ZGy00l57{q z1#N5le)bDniXMSk004MzM}2*=H+)nI!DWaK`+YERVQh_d`P1R0w}$-S)GJ61)l`Ob zNpZbDgq83b>CsC_t^id6z)bjkldH14J7O0YHoC1fOLarcyFSa16IHJnQD5e(*~!M?3V^B%ei^hnwHzJtBH>}A?9Os8}wjWc&O@mQ0g2Qy18 zuN61m6uSu6812o@Qdf1pa4w-Y5Bo5hJ9}#u1D3E|HyzGpF-p&0`-BQgAMm44BBuo- zPZy7=+@5-$>yn1HdFzl zp*Mt2dax(x(ewa-0P5&aUJ(ihG#(fO++Pkrc}J!Xs#+5Ng0mAe*RBFLy+}qoWPad-~*X^7~2 z+EsnD?|h+bFK#wdNp-Uj@TUc;KaL;#u-4R*R~;Q}zc}Lbeo9F0$T2Uzcza$r2Qi-# zx##S27lPtZ*NdmrSS8w^JEnT~IgdJYG zod*WAwi8b2-wmn1SuhCN9hNK?$?> zkhbT;dp*zl%y-*-wa&4+HJwZQL{+CB)Lrd7degYHvt%%cEjU}={yJb0>j^%J?)HzLA)GnZU`Dx{LfmsczYdGlbjOEWo&PiA> z?vJ8;oB-q06M)E2#!U*EKp0{v!j zc`Vh(v!^Hmxw$Hw-uJJzw0}7(mpPo?vSM#1%vf;-zQUq>52LX}ar4ctbMzIcb{~Ft zYTOqO#~q&v*v($jiIW54zgp#nV!cbJeguqeVs4d3G?;fcP^HmPSvTSzHa9pl);&5f zl*>JR_iy?GF!P)^W-Bf+dkZcsiFU5v!E5ive;LvU6t@Q0tR<5<|9II1Ely7pv4mXZ z8&v!s79e6v&px}g?e2h{xTU>g1WVX;!pETdeH>`S&)M~-!OhM1$pU@+sTL zi2ANe`EpFb+fH^}{(!(9^cerE(h)mOkc%|2+ zPq+8I3VQC2l1)0qJQn}|WMq-mYkiMR&~rYYP#X>`cxlI3%(*CEPau3&sVVYImZ zk7*TAUr0#o}s@=cDT*vtv4sz0nm%z#fZAO#c+R>id$ZM=RGfT ze%MQ_!zxzb^&(A;E3p8SaDH$<6}fGU>Q_LcwaIuds13hehynUbO}z<4RvMl(2Ooq%yroQk(_Kj zar^MNN*c>f9pYbWlRI}!HgP-WZ?EZNIQ8|5PPy2()%3RIjLq5Ae7)1oulaoPZgPKX zhZKr1P7T#RXZ2V&i&A%!oLnUo=oxXb{3Nm7WB%O9Zbrp%Xub_vRUFhS^L=RCcsPyP z-!+qe>aZGXFd=wHeYLAr_*^J66e8+S_HV3yw{iT=u!g0SwBlL+72Xw!14o zqG9g%H6P$Ku+n8`z;ma$N@0g}z)dK~%z6=%)#Je`MIbY9<7*b1c_D;6JJ{!GFtXCj zi>wE5IBM$@KVO?TcQWH<)#b6O7IaR-d(YJQp0j%*pWD@xxFCYuR~?%DN9$vu-vQun zzx*k7jx908UR{7w<8T% zT71|4LD`MpP!^P(`uSp(D8YDozMrjlTaIxs=&Z`HjHS1AHhM-nXU5>kXtTU&waWb> zWOyDb2A67euRJ`X1bwB>ofzp3T%BS*VJn7g*zK zYJ07wKxEo3a&$F=_QxYaNnCw2OIwH?XiFy2?+X$poAEGT6%;*Loi6hsIJMw6>JE^ED zOI!WG@BG3}F~F}%jl;xnepj+Jwra2&qwmi=)=$=--4|A?jrbF(ba=cObr&~>n@t>* z_Erzxx0EY6`o1nJ3PH7)0mFSD6;P}|LL?v_tt7V@-C3YznuI$%;24Pv@ zgyd1#VJwP85t*qUm<$xUAMiUetPh-i`lZ58GcKHS^4m5R0oGc5Zf><`p^2 zTeRBix}N27d0qibPM6#2C;|fCJMOeu8P67QUNIrS@RwZALR$xW#(2`;!7QY)s@Jx# zc+wb$y2g2E*zVQ(cL!ZG?>mEC zrhkWKd&M>S2wzjz?k~sUer9<*AZ`^$6by8`E?#4S>-MO3osk2keNB5(s-xlvx%iJ> z%_vp|1sBobP~Gn2v83n##qWcbnxw^Qww|-SDTHQ)JRfdP7qh3DhB+PELyWv@#-PTS z(~l}{<5ZpEh7R%k+T>U&ZryJ}iAFH|&u)+Qk_+J+@gp(wRg?zBYO*&%htTZvi8tIualxTO40 zkoc{RPLita&?&O0M7JV`XK#nw$7&p~SxVNhB|oC{>LEc6*nN@O?D@Ioxl6b>9KU?S zmzb7~ZV!ZXxHK)2TCH`Bd2C;hhBrBp` ziz#Br!cmiKNmBom4#s=SbTQsB>`o~`W(Pg5HgwmTz7Cr4_W)g10BYQY`$~z%h4RX# zks@H*ZdEnNEm+_VKM7kZ+%G19WkPnw!-jq{yBhTAi*g8gtCzl=c&|E^hhVKQ?JNJA z)zU}w3}_BE{A#F3Xx_aq)t@=_M5d?{UnX2So~e?sU|$x!zloy&^z-D&u9J1+dKh8% zRfpt!g&_`B{?6l51f0f+=&j$K{$>;g1H`x(9shLL_fwkd2J~KATpE=i0sCsZa;LcV zyuD<_*7ZX3y;`M5)st&HA@omH+7*5rxVE08`u+RtdkCQQ8d6Xw^|#x(FiDCXYm!U| zE@oR$F;Ihlw4pK_y>^E%Y;Ja`@!3wwsOeo~CaiXQVFM`j_HtZ!`%R{{SP9xqJ@za3 ztk%17DxRBF!SFW2n5ucr6CtE}UR^y``*z4U$3a*aLuNuFNg@$uEgKUDWX6e}EYz_w zYISSRmryR2m~mh1FD7Ix3X{}%zC}`&CG8ZnQ?+wW<~+Nb**Qhe4?_o(bm;f3@$oq- z))}n@W$x^aXV5WvWn*O(mHBXf=OhYmZwJ-Vay==DCf2*xcihwY#PdXnuY|eYGB}w{ zg$b-fBU=2L?=)5Ih?S42_>fGs$ZNx%=n|u0eAJqJ*LwO#L1uoR(|%!@n`{L}-?v&9 z4X%{~6Mu80b}P)=G?;_m&{9~&EU$WIG|?~qh>(8VsV_B`Iy=Hm7x3KArxHyV_j-!X z{voHj-)YY?b=qOZX?szKIrm*9lqR1zKZGtBC|`%#D<_MRt1b-Vi8T?VrxYM@jqhmH zb&Ce=lIb{Pce2+YyRyUz4rbtH0ep}iRl&9R2A7Niz7Y0&kCmElthV;+)exS{Cu!(M za!1TXKZ*|Tl08+Mw$2VY;A%_VWqpMs3`(L(79u zS+;?kdVckEdyP}or@<`3nN8vv{|=ZNH{DnT1D1xE<8wfb-azT7&#$l2Q1DYcBW9`*LxlH`2@BLXm~VKuNP^YQLP zxsTsyQz8@&QPLUZf;gkht>!cJgqgdLeQxXw?1XgPposxC z7CwhU*1nrwdY4UoMrFq5Eat4pS#3lV)5zMOWf=qjx8sy7EEVhSzxL-25jE`y68uQ*jD-OJ(0E47xesvoQS+&-`Xu&@THOtaSM*FRV5uayCx?GC?vY&GtlFZ<^(OK-t&w*h(>3l z_JWy{WCH~Dtzw!MXgl8QbN>B{sYOGYSHaNkHm&4l@uCB|n+}%N9eM!zZ``fU7-7Vw zBnu}}pV!gpLiM&vEu0~cpYS|EuJ1+VeGMbYCOl^;xUJRKiW|u@3P8Fz3dgnu90cP#yTXH@xq-IDlA|>OAS! zH?@45CF(&-aN+_0^|VNIad2gZZ9~@`OH+xKRK$Hu56;Q-XUAWZ1~AS!8m%25(5sT} zzKZl1HFR+WUE}qL!D3aAxZ|@e6DQF>=gR9~s=-bF^GOVz+hZ%wGPv3xY5}8Ni@LSv zg|pN7z+ujB4#$>NT;fjGQUFg69Q(C?jkb~uAfoRaP_NxI`maqnKl(?WN$w{2hK%zl zB9;MCR=0&Nk^Pq*-spYjz1BnD>2REVVO~Qnd#(lMXO~t37Os_RSL+d2i5I zn4RPa9p=WAyeZbNeKE7lcMEnrH`dAwWF!pS!~%-t;Q=FY58~v%Dj;|`tqS9*e=wW7 zTHmWl4u;y5#1MFP(-5JIh0ic4?RUPfvw2F`gbI(^hnU*^-eGM^3r@0=m086JKq(~? z%BGy%BaC4nAB!O?5(!v zVUxr1tAdXnx{(1ed<> za-La?>zCl`k zbf<+-ekKQp+YAA3!N-QAc5+;s$X9T@|M2qhV%=7lUwC_yQC_TiBO9532jMFA!k|yl zPzbXi#ozM=d2^#HSte=UAf3mlR6RIFr%{@hwF|QfGt&&6N&d4oqP55iE=5{3Lf?fI z)Z%kM_8IjV#8{d~I&iUd@qTd3I!p$Cb5DBb+FB?{U08mzy^!VYFV)wAzMVSw_x?6> zQ^uIg_(q_eZqxXBx4o&QD6@legojPZ^A%ia#KYH|)IM#OeqO8nj zSg^mq)?2hQnRPzcW{{4G>UJhFHN!WjA#ovY3^%&Z=Msa@_4CGQNne+ys0^Y+v24htUi`(ExO$O43awW4_S8ELlnEHv zUoO>-`e+q`+ng+v6vaMrDr^_{HZUrr@tkJZzLFf**gGog>bTpCS%TIDOd#dvd^CMwWdpKxR~d(3MM^awhTR3suJoE+c3=lUnJEF1W0ae0b$`+%$0zi=FF z?gGbrmB{F1L<;iUqd?|9{@{^s&Ct08sBYRnm67-3QYa+wPTnO5Rl{}iLX;WbZ!T{| za@Iz3pI`satd#&grZ0Ilp|GotR>cXrFW>)$ex`f9t#0dMy)`rh*-e{Ud}6V*G&FcM2v;m~o*Gnrtt1fK9vqtrRs!6XCcw>Gx4rOeMWqyMy}-xLU=ldT_)^qfxhAMN-Rph6A?_>Y)>{X{=?`uPF?^$&2TmeA|mEi$j- zh>+-~c$=OK>m^>lnavDtx|wHX{}s1UfgFEz9ZoxLFy2sCBrlR*Yv&i}3`M+E=htm> zTtgn!5Zp5}r#5^;GS!(ezU24$33=+}HA&3z3j(jv?8_CMYwGesI(o3ng0I#>BIu&r zo%i7Q6?`&M|75!fKdy7SyrgDS_Ay&B*kXP;iCWd1X}Yt(-8{%-dWu&_r^(ONSj-7f z%80*%GI`(#XsvoVwRq?4;8GMkW{gv+B!Xl-QM`9nWOtxZA^mvC!qm@NPoKX;5K-vp#OCL zJOex}$sXpmadFtxr#_Aq6Z}0G_0#j*_8?Ow0o3>fJL8)zo@X}yTI3alv_+8Ke5>J0 z`K`AFE}bxoxe&etBScR&6Ci(BY+$wC-FGfQYsI-)`-L`Ycth)WJpO)QMwiuixOS!~ zn(57N&7xiKc}pS*5s4`ScEr5o>a*Op^67z)(qx6J)49iwEm$RwFuRU18SLH)S7g<*pX1tUEg-5uN zwyxu7nsM_{w>KkG=s4y2Vn*? zv)+&_|BX+O-Ho_X%%+R}%-q7?>+xnm#`m^s!%(#^cIlyGsC0?* zA)D9!=yIbM8(?AmyCZP)a*5w3t0iW0(_|zccZ_g|ov71HJ=Jyf#D1ebZcgrkc@}EN zE>G4jgc-|d=!59sZMp6JIO-*n^q-ztWMFpD$ku>= zNO0cZn>&{BgBp?V2fgL3eMfMk5ctpT%b?>P4lefPO|b_yXO_>K^|)@aa(vm2z)SSMu6m zF8^UI{+e5hiNvZD{03=1{F166FZ&IyOwmRWu}$|70Ng^+|2z;{BJdGo?M_@0`@9v-$#pPmbHYC*w6BSJo-y44ls zUY@*5E%RoFgT=gvSU>N-B919dBeEYEgPbc6P{xY#APelD%72hS=>VsqGvv_DRJ7DE? zCU+r=E-|sCI}z!RUXpdgihg2h{J_e_e^|W0eGQtkYWM4K`Ik(%>D-BILc0(ay9fL)!2iL;u4Z1|~^Hl@n=y-XCls@%bMuBF>Yu)x^A65NOm zrx-g^X=yyty|1i45C{y_0*k|u{IiO55nxr|^f$!$fTrSs8Q%u^phxA9d| z&4>YZ!7cqM8Uy|sQN;GcW6}_^V{0+AsF31WC^wfK24Exg(cO3)DV0(Lkf_^mH_XqV zQE{x~{bo5{)1{ETD@&#M=VU<(4iMN?D^j7ADrq7Ng%$xl_Va`_F#LF|?uT*xeqTG6 zCmb9p{#o%`+@99*3kL_f;jlC_)5w?e@%f->QLsFhkm(|j1|`Kaml%D-hBg@gRQHkB z{cfR3o<|sp1U2JE|C%lZm^V}Eh~9U^{bE}$qee1eXP*9##%oZN)6M->;7`X-_8vLz z*;Yvy23qF<#@EKISI_w-`sk{xjr#c;vtWeI|1mRfoh7m+++ z%V#THJ`uRmkvy}60C7=Ibo&7fw#to}!}Vqo8nR=W{C2wZUerI`7*W35M<-13NI4&V zACrPS{3yZ5)!bGmGuu^yD-s%iZX{`3$FRU-q8bw!pyVqoWHA90-ENvzWOt>dT{8jf z*`JM?G{D#tDuMsx*Djt!H&bE-uhg;SbrB*NwB+xn!xO;V6n%Z$;lywCul;S^2ecyJ zjb1(=hnXQHvhQeXT-LRtSJQ(uzjQ+*Nh)twYXNE}#~mAnG^XKz4HZvvkkp@dkJ8*G!lgjNUJ4`Z|6_z7r`9{eGm zwGTewjJI+F7Z_hBqxXpOl{5kUpS_n(Xfi++7?E-aZ`=n`pW=TNsJd{?p_e>--R*Dh zi`UF05FD=Fl_!+DM&kYAN{Bs(cNDiIW`B0MVqbOq>@EZ)Y;l`FstkOsafI|#k>F)D zG~)V2A&lU&H?(m`Tj~~gZKH4hOw)aQefLDi$;axGH~)%0oyEV9zWIyj2;|E=39&x2 zpEtdpklc$ueTFpph$LTan6c2)pFf=k&%&HUDUse(Fq9&fq{WhQDa|7LZK(B-|25XyI)Q4hd@=jkIu9rPcPr# z;k`fJJhORR1zJcU|Awpbo2lHRoyq?8)|A}?h1@Va@%`3G*#Wj9te^yWT|%}Y3&0mF zcWF>7nY_pjr7wZBQg`{5in~Kop#^9Hx13I zbRBq1ZE%>#e#D%REIHio7mxTe96jy+n5m{Aajptc{AOt%!kBHvoXDug^+%HcRg;Xn zf5A*~MYnvBf}4=)wuUoK-@$fD{r;XGqk2>@#_d1w<`bXVr-J6bKGh{ahRR;V4^0mp zKnxQ(7M}~1t0R^KgY|8Idss2R7tBGtQ;X_S=&J!XU^p%)%HwooK*$d>@^cQfho|z=;7f`<|rxh964GBj6?|*EpXl zAoxUJZz$gj{Ob9l94ns4bL!8RuD`H_u~wXkr$e7@X8(5b*IR6d9vC#9UdGF%@04W`*}_j<@HwJHs0D~<9R#SUxhVQB`9Eg2^%@e=_gwG>4o;^ zZE-x4EW5cvA3Kog;OOZYQ39bM>s7YUY-ACuY#o_yRdCqiCn(jdDIOk3v^VsHt5QOL z91Yun+xyYm?fD9+REPDIUhTuL){*W5>*e3u)HY+1xyJp=`{5wubmwvfN#D9_=Jnd| zSa9+6$9Wx+{u3|NyqUV^Nl@~|rb+C#xTfq}~J%Qi=nRw7Y_pvBy(JQAC&w2r3FFdp5aQ$LH+c?exH@PbrFNpa$m5+a+6kUk$yN37T89 z&tbji^I{e9^&Z>24EeXQ(*F?)&WR4_H4S|@?pa!Nu$!=M8Q{G{5ID=hASlALd)`tb zjMM3nyKT?>8U7(UQT(|v%Rl#7@>giz<11PI?|lx9&i`QnG$ooc zrQtkMtedZYnF;c}(@&~V{p@8KGLEiLpS2tv0Q zKN9VgfLBKi3~ahyel-A`)pKsDW-3kk1MCq%0qDu}L)2*k(bsQtZoTbiek+&n@#XD7 zYM2(S_32Nlb;)0`Zsdl_12V9WMyqu2Da;yl*{(zu|HY6GxutY%MN3c2&VtP&nOXles7~VmoO=yYr3Bw_yRt? z1N@PUEGwtmMOS2*39>s10#EzupP0}Dp4TeN zJpY;K{Vh%w{sfL<;QS0<1MxV5q?>1PZ;XznVN~?u^kmPE0@~}!YlBQ=-#mu=_-!o# z5>%?dd3(a*00{$1i1$awSYylJ7J>xDZ0kc4uqldRCKwF^WwK;-;rEv>EwQ_0F#Er# z?{{S>E~pnBL~Ts##QtKlfw%ipI4!+pb9cix3(LWCy%7--1*M{|&{V&NRaqQG8Dbap zqnGPLS9}@~bGPy~2SSzHRE_ zxKDoe;@pKy(i>}j*{D+-|6EcOG~HYi$S5y_26;z~4k#{vvD!IsqbFY=&ob0>v# z$feacJhhQtKDb5mso*T^fpXfWxF2% zIdIZ#QibnueBmeVE2nOatTdOtnwkAExtg1qtMX1IwBgRaI;mNKd!IKP;g}~z6Ze{5s$0VL|t{*^nFm(eySc)92s%V=YX7oG3Wi>$C&e zX{a-L>MRwp97a_GGfa&B5*S`_$|tuk$gc0Ou4lvW>6h4To41|yY5kqj>aA^7FFPLj z2TR1Tfzh;P0aSHu0iW`o?)Sd+ByHx8;y&Jj^0K0_yiPlW16T)>H=5$U=^+hcjMMsB#fQ&VVyNXVaPB@|iVAr>^$by&3e+^B&3 zYz%HJjHp8F1j;*(F9i*zYj>fw#K(nXky@{ZK>9NPvHMKtjn!_2GYFTG=IYwFjz#q8 zM|EM^Txs8mf18u%PSk}C9>tJrj%Kc!uA1iHm|Kdi8(s6zQ0uGIcI(>!%=3>Qw$!!8 zX+e=R_X7l?^^fGJiV8bu>SfMpW(cEo6_SmX zM?$_|J|e*bdu(M5kc748gDo$7ii}QB~t|=u9*i|=KJ3rVfJ?`j4lb{i~ zCJeT6UId0Ko!{Z;%-#jWoJ5OE8BvlF;T|tkUFLJoPxU(cZCX2ZmV8nQ7RILn8c7E; z*1RXHX`$&J&auX(qjz3~;<<29=q6$UmJW(7J)P%{s&uLk@8fo;!cg@`1D!VR)snH~ zmI9T$o+d56P2^S%h9Q^G2{vI7Xnfz;<>!9QC*dYHmaE8oFeIKNe~(A@6WfbF+YKxR z__sngDDZV2;b9w;d&2yumlWVEy5|<+N~iLYCdMg4Cw>1q7r_rDd39e%E8CLQn#Rpy zI)=-YMm5U{%ThMLrQ*e5#<{J?p=o%>b$j&#IZ1Q~3mBRp>&+0+5lS@5+>8=*a4b&+ z)EMyH>9g48cq1}!Q%IC2WxRe$J{|B>6Q8eWpg$fA(piTRC47Grc0e9?tRr&EvDt|% z#wgx3Hd>I=!D6jd{RjdI9;iiL-aV=Kv!nPTES%~q z3;31EuQ;Xjpk=ar9Y-a+{2f&0usWfwlE|V6e_Ak$pta* z-6&^C@(0PHqN3zwWo3;eguP!*PEPXjX0NSSV@cV zkx@`kfYmk)4HZ`-P;3eQWWS@VuCFgY!hA`Q=bjy2{@-5oJw*WKXGZDxe-4`EA4Y$m zprBx5izj_a@k$H>www@P!;lvd@sp*lsj4bE5*oN+;^E<8VTmObdN-T;bt-R*H18&R zMu&p$8GnI4M5NONu5d??fJ!cC3opUl^Jg0K3vI(wqUU6wBY$K>*2U#!D9Y~v)6vnf zyStl?@0G|CcHl}Hs;2udpHc6yg^P~(r2F~`-K@rmAN;O#g1!Q+xspEUfzTiUDTpg1y zf&;(7B6$K|jV1Rvq(an{xY`K7B>jG5Zl8OE7*I&Ti*PL`7R!vf;P_HO)Dh3hWWSyv zM1+DL&K#?AsDxLe9sMkl;mxY$O9f#^6ig9!vK+Sj>j=*fMq$?+Zsv{H&R;*a9td9g z!wFsEb^ngZ_qvOCBl5C{6{kJG6f%Go7rjriqQX_0WZW)ev&wILdM%)?&amn+Ae4X) zZmX$O?&LVVgxk`-0P~r;Ip$PJmQGDvPEPEvTDsXH5eQwHrH#)CGIh9{LKe0lm9z1| zJduP==E;_1*nnF@(s5eTmS#FnaBNeZ>*Q{PZKyh%Di0s(&kV13L*OL!0*>BteK@i}!{yNF z__;#E+7i;iSlT|V+iuFZD|+cUp3!m+GBU0GHgLV{?rVB93wFK87`Yscf5*t=*-kmj zNAYg0Lndpnkcs`9b=jW7Q}kdQMLU8xi65S?duR{_rVcU`j^EPm5N-r)`FDd0?lz6D zS|<)^Wry57YibJ`edGPA@?*+18m=T_zNMc;aglJR=3*8SF9A1j{;l~E{ZZM&zU)r} zQJ|i{>_!08SBEUF0&ulA?tuPqNN$Z@{uBfzdb`bK^{nT1Bol-n^n+-v=&>}A?y11E zd>-Uv7<7BnmEkR{E1eSif)P|%bH!6rGoLlyyk@<-Jb>T$#faY7Yy*nlK)ztsm}Q}#gsh0L-n3$mzyeUVnI z$zJ4>V2ID%tYphkYExKYV&(`sruB`MCR*(tCt2F7sytgX-|6bY)&t>H@4h=mSg3!t z(zQ;Tek#ZQ*tqO7H@U}FZnoRfaNI`C0ctngDy3d&s&Dnz>LYb8aJ<`#Wu?4Z7=t;q z&1`QS{3TKjXG(nD@e+1ER!*1Xf|)c0ee%=J-^(1k`4qY&S;NmIYR1Li+;5~#%$!X> zHB8Cf-2|=tehUrU)<`(A)9Qbm`P=|I{YR1+K4&LBybRRN@ff)Ef?m|JUcj!d=;~;% zQ*G|qsHkicB};d2!Fw#MneQq}(6i;ppx+qpckxsQ} zrlOwrn-jTAg3eKBQB?hvBM;CC__q<)E6^=0H|@RW^B{SfuZ#&VL~lJ)HzR)OS zO5#0&Ms&HHprcRU20~4%C39!Rs0W8ltqru<+VJVJG`px;5Dhk6FYr6L;|*Nh?%lDqoMlILwcKKq^F z^viAbS&4-MSQzIw^UzbK9N{ncMgnJn;1W=^DE1w43B3^1Sw49DgiP7s?>FL8Jk)Ud z;6%5>Qz1Sz73Guwkl)O%=1@mTqnX>B<*IMq42ms#LY59bs(zeLXDqII!NC61^$n}t z**cSM{JeWRN7(@7Wn=!mor(nzvr~YOl+~~3wcX+4wJSDu;vS8GVdf4J5ly*im2mM= zfBvIrgPC-!?}p#S`}l>0hD_`w$N<@rt=CrC2)}?_VqC@*yUNUDD8*>EiiIsX;29+Pa1M@$@r1sX8^? zV#;vXm!LN_u!*&sU&2tl+y`p8^U`eXTh(8!CW;oyEAQ?6v&HO{248!=1qApwiv>3l zps3bNg+I`fk;lIXE*dW!%ywNp;xA0PtUp16QbpY(-@ zJemhbQ~o@5^4yJfl!q21!fL5|Z`zfB;{()JtE9(%*>@h*mlOZH1U{KX4` ztqm*I3GNtn$j+(`;%f&@^;t^z3!b7bj#;PXmVk#vTE_ z=j<&G^6V4M!?EPUdj_I&{jQIONv4YG&#(~Jf>o0dXo`ok+I3kx7`i;SpY%%^FPv9< z;hg+r!8vC4`x9abm&aj-S=IbIVar-{VjP-N?7oA4_WviIqh@E#b7c@=kARHy>mPJ2 z_)021($!3*(Xf9iw5!gsDkIxfi{z9}X~tke3&oHu_IuxV2e@HC8D{}NH8@B*{*c+(*cK$pRajBf3r_j--bHgAVeveeQE5t(?NGZt30G z7^SF0i?OBmq4n9ef$G|?{f=lyo@2hb{L$L~6W z{wZeGrKW>Zl9Y>PJtW}YAJ{Cp934V1atifjRt7`hD+CYFWyc+2dsH0{iif97sMj}* zneFZ%b>pOxC$4rmCtKq7O#u&w)wa+IC!&YX5&$Y@qe)Cds?=jB^6UjG>rnwC z3gJ>QUdQJD#*~V>4wz3%Pp530df?_Gh*VDktA033}KwBWR|Zw#!8SkI@8ypyqcv`_fX2s)yTDI@26V%Kw zm!T6^pTYx4>fM(&u1V{h3|=cZA=sV2geKq>k<((KmlYq2$oh7(0vFIdX#gQmPgP7C zVn5*NAw&o)ScQyCfkdut?Togr;jwY6sI0qmGzjEd`DpyS-U>Eo z?AtFczx{ST));aX9uczko?(ES>ETft;0R1RmOE}} z0iO8>uKETNlk1j>vmCK9Z9U{@;8j5@kJ80_T^-q1R%_Wuil2XoW8OZm_Z{k9FH=g&N6v0&@tGAt5Iv z^SioRI*3_I6(2CVDPusTl^C!0yg)};J`}ZOfo8@0Ha~A&75GM$WxjkDt?C3nGA@yl6|QOC*zA=oc31QU z$Ye_wJpn~5)3Nb?o8q`0A(Co&^GF?uYCFw+8S=Ys0!%gsZnV0f3FdsuQF)fS2&DhM zUbN9*7#`lA;=5FU^wvdzEpWWARD!XO5uCjw+u_Nd_w%na9uXK2EVIH!^|BVOLMEg1 zBrF!SxE5*&goc%ut>?xODs6MJcG0hDsTxRf7~6EdEgP1s!HQ(6vpxnTQYR#;UQ0c_18=ROh!H{O zIDbw~#0E^Je7`QoajKoRh>FUrZ?VtX^f}UIV|S%C4l+9ifA^cZT0DHg;mu7;TGR2G zJGpLCS6iKq#RZ(%F9x(PM5*in(elkBn%U8C$_l}6Iuuf>55=>1_&7c0^U=l7E{Sbx$68;u9xH*ht4 zf2{TCG1^gMjgf<+1X8i;EcM`C5p`Qo1^Z}>6}3~1a_1s-+*2CpJevZg?XAsZu@YvQ z`Q~Er6X6sj!rAx~;2H_yjV$LUS}Pq8oceNpy4^x({I^>WR^HAfaLvwP{+ge#upp1Y zkDNhlxOk5%k=vJe9s0J)UZX>SEJR*X z(w)-CgPS9cMg(bZW@J;SoPmlqaB>1+Vr?>=_Gkp5_W8-JSfvF+;6c=K_GibvQ&~;E zpG}FH)i^8}$y=EQ0sYI~DN#88w>;EN(R5I8AcU7~D)O_AiYt9hmCT z8MlrlnH8PQNE6p5A)PoyeOgn|Dp6Ttw1`vwgKP8-NpTz3n2Omq!Wfpe--yll=yKw` zaAR$*Ao?4ine#!p8kKpuV>R${OZ{z5krUVzQ{uyZ}g zq~Bg2dn?Lm)U=MnAMs(#n|6Yg!EDG~qq>G0n%|r$fC^&R4>{?m@r&ieuXvT#@}uM4C|aCX1Gs<0Myk5Q zR*;o;8At@+zHnN5JUbJgD{rAym)=U;WDcY~wd{&Gk>DDT)YS$7m&mW=p=I2gZ?UN0Ep|wAP=x`RzZ!4U&Qf#{IfB(UljLn#n%$6BUnWw`*UT1-wdQsx8QiFP z#Uib;51T{&&EH2u_MRIFd5(pbZm3{4rT zhmm5m>YAtCFqSubNX-EUh@%aG*5~MWtwe&_PZr1U`wj^`>*6(2RO*}v#bc5a)pF$H zlCN~-`YWft!o)klG|YIV4KPBi9&(g7Yr{A?w`|qunWYT7-<@8-2mviJobuc6OD~_sCKOVsGfP+nP`YE|74`N%m=^Y)7`dA9RvVUdX{KElGnxX*p$TUxKs(XTHb zy4(1vgwOJ;1D~Gsd^k0-!teDo@jv^2H`Pd{hx=itpL3}}g-=a&y%-Z7L=|?u?fH@t z-92F;k#}8nGn*H+8K<7rmlnAoi{vI=+PHJS=5=JTY*8-2yzZ%~{Bckh9+f)?NN;r) zOaH>@wBdOg0dO*y3FMmWOf|b12TQ^PeTkE_ho4e5WiiGANI;R~{q3*4&#Zv(aFgPs zAa{Xa@Gzw57~XdS+h@P&S^v~-US71tj$P5Ct?-Vfo-UQlONxJt3C(fZ6t0SV zxB>YMf(o6<~p)GXFv z6h2Zh_2FkEpMc<>8YYtoe4x`W=1#0Zjc`3WtM>6-;Yxfq67t8pTXaS`Y>@%5u=#oL zwK9)Oh@kCPUnFhz?8DN47&6&J?eM?8i3-|(a)I|S4`WCS_SdibKo-2fG)1Ztm8 zb8~ZvB=E3{VK`1E{+kAFM;0PgPn$K|x#FBUeZ;rbscXbi82t z(UFxzKU2p?R$kuww=YCrQmCf;P3OIbn?hda`)+t^8}wSiPYa_}9QW!C7)ZnT{&s;l zWbFG1Qq)t&>+AlX`T44g6fpbfDto~remOXLzXW_TG{^C*AF)TgpnbO^d1x;z6Ro!5 zHF`RG;ggBHzMZQMvrtyUTc2(HVHjBil;6otJ1l)Jh~-q(KR@Z}R6>MYy zcwCb4FzW-D3dSV$=Z43G1JYvCs@-G`f>$1DF!c~CD|RE{ILBWF50c9ToN~kL6OX66 zjR=kl5l_mrnUVW%KAdPd7nn$*SO}7@S~>zxnT^c#AQ#v$3i5=LOl|!AJJkDN&Bx9X zJ2T~QL%<`9i18SO%!K7u^m0g0K>R)xk}>g1VRNb6_oyp!zU`<%=8LQysB-28)mLeb z(m#n59(bwje0SU6_*TW`d)DIR#|*3U6C3E3D-&7UQQ==uy&47$kN3a6w&0)o+TF=3 zW4h$h+AxJ}#pxRma@*ef8^$&1i)rXTsqSpd~DOocj9fPlhqL`~j!w8^rE6 z20d~3BXbudWKT{m6Jz!9qBZfhX8$X^wPPi7p#n}H#7i%JaG5p-%wR+od(pX9ohSSR z#dmr$xb+Yd`kkMtT?anJKXYB&T&^t%+snOU>X!>~PPsT<8^i?6dFN;Z8VV2DRVMxp z>N5$gMZTq?KKXoUU4ya?;E&{NdnmYJe>>?ehz8#YkcqKYfW@Jjc5n+Awu`PH4-U?z zHjUx`LYK5n4bhQWPegBdXSkJuc~B&+f`1oXPOg z@dt0m&57f6lV5kv7R=S;BFy4C^8URG6~d(At4lk*`de-e%Trx2eZxVrT3?P=Ydo$M z{I?(s6O#q&Z(^G@;ema!9^9kx&--#v%2l;v8Mpg6VTMV`_`Ja{dE24G9_P7!PfmQ} ze2t#zmPvBT6`VsKmzm5a(bo~y;gVzyqBX6L=qE-->L{ZsN(kPOtiv3qg~cRH55o*}RyWOHs+su9X&IqBWLu<7c^NokQfO&Gn^? zP8P^V)1_bNL>x1vz3GOSGmo}eKQLi7trUehD>L&%rPvK8eLeo{46f9CZ9@ou^SE*6 zrBBuGx-J&#^77!|)Pdgu8E1ikoVb@2Or0r81qu=o9k(Vc?b$}-gqaeTNez!qR~;c? zuv5C695QXh8dE{|NM{>tqkBhP#eAL|)vB!z+dRfevmbcK0dY`6g6HQ)?O!%!8LBZ; zi!MK*&hP-#yn*T3v?j~+_+ld@GsT{HB!)+Dt~9jdE_06<@Wr`3ZOA%-Z9(UvxA!%J z6WN`ncLxG(ZJ?r)#oXP`9dad^dKLN%dbx}Q@|puG*e+bUfAqo+VDl zgFj0Y;-`of>OLxe#PGwzG=c{t5MaQAKxIMi_Hc4qboaRI4@nt?tX!G#XH$_LTS_b7 zz0n>t6XI#mn%Si;NU0i8R%UG+ECh>RNNisBwJB^SIEjHdVQT5{jdmM;4Gk`cBq9M5 z+u1xF5e3*H1P)66!vDYv#@iv^ToLYb{cc2G9Ky{W=AG{E!SNz9e{$Yn0J=k%ltF)k zl_C*F68w9anDK5oUt+x7Pj-Jqvy_#51dzs!B@@WA#7G#e++rl|)q;jMH#cB= zX}e%oS660cChmL~akJGP>;R@C=!mxAyufIbWi~ z-L-)UrUz~!*`mjUc`{!Xt+7)B{;**o2IdW_imJD}+W9O-HpV4J=fs=T z?Zax=Q~Hic0YL5ERc0?Md`xf1^-5e-Ow7pkBLq|{I=V*RS@d`ZIuTpT09TE#I2fR5 z^3cEADJEy4pRbV5vgf<5J>M^D%r!DK<>Te`uF`UJtlj(yb3qP7VCg3np?31O=Egy& z!gsF9w@ZI+=I0%qNO!%83}-^PyVhn#5{sVdoEPqN1bK5l8l8Z^yIQbaIF?cQQ>$uV zh?pYiGw!pASy_khhA=GdI%WR|FV}nT$+6-xcg2ekm8o-5G;9Y5(dMd0Ki4teJdSd7 zJB7BLOoav2@L*>6XMbF{!R-I8jPRfaU`!#$tRT-5@IyDl8;(3e47*JHm9ae~vU}*; z7v?d0eU$<`QD8EfGP#-FLK319>Vozuk)Nf~b-w-?nlB<4ZqqWx*v}RtiY4atBuC}D zmzsW)w8soGfv}>(+sLjWt*=a2A-NPD2${IqdiMaU>U5k`2nQ9N280=)4{<3bi3P!8uKk&j@LpN&h&!O|1T*J8EvLx&3irW`s-$o zuAQxCL}fbw@F}|fYN?gs;R@R4jK=0Z3eo#|L#9W1xm@=!;;%w4cg3~J+r9csp1T2S zRq;P%A3P>L3B&H61UUnGoqUa>Wk~*0tDw@1E9<+YLRF9Kw0#=?T7p|gCjqjoq~~Kd zL@3_3AK9J{J3e=H&#){cVT1A-Z&Dxq8NU`kl3jl6=;Mlu4khfl0gti!?O$L>`Gby2 zns(E<=Ne=#JPW+k@dhAIA+~Im zQociP&ai^iKprzhvx48e9{WBZGoATd(R(FIT}UY&NE>-WP&wq<=CJ~om|+0o(_00( z;Rqf7VYB9Yt}2%Iy}SEx;h;p1rrvN;{XviezO%#<*_#L(YYp;ab+$60i6wW33J3CV zb|$EW268I>vq-JpU9}x`!vl@XMM7ZxFVOK&`1}_IKGBMeQY*)=IoJQttEN__rdyJC zPcbklEzwnrs^^#;HeH-aPPuYANSf3ZAvsyAv3>zGwn31NWAD(81iR7^$lHQfS6D1H ziefhCIJ6t=Y1SS}$TcSY12yKfYHo5dQyf0K=wO5TDtgDBEXpSD z)otyxp#I-fhoTHFXRABGq+!Tsv9OlwI%m=jf13v7b+F(eNP5Pk(ikrD&BS9A6~g1ILuVQ- z0Y-6}D*mTVlQT?eU;?RClQ!_vN~)3?>fc-jc$`23^U{)6z&bqAfnNkaif=fJRJ}9W zHV>B2e+hTr4{tJ;xHzYG@z|X#4OrCMd!@&F^H5WdawvFdEB01deF`Gl+$n$RtQPPK zLBma91ZH49`xm>0Or*vk;|C1~oj{j7JFVr)HAo0{jIn?2-C*bC%%`B-9K*}NqW1uY zZkLx_L1|8eaqM$}?Yz{yTwfGV-9&f7@ShDE50`(k3|M?q4|>VK+Uh*Gz$u+fcj5r7 z99D4#CvCi-B#A^}Qh2-nG4F$+22fE$Vev8zecI?sdUM$p&XE5|YW8mj>IJTxYw z-|D(V)hwilWXS8w`FV-F`LH#LQ}!+Cbb+@4+_61QlkA-45kb2e=kjq&QckO4N%Nsv z;t4yH<*e{?U<(5Draq~VY_Pfk!$1)mkjO^@%x!q}X-^ouvlzhZmh(GB=L}5RjJ!Na zzP`}KwP#M4PRD&{JV<1JE#t&S188&T3km5tW(B));K22E@V=a zO~tA8``j{)p8wjI%+7L1=3;q1)1HN)@@Yrh;egY^WnqM70XoKXHNVDN(c2?< zQ`U$D0R5TlBLthWZfXG-YRy$r+?orl#vsr|5D-2=GwsWAx%n1hQ9m=}205lMq}KCZ z?(N@2!MJsp4~x+ZC+6+A-``b7);v1cHXqq20Va0do$hUlqPZ+wjXT)74LkpITUr>_ z>GMc>gH-{`&rZ0VvB9kUz)0uz-4@|LWIyG;<|eS^?9*UvYl_S`v9($}hJL34^)Y>S zYjjh?w+`EmnI*$3M)A7j2oCsDt$Fw3_p5HN+2L)W#9N6fxv=E=ZAzq16ml##)&oYQ{y8+*F2@7Y}EqAEd^yQPz!3~*~tVj z;5ju`ZvPzN%b)zZRe4)F}2-_dywIaxV;$KkGfx&@eJGvawx+uh!PpSzC9E)n>x5 zX$b83eG22%1p-tbP{Mq+nJ#bC2e2}ejE!+gkOUGyWizJhw7zDgSvO-J3xgd=c*>Yc zl+r8(o-Q`-(>FJY^Ih__n$1SO+Z)8b=1zVYgyD*7QdfmwcstI?r~w&fWA(-(BKr2U ze`?Ja=5Fzm`#G_{>aySQqmGrjdm{=mb(WW>o1{Dyk~95eFarB#&ZKEcFepZ6jnErw)PL!U9z5sXM1}upo5Gv3IX=@;Uno&r&Zo?IHsYE=n#*2U_M5 zZ|h(Nv&v`1sJyP+%uy@bOEylUE92*yIs)p&xelAOXBvp>aS7gfN4X< zB9A>kObQJ)$S%r+Ong~_-WX^KKHmA84*k{MVB(u|cvRFAQWp%(;}*u;X&(eeer$ng zYI`ub%p+V}uyp%MCy-WTX+%$MY8VbuFzgwOY`a(hFsULEAO)W%rFanL$K;kM z;)=R*zs?b~#rQW(`%g)Fez7=R;`RRY?j!VumX=mp`gsHQuXaG9G+=cuRi4zuAeHQ; zs$y6YH9)W2AK}bYsvm&iTycGR&XLLY)1a`&Ne3>am16hc2u;`7+r;5vWY@~fHrc_N z)Hkt%SZ~VBXmZVj8;!tvAAwU(cZK(B-wMd1oj_H2&CqvH$@Yuln2(*8`^BK#{q39% zOOsUAA)BVq?aR)TX+JoQV56QFLmv4$;JJ>SiD?=)0G$yupVNAhzDl<*}sw~$@5J39lhI_wB=Z$G;b){8Too$f{ zug{YwE^gvrJdL`IBy48+AGUH1dni7>TMM`=*Rb()ttfF8I^2Pe9+MYu>toS`Y!91$ zNg1(uNI-$iz&-F6iq?=E&1wyjjA$M&oU8ML89>?5O|O94QZjvP{>RQ^N>cyFLa!~s zsL0~^oIj((Z-O{S(JrsvRcP<84RAosS2AWWUJDG%$9u~q(XtTZxl#>!nRl+fH8U@w zMS8J$L#yn(y2obPZ*oF}+L=15Z;O#uZ;>AD)0|qZ+gW^;L5z;E$RR^*>{9q63&bi+ z0x;)yKpLOGgM5+TR#>OlElE?;U07n@Pdhpu`^}zI4ofv>GuT7}KNxWqjd$hmJA0g* zI6ocQyMiw$v*c=tl6kw^wVaPQ-H`G2riWD8b@bE;g~ZDVI(vV-*J=qmCq~Ks&TBY1 z!T)fLowj7re3d4l8~FnB&6~;MMCI@#`B?RGAf)+QpsoJ)R8QrIFSz6!t5}(1CcZVQX z11H1ncmQj5neVhJ?ab^ftjj~YewSZuEqkgo%szL+x!TIXn$UU6*ZgZ$YXi&4@cQ&M zmrFQFp{%aPjBwg`LWGdF>A6#VUcFioip@u~wL@YQWINkGZ``ivd{0AO;^X7fnC{ZY zD*0ZXZx5F(x&BJH2hjVUqwQ5(~Jq%Tb|FY+=8WjJHZU+UMnj zX14YqTe*JODP3wYEm1x@p(7od=fpB?W6+@d$9H})(U&_qYsr!m(R1hmZsF$R<>3tR z86B63Z1JRm6`Wk0^yI_4aw$c-Qw4Yw1V5>jaDLv;9B94z*vr>5nfoi;k%j5|n% z=}4DdZnFi_;9+QWPr&VE&nC(1`i_76Wn^DBwDzjD;bJsooz}kLib`G{z6!m=iplJJ zYwNmm=MPco)Kj04I=x52+g+`fpSU0eq>4MRTGL&2BlFHMgN(AggSq+>8*%G3$NEPm zWQ&);S$Gj;p}9+zK-X`A&ZpxV>gXR$e>9Olr1hQX#o4)PfV0!j(bXZ1&CO9n90ybR zGVF=(17cXc9@z)s&>0U|i_glATl{DJ|8QLB8JSyzTj5`$J-K=Fef*bujM|_N{Dxs# zZfbyEPPHJ5pU?9;6Ze>_S6jXs)@t4Kp1ou+*~Mzwd7>PbZg`b!{iE65;NQ?Ad^UC^?~=gNL@m9WFn!f7eN}`riRGwFr`zhF@=}6S_SMCX zG9gyaI&0rp49gcb?ziPJsUk-j= zajB@%*Aq>Dd5u7Tc3Rdo6Y!v=ldnJ#8uYorHZIQ?lN2!*?R)TMw5q^=Z(<_mODXL% zfzd10-jY;g#1|G7CC!x%_LC|HSvG$};@*J%=88IhEjzwJPfNeE*IOMYBEbQ%)$i1E z62xsK3Il1^#bjha_V#XjZD2KRU~&Q&Qrg5}&5~)WtTJxU3Aa4iK6ZzNXK{j4voJgH z!?BXJRS>XV1k-P0s>8U?3;o~`n0`1dlv2Hz`j1?IQ)$RkuPAuabv9rQthmSm+mjQs zV-~l&W7QL2K1W z5tDd@Z*?QaQq4ytIYe4cpI|*5O=>+15Gg$?J?es!E6!F>(DC ztG1m_*j#xUQs?(cUXSn6I6;47R3>1-^*z_5jkC~1&g+S z6pO_^JHuIU6q@^i4C!`ZaNr)fHIGG6wwdSixyb3?sgD<_iL(U;ygUo6cLmjEQJ4kE zjJ+8x@;45yb?~+e#Rs&PN~4=GCi#HwOXNc`$!qD+wUrJOAjSrz<9aeb0+$!oon_~E zRg0+P`ef%m&XUMEk36y2xs2?P!}9tzCB{T36=d0+zTnKZ+WHp$W#&`ITuA_J&DWy} zoo2!9f{UYFu7(kK@=@=dS%+=Lw9%d2+ykAErPa+4iH`WYig-AF<`erVhn9EplrYjG z4NIWqv6p{>6tzioqcx=Rbv3``MuWqy`W9V0K!M zD>YVM60N7O-L$|LmnjCL83v;QRo+6i3+sQen6>tr=U*%aZ+G!6;HR8Ji^(VqiNVD@ zvLDMIAS;Y3Oy@Dsn}g4OeMj&j>{Q9Hhj8kTAA6niln`N7T0E5ZQ%|;-tS*2oUBd2y zX0d1B%*QUkoPjQ>%x6O2RO}I+U?ieCVt&uQbAMmC;I^uB{7lMrPHybf-Uh``Fl6 z49Q;UlRrF6%U;sj6!&ykHd)JM6fW)WEOo7i5>MmzVwEqdtm_Nwj5i}~$ z>N$LVL_AN@#v{viGP2D+k>zs3cqT2z!zT0<_@h(l4y%uP(OIy@=jVzTdY}ISD|5Am z-5vqqsHM?nNwdSmBYIB9wcUT?z`llej-(M|-Dh@M97cLAl!Q`^YK)3nQiw<+Oeg`* z&Y)o9v0`%pt&AnDK9RJz+a>YM(qt;jo<*kF(R85p%&f*_gzR5nt-{H9Mh(BGV`n$7 zPp2Jg(L4-H109rpB|v&rI$hw3edsQhc;aHUR%4oU62YOb0;jRC$@1C%8t^da`gJTb z21g7lrSfG#d-=5dkne&ih`l9p#3(R}zH?Y(7C9P!sRI7lFY;O-FIgS&=6 zaCZw9oWb1!1b26Lch}(V3_iHKJ3INmvRk|R?0(q&w6#-R)m7bN-Tkw3?z!iFRmcTm ze69Y?+0=Xm+vPD?fuUSQRCYXf?{zZqsVuJuZm^bt%5|m937ik|j4yD4i7c%FJ?CYV z>+Ya5(;%*Y)!M&KoQ9No!`ElRdX;=wI#?6?tQj~6NU{2+*Uch{nIg! z>A$ZV%YNh7tRC-TY;!XR@Azt*%zbnpMIA&;Ja^OWrWgfIQsr+vzYrNlU+FdClOkb? zqheYX%w6Fd=j`zE0wjYr2v*w4mu;u|=T*Il=7*QuUY7;%k+hZ<)aV;sr-giSIQP;4%$%~ot|%vV;f|( zJF0)HFS}e$U%RF!0kD)H%b9zbnUThszV9<_Ve1U%q*%wtT<0H2z29SB1+&)iAZnj0 zFNh*Q64};PGf6Q5=maJzCnl^)dH*7l!&9S#?v|?}S z22g#q@mE!0d@FD{bLZY9iqT3$OqV=RhMTq^wqXzm>J4PUz`*#&Xibqo7Kw(=r^~yW zn=vkUDeOizdpCG&2o{C(C@MROim9V?(u(3=ETn&p;z|=IwiHB0eB?}_OSNwaQvQxc z7izDG+^q$BysBmrDMPEk+;mvRuOJ&>!BeV^k*C$;H6aC+eL)@&jUti7^-pzoAjb0l zXr}^*(o`mfQvVz)&ZG8G0ajGy!xw3qs6xh_ZafhkEKfYrQ@rw#-i>fl^Jv9{j^9_f z6iz)!lN!aHpT>QnoyLlj-LzBN6u?mN8`2_M(U&oLBz}~lZm{U;7X^a3YGih&%MAem z0r%K!tgQC-_D|5SkP!;Fv>!DbvIf(V+-;sj0?^ECPIW!M=}r}B-?ysT9*L@0A!;X_ z+UMyhcFm3J*w~#N%N-;^RfoQiUP%~W;NQ?Nc3&%w3!-*^{G86V?ll#E^QX)w-S*1t zMo2NE*^0Kr4ZS1xJo0v*{5(OeH2)W6CZ~Bh$bE)T@%!nZD@`^xvSu2;^QPon+;l^$ zJg;rJg;A5d03kRtAOIFZkKALoc|Km@96;nVp4)=&lIp#c-af0Yw=c^%R--UnHj7Nj zOO6&9q(40n(8ZbQTAqcri4<$Pz*!cJ%XYRqsl>85?jK2OVg~<4x25(a-?Rq#`#Bef zHxZ+Z%w@Xw*RVz5vyW!RbjRTJru%qRuN}90?#qt$g3e^aPn?$<^rd|$Bw&Ku9K3>i zquX7`6ua**+acq}=T4^qk`2rI7>HoyQN zb9z#*eNnfyKE=^Peml*Qw^854aY}G^lg9|k)z!6K>C26bt@~+qcJ>IdfWN$cV06B2 ztnK@9Lo!#3H}MFw4?M@o%IjE_>OOn4Ocmq$p|-`_-k+5li7bS9VTa?9M<;kpT7?r| z-p`>#sAr}n<@|8-{e-dzQ)0q3IHhsI_J#e-*^5wQoFozu?~NZh7mr4@>4Knqhbkm( z6j7qA&WqvQSL*Zj%iG)02B}ZTK28k#i?>0(-`jE|&6GgmRyt${eV4#o$At=OjFJk;-sc>fArB zY#<=z9K}x%lhq5cN6G(66P;2CnMNuFmBE5FdiMoK4r)tG%G15Dneuj=d z1`9?hn{X_wE#@~k6~e{Ymmp&Iy+T_}yn5^t2m6-v(Sv zc3xL~wcoz$t!RBr968;NoL$l$!LvO#=lA_ZOuYX$lWxlf>LY@nxq4Gg3NdJLo`ahP z7m$sBEV#cuMh=qK*Q>ToE#YK5%P4|a- zx;-Z%ygi%l?^q7ybB5F6_Gm1onp|CuZ#kw!;v>n>F|CgU$KoT|z znn8i_;Hu_&5BT;SVvmrfM#@q$nd5N2p5~l|5qky`%-y*Cg!u5}v#tq-9w1zoi6DO zSGKZJz|l%7HnTb#%|ZUt_^SiRXmxcB(A=`%l}yp%a(e=4z9L_Mdur0^%7uh*iQ6uB zOl~f!D=?d3$BcYJZ(q91heNIUjfJD$ULj^|2qsozf4-@2%e=H2hv*fEVpRR4-iN=f z;Ff*nSTg6N;5Z+Yx^~fk%mJ88A2_fr6grb5Jc^LgnpzzX8cfa~ZQfTB_dlrvXa^f# zEj4m#I-F<$O4*9Dzf329pOJXtC|F!7ED^gK<1T!qCCqah z!%oDZSdnSq*r&g33nn^C(-D32m}ir?d=t=O!ZY<|GdmC29<=bdE2o3FQU8!1IZR1K zIniIb2i^Qp{+(KIc=#Q%@Tb6>TM>Z2IXi8mrg_`dWOp+fIG?)-PSQK?yss^rz51(y3Jlb<+qM+D$Dfq=Z(M${`+E=o?$}?hvl661c z%BQa_LW`|+0{CtNoZKHR?CsW&JNX(bS30k=v$BAV3u3~Q`+Lq&_i&4r&?n!a?s5TX zL0v!g77{Fhh|>Vc6i!GN-|zL(cqaQeJ3 z9=i~{5+MS)4<@qX6ozG^=}nEaf0 zSj~v2wLPknz`B)+ty}D^yN=l zO^a$`K6Z~M6?md}h<7qPwnXCo8=sJHP`}#zeYiZV!je*5$BHE4TY$upP^<)${6BJ} zN*cr-#@K)QERlf6eCu0^uCn7GdBR4=k2572x@A6(hg$3_7_{Ivk)sIH#NJ#L2={ec z@tfb+y}F*-b_g6Yl1BExMS^VDw7#_$?@5fQ=<;L14Up9&EuZ z@3m;RxvF^0-~W2`R&Z==%$vf#eY5{>@pk7NSo%d}+zyzB7Bo@2Dz!gFGgwc8d~gHh z)GzFWR=V%5O}W7!m(fbWzj$@lwGrbF;(K~s>Z2o<3^P3?t1^-pdw}?Y0ulZ|0?3}t zU%Wuz1IbAj619)kTxV(93DLb%6aeJx zJ&j77{J*y`hZ+7$ZCg=fqM$=orp1#-TdU@?8Aery1M$n zqN!C}v<}3g3S!QCWO?rwEw4n%(vl5+L2SGCV}l_@|3oR>?rdqc!Lf^CN164);c7KL ztx6tfBjq`1wA7V53ePltI{jKz97MHO;81A-lv~sIY7eU9yEiocf@Vcu;CP}{HWFPh zRhH>e=YIn4c5{7?oP2}VhL3|IfhXCC%iAQ6&;}hcj7sS@Zq@qch36~oA6&eMRp))M z#p5WOj3XxgXm*i_zoJ}y=x~3{=3d@&hdDOM=oO%zG|*($^x!Q!N)kD5uAn>~kT5tg znauCGSED9$)(MbY;!j;m@?$;XU)aa!hs01kv;A5*HJ5$0Pcokj)J5xR+<34nSreV(Rl8x+NkH>8!3^Q-?agwYA zY8@doBYF-F_-XzF0Ch#g4M7L#2gEEqEa-@CQ9HPTv^0@-S{>tq6Rt7Qtd_cP4N5HB z#;7m`(yi=Jd-fyB(T@vC(h`(>pI~+L`28Nt=!M~J1qKp6!}W}rxTtfYZ53W|uCNlLVUwgEGqx76^9HoyvsQNz;M`eB==qh>YKEmKwUBT?LE&Cb-!mN zrT!jO`RS_Zl%URKMqvetp85>_Yrn%){hjjlTTb5TmtH|iZ=Zopbz@z5a3+?{?^U{i`jrdzqv$Q4 z?jOde?sFvkcu(xOJ+6+buV3MPK3v{~9 zlBW>UhqZO=sc)nQcRsx;-Oh^eEfc;wEM)4S^d=zYOk$P;pT(C1{l(zM%t=d_KKKSR zvJre1B$&Id-(LFJ8<8U<<{oi2MKOfBI9=H57} zNaWP~PvLE{IvDpoR^#}hJmQat?WmeyUjbn+IC7Rkj6P1oF54YIEC^IXILbfHTVZZZ z%z)GgaMs4tZFhN-zj&~t^UTkl9B~{GFAQz-GXEQH#dRkxAG~_PEW80tNM#{uv;(`ZnwmO0p zjC5Nqb@wfZrcd0-!GKk6*NyY)zOKo)nYK#I?r4@fWO%Jfoz_<{^7i#2BC=}{rq&yK zA4nXwd$`N{*8F6(;XqC8*0f4MWwz|PkQkf)YpzlXCyr;eq0|KS8NUZocaEPqv35$k zZCHuKpudo60#r4&YKnlp*{Evo1W}Vsyf-l}SLE?YSMYwUvWn~r{Acr2-eFE#wNZW_ z?xj=N-+%CViqNP(F2?wYe11$b^AHKy2cPBBLpm|(2dp?HY0G0Ib--7+IButlBkMYX z=NC6KSr+Z{k=p$VXXo^;%Qt_V29=|&nj?+hWOo&%n6@V)MAY!dwXt*Jd$;9OH)GA) zN0&Xm6GG>gYwkv3r*m$?NjCl5d|GK&fNm%+t%WC38F7*kEo}=n^zIOP7gDx^opg6J z6_g9xMxJ{2cMq2UC~HE7da(M}MCf2?C6?)eyk$3gqa%j zKo>=b@C%h>^BOCSTW@|a2wR_!v-~Biebf>Tko#cF^_g>`;(2L7Am)BPm++yI=R zzs!EJG!BlC^h>s8e&E(zlhdgX^u=ApQAJ<^>)2v_i@_O}$jImtw5#*JeM_h_k6J0z z<%-J@EEc_GdJ8SfAelCJedT?O?^%z>D7GXMF2Z?@m_{wXkJGyNpwSouxR*#tg>}#T zR;9dg)=XWq8}V7M!KTnkzyr~A>odTWpl$+qn>#xlHKHBwxoD~|PWP?Rmrbq;S@`

I$3I})~xHe6&LhFw6k=r*FjpQ3hLq%wTs5YHE(pO=;Ni4g?n2c{)!cfXU+@H$xN z@;r&+6eB1_UEyLH?o|H>$qoG#g@2iQmB~|cPvC{#xRo}GWjh;D>X$HGH``+g>&p+P zqlFS>b@iY7`$;~302{!~H2OiSP|E%MEcgbAJEoJDmeVU_YdlX!dZAQ3Y?j``^VoiW zPoP#%UKp#hSaz4HqyMfmy-(wIPx1-DX-oNQ;ps}yjnMu?r}{)Pf1APa+XSEXdHMat zwDxnCMRj)u|n%kSxT+jN0X8AJEtm$x@>WNtZurYDgG9IK`o#tI= zU^I%jZ>ZyACt$@t*t73*xbk;ps6^mpAqmgH*qgbPV3+R#A`fxcpV-wo+uAa;NCn+~ z5JkvizCCc5e|@N~bKlK?;#b05PHUGOH@!RR8<+=l&jIK_Hu!F*aIx>RmF+F3O)cZ8 zB{P-4igQ)F`8ni!Mi2R;dvX1LkF8iFoGc>3 zf{bJYzz@%Aujs+WYX@f4gsb9>xtE2rkigcowjDjKHPZuBs+PJE<2+MX`iNP-wVq#`(q7~HKGSqh6H8M8lj{_7mWx-AdzVy2la~E3r zba6X6? z@yrZxfUbT#zG@3(QNY>2UTqG!% z8sw5x)qF|DcQCzO)V;JeSb58&TXfdD5tsH&#xWsXs7}Am5=GnTbsGiz$|QUIds~j= z6JCqpQlDvqPZlr0JutsPxoVb1F`GNghSSlXALn^P0`{cHs$|vJ@s6M^4*frLTZi8OE z1@41-R-D&ve3m?n7XvuzIx4A#ZcI*{t+SRe0euPC`xVv|QU23!!|xB1PsxAc@&AVw z;My=vp-ZiyQATLpbEykCtZHDvfuOE>w}jWyEkqCyd@QU+)ge)c{zAmwIt=`qy#UpoUO=@P}B79){mx!CyyF8;UQ$(HWDxLjqb4kJ|+#M@IqNn=$2moaQ{98W3lR|_i!Xrs# zYHQB>>&25ecfS~zx2KZL5)uNcV1v>~!MW410<>B1*Iq63Vo?|0?cLon7~FPa1;d5+ z#?#Rd9gt&d?$J$TPAIObSjlS)6!idK(921Bx576+DgH4-u7yN^uQp24xbAAcd7MH4 z>+oK)?1UkpdZBk-C`~^ZtTU`2fq?cCr)ijCB|ne-HjJF2`)z^w?tTsxN|myDhi$@z z0I=f4*y|w|y3if`4I&UNs?fsj9OGqtbG#MOriPMPOJ_DH2u|CwN@|d0s1nRa21aQUqXzI3GFz;)r0n#0gzkNa`ZlO#e zo}!q&nlRUH!t7z4b$*m71K>i9JCr5Rqy1#|>xe}8u=yL`aBk>w_F`=LSLN&Ef+XOK zcZOGYV%m6a*C@Q>!wnSwN4|++sf04)$GvG?>rG6Kcc}vPwFlXw{LBFQBII-^Wwrs= z?wM(Ut5xrT0hlLWTUXIZ_2B}KF@3~rn|YIUSX0k4Eex_$#PL=|{rB zPkt9~GXXm|lh=NvL%Uc1llmb~8YL$uKRr1)$mCSYh7}1856@4g_(KF?g_JwoZ_~Jd zfq{XY?za%i=8xwjwhdAoxL;efFRK#(%*<{dZ#OSL^?q zRMdk5P}~<4#tAkVA(s`E4^WG8u=2ec^M|gGiz!0He)CGI(zrJVb`5 zX`_>MrhspM);xMrpin~sVk!07IM^>zuY#ImCrwuZ_j>Z2dR;07?F5v{l}1Mrc4sWIP z#H!3RmokrdtqR48GU%d1@N~tNaRo@t{b$QjtwB@eClu!IOK%dUt0A^YRpUBQ`!H#RM7q4fmnkjHm_9lRtrlLCAv%qiQn@75g{lh&khMFzuxEJg)}UL z5N4J?LGTtK=PZ>Pu_6{~l$mMu-dC}sn+qEoRz6LjIkbKP8MU(hUVh|-#*etww{+Pk z?Yip?vkf>AIPfm9#;1GXlxg7^%WrH$(=?~#Ok%=51m-U}+w*jxSBqkek>uVIZDwX*Q?_5OtsBRd+b!?PWkX7#1r+pW zsF7$izr;(BnSbuY)IFwj%a+d}1OJ8&lS~ZWVFYAP(*VJ%0>Fxfd+4+)aX{=jvBlY= zhvzd#Ct@ogS;%ACy$WiuigUVbn@mP(M)6)c^k{{@(#0_ zN8-Y=xUS-p?@9vi`E{|5aM01{b6=E+xBLF3+5Q>EJyFH-qEpTLU(jTxJiqM?n{yN- zo=XIQ<54zU2U^Z_0Hj506VFRtENIiDDVq~;f_5*3nt^ni`V2haT*!mx1Yxn=#x(1) z(#tYok<(%`dD?sBc!5CRm$$#-@zXqAOvNrWvmUi&^0yDO{EeA|R5PQi+}{5sGvS5| zcnHkkbfhmC->MOe?DZlPnysO|L5Ds0(L)+o+Wmnt(?`h2O7!D!WwxP`g}HUdCIVpK zCwdVwq>PfYQI-%&1?{h6ua^;`!BppE0L)Lzp`}GtUOe|Ilx`SlnC1DUHD}}5NYfiW zef;x;Yg!Rn84_QaA7e(xZdPB`{yQh2BloQI-#Gyv_upz02{VIb?!N1TBmqFR#OeI4 zuVRI$e5U1U`ayeW#@0{(sefQTXb5^Mby*+RdhJHMwtiqMrxorFdn>dAC{(u6zo$*uQxBw>}qrl z6Nm)C`fwYXey!zpiLOk#Ixh^06|bGKg5oz{U+9%Ma?8f(n#^Lg<9EdZC(m>ytn2W7 zJ6tfd{u`=?(KE$k`!+myVrTG|_0s`9ca=Yhk?2$G?yGpXORf54fFugTKA%x zNZVMwT-aKWaZO+(V)Lo;Zl<4_+>~fT^QzbzGn+c;S*{GH6!7f6WjJ-&pJTC3nOfs> zPrc`@c_BF+eP{!@r#=VhdW{ab99h2CVqBGUPO<5ZhD}$OZpI980Vt?URDhYrdSz0s zUpN}4ysNz3uQvW7{mLA@V_YrvbYw79F8D0AYuO}7jQjC+)~f969PinFGWgy`RN7EU zJRu%Hrm3C+u{0IgbE(-{dw#)oWPaRqJC!DToL+@VqR{okGisy$Y|;9|O=!b#d{zP& zA$ZQads)y$UC?!J;*DV(&hq_aDDn;F+>u?wr(|H*h`N;+$j<%HwT3uOk4wTw+b z^yWNXmJ0ZQ!R1ZzY`K=(B=AOoAfMHGQ;14}C6~0?=4HZ~Ibtj@ODMKNhDwU`5aaHB zWxma8&1FFK-g>>*%WZctGsvQDT{qPnog_-rt@QQ+ji5CJsj3fnS5v&d;xpq{;Y$T_ z{_BVQ;=pEi=9gtUpA=b-efnCGYT%#P#k@ibhu_8};KC%PeKMB9mhprn=yArH4Q;!3 zlA={98-9=y@+Y*Ugx2?eB4d`}*eqKAp#N-vl;W{GdAl&dmDH_mJd(bApFDGs%o3H3m=A}@k55hxrTg_`j4ea zr8@`OXFiZTKSoCM%NHsKzC&<&Gx~=Vk!LNF`tcE5ORdo-6*G3Dv5pXrq5iLhl1l9_ z=QF4IJzfIm6nKLYx+XFXcQQX_3uO^qFTM#1LCUH?Ub@U|&r)660iK*6u1(wPMdlDY zrJm=4R4B37RCr{FQ5T((B|ZU&v2J1Ri0-oLy)&OF6N00hQ@=hd-1F|CZ_2(z>u0g! zKAJXJhyz+z2r7tbj5h+1L>TpgrBh98){}d43Qi?BEBQ{cGJ1VFsg!AzN1E!0mfgS? zM@Zq#{G1SjE%)e7xSw=A;NRClaLw>ef)=^1m^QofZvJ2e6bHb@=j?sRGA=*XTCuSX z+2f8T+W!{I*yH``_H_NZYIw4en6paFYMZ6i{>e`|NWsJR)t0)- zr>C50Nw(D1=`?eL{PF&O**&H^pffbG54pmI_H#nyZ3uYGNZcwoc??;04M2PUEiYu0 z&Juivtqq#rAK(F!;*@ZIDk`WY83&-~iyAt=);Q&2E&&msMy?i*jL>F{%<}OO0zdT~?pqX1NdHKN*Z$i%gzmCr zZV1{}S2Cr=>-Cy!Klf}EGB`jffD3wB9D1Ifo@x;|GAd*{$82IJCq_p{7Zw_&66heY z&j8G9Nc``Kmj*dUXI$?LCMQ#{A9_WUD|3!MoY8!>r*40+s@ zWWz1M)3EZ8gqKXofu^~-gx)!VdHt+O*G`wacF-Tn@H z>g{v>8C)KItw4yXI%8DUe!lNpS;2{1p1Ye$v~vNX+rQ174t<c|v1xZre_5}rrYzz!SJ%YcCV;Gldd8q` zr8^k(dKIx8e3tvhFAIVg*J4v6mketYv{lK2psvNEQh1n^RQ|GC9arXonm?@!T8uWg zv@wzh9#1%okHJlZ*T6ZQ1_>%$Ng%tVwnnTQcNyJO^Zo}kgxXJ3RI_dzu{VZ#YYujV z+C7!_#|e1g5ts0pw3(dDQ};`orB>>(6wn%l+XYS?11c$u!X?wm+X2SO##uvQ!&1_!}w3>;JhbGT0fv-$Ssd~5;(8k#Vj`PIZO$bCz|XwCSH$Hmu4+Ny~3A1SK4DH&BpmIlIz;3=4d>UrX-2WgF zJ-Yj^wR)n54u6qgN|F#4UtU_87O>72{^W;>hbPG*iNFUrRRlq0T)_3uNJw6{NAsXF z#K+9xT?jzagW$IRf$tQ>&LRHOSHI1iAt@86x&Mhy|Np!HZ{3MFZW1Sm!uWRS`JYLW zr@tUC)$u}wHtH)W1i5vJkPyX*i;I7lMu8|ub_m2k|1A1ZGaw!9zua9pfd7dY_EQWMv~FBIs319Rm)mjX+3#4^IlCre4wN14D3ySRLz$`fBEWJ8Lv_{FNA!}Y-60f{sm^eQ&zLpcz1uPn|et8 zhY|#mf3y!TfJAp(U~Mc{t78&W6H9WYr|%oj7nfUYhg@b?dLdzhtC3kSvyG`Rv%*9j{0$1Q;$maHGc$CdcM}06G{?@#i5b=ad=0NL{Gw#E;KGh14KnNjuBi=S{Y-0@xR8OVRFNFQ?(VqFhE#I>u%B&Ij;va zRE>q{bqOUJOd;fB=C6OW)nrOfj@{O9YyyPMG!K77 z6})OwqMUM>oPGxmjr|$xkU~ydUNg-q2SrA7Egsb|3sEOQSUIIRlgMG0^L0&4RbG|J zen}=~D)bT+I;wm_zwF6tHH3au{Vp};OdSpVe(=p#9l1bZLFJI=%lG+(YUDXN{iW-<-?)I^-1Bq~+|Fu~K z!l_yc?@Sh(()-A=AZOkNf_$Po7Dymw@BD3DI;*vcm%S)+xJYhrT;GKEPzv(=Ytxfp z0FZt~JXoSi*Pv9QRx(GIAYQRx#_lIh4l`4wRtQp};uk`@D_33#>~~1-B-|ynF!?;N zm=^}ZNAdAqbO7$=nU0)&der4~7rxg|zDQ)j9(kxB>-qL=d5LiG%-d^!p!VDIXT721 zP?kGzWlKbmF88s^z|mC8@wbWANW`{I17srxi}TgMSL8GEjxP5LyT%i#{k+K0pgU8U zxK6~DET=hzMhk);;L7&L5>l(|=bk)+kh<`oi#zBfvUbPgf z(q(Q(JJZTc<)gEwrvJ(643=N0#>bMmHoK_s>OjMZx?vNTHxN6iI zVj+K&rgJ*ImrJ;T5=%zj67* z%@u6-e46Oz=@#!AyJ3m*((x(`!cVM9h{_lTn<UZNc6T5fPZ$x{ z;SH2!YPRBYagz|5qvhr{F`g2vxGYM1`=IJ>%EWlUbile(eOvGM9zmct*{=q+ygm5;jm>a>UU7_J0?0g-gyBbiegJ&%(#0yR&TC*X1&) z?G|NPzoFUBw~V?X{kmh6&*8b~8#ta}n7KBdH};5OkS8JIT&XO-;#~{*3#F1HP7dy( z_6Wde&g8x*?Qtt=CIQa6*Z%&uiC#{VR+=>ZaAIbNQz{9wY4L@jU9M;jGrApM7JF(S zUpx*Pa>V`nDHo-bw(S@HB1LrvL~5jN7@Z+-9iL2;4gY(6lBpZ{H>NAAi^IF3hFO0A zZfHw*YdDkwqTf~qo#3AYR@8#385jVK(p(kR$xUt?j9P$Y65{7*Zt+1Wwk*fj#cvmA zyA5347p@Q7yiu$;3tV71`kU7+%LKlM(o0=Ar?sQkOK&e8> zobAf4#;}3QIykbksHiAOuPpy}u}(#zNSlkuD}%N_%H4M2t@Q!%ryk^QK36|2n@L%uA*Sz;sHXZgI2%A6gA98Lx~)zL$qi z&q^;$tfIjVBy*Azy=x|@3?H4eKu83q5uKXnjhY_Cqinp6lsy)sWse^!=QfPzLRKyM zKPd+mjs6&@Zo?`b6-=o2q=BG*`h^xu9*wbp0^#c%9i#Z0vTB;bSq9jHsBTstW?eH` z%CyFL=`CCW!$E%{cJn|Y{fIU_e{F>W^%jCd-Bqs4ixkb4%iP0xQj`2IgGc7NC@n#oU6t z$*@&#g0H~^tE2krv%A|M|9?>)R(nwotXE8i~ z0N{g{q?m{bm_CkPI}3^Dcy~#UiEI4jjW5@MgP^O+Yky5|rNQQ9ppy0(el>ZiSz^?; znw1>dn`8{Pu6&l|WhbQxhsx}X5dnXNDgTDXHupgqQBw(bG}St#ZAZWrlKN5w9J47y z$au3=EkYaZt>Sy_!#x&c_&J+d^v-Bg)Y+zh#cRD1y};Nm*C`oqQug-yQ_T6?A;>4# zgS-mfg`@=b`&`AdT@+@>q^1(X`)n}nIKNgA*gkbv*r`gh@mRlu8d6wQL&&bEYHMiY zfRfS2X4>OC4O{u`X)Sp2fI<3Ly;tc)UOI^hWgg5|gJLxNc*dBQ0vT9iQI^()ckPuY zIZy9S!Lw5Z24y&!a=GFXU_Ju-g*sV2Yw=%ts)UOiU8fpJ%Xy$PVz#qDl>&u$pt9S~ zAfj)j^Nh#?i&I(dPVK#I&OEeS?qw&O@8H9RR6%b6v#rMzI3QUGQp$IC|8OpUJ$N{; zfyMtS6k20oUH&EM1BY(?^j%c7Sjdg!xc-3kHIvN{+W@KMxR^5!IayTn)H>=_&7f@F zbg>E@5SSIfRmH3$RERbQ10Normbl|4M}aQjb)`~B9XEVqtW=`$MY75S)+!U^ZP@GH z%XNzOich6TrzF*u+>l;tW+qTI)80rRWBftW9=iL{YgcuLpb!m}DWq7K2v zGA+WStmK{lZKfx94^oolE3fm3Mwwa#tjJK~%kF5iz_W8fe!j6DBzWI&fArHrOG(}G zvn$0$B0d6~G+JqBUHJD*gyup~J7On_DVQ^JTj_{arM}{rzKzto_;Va+Q57??Kb?1E z9Nn@UhU{PWHz|hA6aa6t8=3e@$Q%@3<GE9z+KPNi^=>7Q(?r zoEJ|U3qhY3sFkdDcqFB#m#fe%SZg@h`fT_;mfeJ5ZM*4xi3#pUFOey&s?sk{{w5;Iu_cuL}SIu zVpEB5S&}W$Ru~D*BAAuV!p@fwWu@L#vT9u_b=QP=ZK9oygew3tRj_>fmeScNo`)xB zbt3$Zh942Q%^jmbfhOID9-_g39U?|JSiq$>ExNCddw3=kK|h(tkMh+x(gq_t0ajSh zbPKR?m`_g@u=B06N~<6&D$3`aO0eK{^2>ShmIT{&D!^Z@Vf|cbFp(4#;Io~gwg05Ql(*=P4!II+x z1A7x0e4t8Qk8}2P(F(B;bjXJ}IXQXMkt}VxE{4W0SC|3>gP*U6o((Ou5*-7Z{4cy|R6tTfxR?6vk<-}uDZk#E#r<36T%3;+PGlA@dz0HD%>|9r7g!B6Nd z0@1<$(CuHTy#j#R_$N1(7!MzN$s2fSyV-g9T6)?7270tUww_Q&H&oLB|}7v%(j$^b%s%DWzZ(#yJP$FeF=C z>ao_V(B8;4-ETuK(v6Kyx!ygd4a1j_J)PzbN(rotxL@!*(I1Gf$rW_A6CtK9(xMB) z7i+09hA-}(7AKbF-LIqpv}j$N=GQy(EzoD#qD$+Zu|7xmGT1qlQPI)NYMH;r$9XMf zhBF&>839%<_Dql2f8$(aGT8Y^xw1&EPKVm1LoDDjwIc zd1hK#1@I|xrQi;3d^gf2WqcL4*V5MD8aWqS%i``Buwd`0LS5uz|8=#qU?{DC>fSjk z;PFtNQw3ZPs{Ukcao(uOZ$9k0^CY%TLtOBsQ5tyXErx>1dSa0ub@s!VQui@?b;&U9 zpnZ*;g+Q8D{#k!LI=>sicu|Qg=k##_C#gE!R9h1t@%7l?=X+0{qzT+NIvzW}GZ$y{!99 z+A6tt@?7`%>X|vdBYf(4vyR^J%1bynQI`xXykC+wb7!R{IN;L6Q>>4bv>LglPRNg(1f31s4m26SZwC)T_y%|wDy?7qQo*VCT=O%XKzkT7ok5#ReqaDS5H*VC#_}Mo= zy}OFRQ0K8U3Lq_hBV@OPM)DWxX0Da{XXTqz{_c|XZRN$B!Nq}=aYGdFI5E(pmr-~r@n!S2WB;8{X0<1nUb(>Sx z*j-p$_D-$ctrS&BlXT%WcXgXHD{Xd-@seOwLPUwTnE=ARM& z342!ugU;AXZmGovUo_xn$K|FR^_OYA`k;O7^T+{hN$({1%0Jn2?|=oQt3M!3GAi7D zB8S`%Tsdkt4i>EELzOyZ7tnM9%7jEmaW>dy8)5_Na6B*RshtN6z%MNFOLqMPCa zdBGPI0**bf95;Ad4OglvG%Yll*ojEJ>e0_uR7!cY#jt~p=f3cp=Rm3CdEHy0O}q^S zs^NsF+v%D#;k_kuLC2LeIREAt%~P1?WyX0eA5#rtH zE{3-EKaMXdU>b322ruH>dsW8B=7s8G59<#l=BRNVJpuH9;+`L5^EkMn{&^XWuc)GY z%Vsi^w45Z5qSh}wP8|gpk-Er$eopZmT1hqBJm%y(t&()hsy4-i7LhOUiZ(4IqJKBD(%g$^4dXD{-7#7eCn;l(x8=Wak0?Z2E zU6;gn&M3SO#gPlQW8aVA5}>%RyK+x+n1UZ~ap%q$x)p6D&JHUO(ieAW>Y>_4 zM)JDzZ2Wk1$_IWryBk%&al4O&Vz*{iT)1;@F9QHpvvbB=fpup?hxh2oV}EmZ4|iKr zt6(C7D1e3OnsmG8=@Y4oSNSFH&i>|N<1PYA?hN}&NmTYE$@lrTOD(xww%ncmPG2_{ zv1q(<1AP!kjbQGQiz0(5>&UIB?@{)%JCao`b{i>@^Csd_CSGvF?PPbh=jaH;_x`-l zcPVK1B2qj2Q08Jta2ExLcsy^^;(DF<+=~_~kcuJs#CI{!O=+D2a9HTH({DnN2Jmhx zC~i{U_z(JuCW!mG@}End+p#>kUoCn87b5}gZoZf64Xs-Y_o~2&v9AgeF76<0rJmE8 zJ~>%w3)fRQy#0}d?aO=4FDhQJuAh3x<~ZxiUE;IT%X+Eyb^fi$%dnnlF}hzdl->nI zex#u7cfWuAz7ZAwGa|$zyIR;i{Nbi zh*4Oayc8$oH2`!y>J{|lMlPqA9h+ty$2D+2H+_CzE5#2%HtuBDNAaP(0kH6efqxzJ z03)_^+;;VlEtKVcV5QbJi1yn~14&Lr?zH{iDg8ae4=5WKCg&gT(L?U?rdRkWf!v^* zsn?78f4Zb@S_Yv}G`z!d0k;jJeNR~mgH7KZsKj%4OP$2D>`f}`|2-Jlm@~<(L+gaj z;hB*CxNaDgyem{UAP@%SXn9w4o?0~g(>xq7_2RU5Efuf zU9!e`4&lvP7dTq{ArpD+#vm#&Z|7Ds>#^OiAom1*IntILx;A8=an{*GeUb|NMQWs# zm(SXy1|Mb}8VpvS`!t$7q6B>E`%#wnS}@Gbh-sxo!U&@`8Y!?2b2~~)@&Xz9Md;%C z%-c?{%IL<0UT?-h;^ z{d%D5hCixXylAPPvP;qRoqu12^G+6o{*_u0^uS)SC>d|wLZsR1+r@@d$JwZ_c!0sF z!RCx`pdnr!D$sS>8!iRE-#dyLMG_|+1<*~Vgy@kPL85eA((WDJ4APw_PaPhXhN zo{qrWHODLOFSvo}i=Ty5SZALGa)oxwxrN=#>L4@P0MEUOZ@~ADpHlyRaW=m#87ScN z7Pan=&r6q*PLSkiJ8CXpb{?&Y>b?Bxbbj+(N<&5)W%-Bj4)%5RJ1fWAR7}7kx$}70 z6nMkCnw<%)p=e2S{M(y17(Kapvz-u2Y2l_{Od$fapHy7)9~~4#@@sVbiw52_?F_#} zYCF{{DM{{h0T0KN;GF7Uxk|`PGbIH z_OIYg{qkDzrhiLSt*L_b&2ga>XI1*ws9Dp+pS()TjA~uy-<+53A&**heJ|@bhTZlJ z;RQR%+lMY9()D9&NM=YN{Ps&BZjcJ_8O0`qw>)=Ov5A?^>HO@4mOhFNg^^zSR0{H0 zby-4m`K?pRlBj!4A%U~GHVsxtdpVo1I_@B_Qe%plzJuc^TOA=MusRQRc??$ua}oUCzm8JfStuFB$`H59MAHx0TAs1@wXf>UTQPsOn+-D zpmTYFryQbDUGt(^>~s=0z z=w9pBM6B^>;L4-AN>#}~b(}3e4fjX(tqC)0xVN7Y%rJn(<;lSx+L_SAf#6euk$U^h zMrWz}ys4l&skckQOh>D^IdkEj<22v(s|~S$_Y;|hOw~JVNWfyfb-(L0w9&ZPLK5qE zL;TRq=+d=!MHji5{1%h?x8Mcm{>#xZQ;n&+)%PR00zjAwOXMcYFq}A|mA}99X!E7- z;%&{+{N3L;sasNwJ@D}#OB{CxOJ|7}Ji`J+Y+Z6i)U1}ui%IYDE^1D0S>n&}PQ@AJTG2cbriYt1POdDo=e!-(=nU@m4X&TzIJlq7yNB44u3jR!TW;;m+t>56s6Hk& zmR!``n+PqBV`|5QlR?cdst`e5O>Xn#l*=hqkogh!j?K+rb7W6*oy*y&RLAZR&As$s z&Y1G0+uiXqck6eK20kA}rS}&D0hiH5H0fWZ-D1zrS>~P_5i$d+l>{9&6ra2P%nsn$ zchOV%tcnnuLI>2IE=t<{QKPh&dGEDQ>>b*!iFP1jI!Ak=$Ds?W8Tyr&_bUupa z0wZ91%dO<;9>A@*y9P+l$co$?Y`)R8!7I7mHYZVg8L zcH?e;H69vId2k88`y(6*pOrNn4?k@%1>9#Hk&Gc3{Kflb*Z!tIU6$%Dzv#jEOJXmh z;a-!~#Rntn(m%dqoMZ{X1($iT;OkBI*PM9x>(Zih%H1<*X3V+w^CczTT{*aJ9gaml zLSqK9$sLzQn@rb1-aYZuF%6B?{yXpY2sVPw+SuBJ{V#tl!Y9@P2!rqJ3nTgjCwCU? zyEJjEf}AUh{(L#PdNM#+KTHr6sF?TrlK`cI)08M+;<@;9G+7ZaI&a^8VNS4Q@TaTu z>WUaG)ZJ>A4T1nhT<>$+yB$CWVnVJPGJkz8>} zLq6Luusm^M&%u@q&<6dE(Z6ef8mEyvIzCE?q0-jv2zEZt4ZK#5uNRR2=RVnUinc-#J)7!Hj zhYMhEpdVGe*+7{R-P3gVesaiS@d53zJ>}8gt*w5IY|r!krn@QGj=VoocO#I{y;n5L zreyo?LS!wQ|FYDMypCKm>^NAFy7_azF{;0jH&gFEZrXiwxK%c3XD91ASa@_`PB2I_ zbnmKC?m3e;8PJav5hAc&RUCbTQ}OOYla}&dgkw9F$3PEGHi29NzqnY6|9w zmp-5p!ks^$k{PZF4fghBe zGE6*{?$Uc{W>&lLuGLwc8&`HX(3<7Tc5-^+$lyhp)_jKdoP2a!mXY z;u`gijGy7FsT3pDF4=!%{aM(lD-cWj`~Tk2$Jr;bHpW;Bm+^AG8l(L1u$nu+uBUk@ z6|X|!6-6l+zMLIw);-s|{=Z+|^$3gME=ifg&z#9D;-(I$=B|SM@26zrZ!W}}CRHi4 za4|y&3kVDNQgzm{V-Bov_{bv^S{PeIRe)(}VkciTd{n~C)QiX8XA*XP2qqOrWDZT{ zT_^f&xM|#+k#QY;^Pd|4mecO1C*Y#iU9~ow93p}H758iN5`lN`&I#ZmxSoi)V4uQ* za&^=`Li8&)y93>ZA#!!ce#VdL-41G?B848?%tp_-r|-|dN@^weFygi_8Ps~IRFt# z2$MW7w#O&H;`_xBH;QA7O=IO-(g+FY%Cs<||6rzVY2Pzy>5MwUC!~c2=n^IQVUbo# z_DvB0e9#Oy0igP+UBNdU766NOJ`RdR2Uc)!jumj5Ynq1&i9IgNieGi)TuHoJxJc%^ zWQk`snu7oB-8plN*4v1YA_77bfi4HPq%>+rF|Vbb#mP{Qr*udX07E^GruFiz##f}l z(&y$g)`0xN=?-h>#@p>&aaW@F;D5^#0SC=hb`wC3r!lcrU22-PiWs`oN;HPY_apEsQQ>mZ>=y59^h^)&R|eL68d0B}*B zA;cp(_Sp*lbs{6gN2Y;8r^m>LTImm6h3x?QoawJ+n|vNXy&Myc|KEwL1$aI(x!#6SFaC|{ zjufAL&`N$T6A*3_a-OqL<>{RgSWjJ8Ia>j+b|Cb4<```ewW)YBi3CdV{0qw^x} z;FA{nLFby6_rHxt??>TObUiI-qu(-}Y!ih)jCoG}@MyZ-^|GqDhYB|{* z@XP3MHEgB7Zic~*Z{GTcdjOup`qjB$;YF4(SV?+bV~z~V8V}lpV0F4@V&IF->UVUz ziGJ~=|9ew+x;{EZS|MluZFmLfHRbblaZJbgH|2NBglvSEC(d4fKWWJDK5rLMU?P89 zC4@ywdm3k*DGt5i9~~7C|NXMF-SPAquHo4^fJy5)nW6veI&LwSfB7wz`5wce0mYcI zy77Gd!AzQvuaWPq@6ZR_ZHbUYw_;nAhMh`h=cTJ#WX++<)Gd$H>w~@g-JLS~i83_x zFd9$ZA=KICy6VO2-!x|P)2_kyK}p}mO>rWGR=@9}vZI82QFuHMZsi7B)m#!6H^5Vh*XhfjoFLlehatyX{TaJ#LwRdUWP&UCnR*x(6#zSXU>*I+wU z3~d4N+7qC~x)``5UEe!6ynU&CpX|DpwXyMN81=0bbztK0M0sTOKJ;PqnIv0=Qr<`8#c{!4KF+>0-LWxpE6ABQ}54 z;Zbjd#F1=L0zsaeQ}TiGz3DWP-@JIP@&1;rota8!ydb}<=n)JZH+ZXr#1$@WXwXTV z4wPzG3QWTQdHIV!9p@G&jTnUED+?O_q56hbabYdg%W;LdFuMu1QHjeo>vjdema-Hb zAiT|0d4cglSnG}bkn4F1QS`gO!}D^J{W1^IvtLb>^Oc+}@6Qh^&Vp30udr}haDD}m zBwH^K`tM$R8WO*L@v=hbcf)>7oqq`bXW2Lpq-(2V{t3_NjSNYr?{#1NOR4Dohz2STmIuS10@4Dg?ugSm8m};;RQRQi zDgTTcl#O;>XGF?&S>nZj9*!vdu*d^H#JD=^B!to>;5?R8%oqjRBPH(T;SG17lgrsM z5%Y*6DL{e!&~?E_L{s;czq8!;HTfw&fIpZdEgYB=%WA5&Kh}u zOSRC&hM$*gEV{k|<;u&G>P;+^{1jyJ^o~FK-Tp?+{8d9%om7cdS#-^`ReG)5s9Vp+ zdv5Yugqm>m-BG;u)7vIJz5bfkiPmlAsdIP@>9b?#GYq2sCQj?TTz_s8FZ1^6sb90- zT-T*^PPaOSWxsur8Kqld>Hvg7@Rrfj&;A&+WXXh~p`=$ybAF`8qv&${)Qj|gTtx|3 z#2t4VV#1k#>}nhd%y3kJH`7_mIRxtDqqxdQnXg+8d6 T3`2{0qy}!fc~S%w@}$ ze;u2b*_ zIr{o)=${CqzBLz~*lnB5Rbx3EWL(0ee{H=q!gx;^pZw!kK>I$D`{wPO%a&6MKYVY{ z<{x?5)rSHJ0e1ZlV@mQE1yo|!_G{mrz|ri z1NfWJdqFdXIuh7d95r z1^hq%Ebi@0!5dZq!gXnEx_<sJ3CGgwJaGNt#*e#UK9$r@Gcm<=_Z z5{AtFnwa35{V0QtD}}?e)hl{`bK=%<`g>=`scCNCOU%|#NUg51(Pw|Q;e5f@Twj06 zffS!kAe*P_3(;D2+d=EutTTyxf~{d9BS0Ibn5d(v`Ny**TYZxuUIG?yelX6(EaNb3 zL4zYk(0LT=X5uqr+Xx|&5l~CA&A|UIY9GVf|4!1}+xs*Peq(C_0sS{393F>WT^$`0 zzds+tEm@=Jl?bhWHbQ`JkSwhsveoR0@|`2U>gJWGaW0OBTZg=2I5-9(L?|-Is0jTuNM)kd z06+ep?@SNIE9hxzCM>-EWi5BgWE@!wnS)iTGA9k%h-~70vaXMg0qk_=OQ z3$9J0o7ORtzkkR1C_Q}t6I&sXO;0$k z8~oOX7T>+aGt}1y^INOz*KC9H^XJcBw=HAmTZf}y=7`wmzTNm$rVWlTx9=mC zlUW?ueoH^YwAudc+ux`c)nFVP`$?3SvqxDO{(g^!^}Es#df0K^*whq%MnW4FhXRiN z;b)ex+s>~tQBhGVJ~(nanNi86%O<7>xqWkU^P;+023$BD1*E|Ern#QphP%iC{QeGp zcUn`^emvx0jwR#p?O`P?&-P}LSTyj^QNjECai88j6{EzHiLfL)@{`C=#SHEK_=MDR zM81=cS1KHz9sy%iGOKASC|E(}-FaDCuf|b{D_lE)CGrCbW~>N&Ny>Fz1Pst4zndU9 zHcw{pOe3dKB3ZM9bwAEgA)}HNUa=o|F5_p!!l?LR`^LtG0f*4+6nNA@EZZkUVZJw# zNKg$bLTOerwR;-%=8sRC{Of2&r9bWl0?A5=UsJpaC!x1v!GUcn(AXe?N>vxlGYqXb3#aKtXw9EYG0w(+dUY zPlwF4RzDA?qv+;9OnAS1E+IEdwzca;ARg5v%O;2;>r&}xq^33;g6P-L6RW5&4GZDu zY3kHHUJR&>eXbpIr1o4JH@5i=vkVIbCRjBjsN)qS?K15ist#YI+y||4)+or_wwG9r zdbC(n1Q$R%k*ukVB5l*JTBJ2-qg7d~%Jx#A)x`bPMYK7`$nc~LovtRMJY5v3u5RaO zaIU8Eobl;~f8ciEK4M8Ddl~V1D+%YJ)_}3x2+=fDDnTCkQ37&I{Q_#HQ%Qr2nGLYF)S(wS7E7zgQ;GRvLH*LtcTMqZ}e92^|%Kj`%6Q)utLq(Pq+sT=zIfEBP3hTuvw4JI;%YFXgeWbpTk z+9&qvq^+FRd00~|-5CApiEprsdF8P75Y8)LgU%Fo%N&t6^@_!N|v zr!Ua2#9ERK+IUV?o0jR6mz1zj;zd77xB8LsqXDd7nVFf5t_$ozljG~jw1kH)2*wE} zYYmp(LRNL9L=@@7(gK69tuRF(8{c&<8J}D_l`%t$S)8d!g`HhTDj@KnM`{2)6FZg| z#1wvk9<(_-SeP3d`@*U$6dfbWkR94flzk1fCyVLmVpx<9F)5|l zg6A<9hsaWFv$V4C!Oqst`a@1H0>MT?Qo5PDA8-qyGz$L@c7<1iY6Do_X~cahx5N`{ zGqf_*OXL~S)49u7hmzT})unF#O;+ef2VJ`mWjGKK(G4_0`VIIp_O`c=u5Z;rb+|GH ze`0>#WzI)MC3>2vt(cDv9s38NrfvbtPR__o;@X-CrUgI@h}dTv1I!_)wEWB-TqBAi zEQvBYDIx-ni@!;UVjvJQ;kCdmr;>`fP`q&<7~th{{3ON>OGpeGtdx;`)xYh?*K zB5DtI#|%}4up}3l4e+BseGh-lfa6)Lg0Zo2Uk#Zx*d>yp-q~iKkeBo`$}pm4hpw

9+AGmTJ%w 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%0ALkM|m^b>=3 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 From c0f1fe4d31cafa6ccc7416aee71a70bd59929f8c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 10:33:27 -0400 Subject: [PATCH 152/417] make utility functions local and static. remove from class. --- src/region_ellipsoid.cpp | 19 +++++++++++++------ src/region_ellipsoid.h | 6 ------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/region_ellipsoid.cpp b/src/region_ellipsoid.cpp index 0296178648..f5c896644b 100644 --- a/src/region_ellipsoid.cpp +++ b/src/region_ellipsoid.cpp @@ -25,6 +25,14 @@ using namespace LAMMPS_NS; enum { CONSTANT, VARIABLE }; +static double GetRoot2D(double r0, double z0, double z1, double g); +static double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g); + +static double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, + double &x1); +static double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, + double y2, double &x0, double &x1, double &x2); + /* ---------------------------------------------------------------------- */ RegEllipsoid::RegEllipsoid(LAMMPS *lmp, int narg, char **arg) : @@ -439,7 +447,7 @@ void RegEllipsoid::variable_check() functions for the 2D case ------------------------------------------------------------------------- */ -double RegEllipsoid::GetRoot2D(double r0, double z0, double z1, double g) +double GetRoot2D(double r0, double z0, double z1, double g) { int maxIterations = std::numeric_limits::digits - std::numeric_limits::min_exponent; @@ -464,8 +472,7 @@ double RegEllipsoid::GetRoot2D(double r0, double z0, double z1, double g) return s; } -double RegEllipsoid::DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, - double &x1) +double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, double &x1) { double distance; if (y1 > 0) { @@ -510,7 +517,7 @@ double RegEllipsoid::DistancePointEllipse(double e0, double e1, double y0, doubl functions for the 3D case ------------------------------------------------------------------------- */ -double RegEllipsoid::GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g) +double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g) { int maxIterations = std::numeric_limits::digits - std::numeric_limits::min_exponent; @@ -537,8 +544,8 @@ double RegEllipsoid::GetRoot3D(double r0, double r1, double z0, double z1, doubl return s; } -double RegEllipsoid::DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, - double y2, double &x0, double &x1, double &x2) +double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, double y2, + double &x0, double &x1, double &x2) { double distance; if (y2 > 0) { diff --git a/src/region_ellipsoid.h b/src/region_ellipsoid.h index 033d30234f..59944f093e 100644 --- a/src/region_ellipsoid.h +++ b/src/region_ellipsoid.h @@ -47,12 +47,6 @@ class RegEllipsoid : public Region { char *astr, *bstr, *cstr; void variable_check(); - - double GetRoot2D(double r0, double z0, double z1, double g); - double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g); - double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, double &x1); - double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, double y2, - double &x0, double &x1, double &x2); }; } // namespace LAMMPS_NS From 92a6200c5511d522fa04a9a5118d99eff325974d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 10:35:24 -0400 Subject: [PATCH 153/417] no need to converge root finding beyond when g reaches 2*epsilon --- src/region_ellipsoid.cpp | 102 +++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/region_ellipsoid.cpp b/src/region_ellipsoid.cpp index f5c896644b..daabd621c8 100644 --- a/src/region_ellipsoid.cpp +++ b/src/region_ellipsoid.cpp @@ -33,6 +33,10 @@ static double DistancePointEllipse(double e0, double e1, double y0, double y1, d static double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double y1, double y2, double &x0, double &x1, double &x2); +static constexpr int maxIterations = + std::numeric_limits::digits - std::numeric_limits::min_exponent; +static constexpr double EPSILON = std::numeric_limits::epsilon() * 2.0; + /* ---------------------------------------------------------------------- */ RegEllipsoid::RegEllipsoid(LAMMPS *lmp, int narg, char **arg) : @@ -444,26 +448,24 @@ void RegEllipsoid::variable_check() // ------------------------------------------------------------------ /* ---------------------------------------------------------------------- - functions for the 2D case + static helper functions for the 2D case ------------------------------------------------------------------------- */ double GetRoot2D(double r0, double z0, double z1, double g) { - int maxIterations = - std::numeric_limits::digits - std::numeric_limits::min_exponent; - double n0 = r0 * z0; - double s0 = z1 - 1; - double s1 = (g < 0 ? 0 : sqrt(n0 * n0 + z1 * z1) - 1); - double s = 0; + const double n0 = r0 * z0; + double s0 = z1 - 1.0; + double s1 = (g < 0.0 ? 0.0 : sqrt(n0 * n0 + z1 * z1) - 1.0); + double s = 0.0; for (int i = 0; i < maxIterations; ++i) { - s = (s0 + s1) / 2; + s = (s0 + s1) / 2.0; if (s == s0 || s == s1) { break; } - double ratio0 = n0 / (s + r0); - double ratio1 = z1 / (s + 1); - g = ratio0 * ratio0 + ratio1 * ratio1 - 1; - if (g > 0) { + const double ratio0 = n0 / (s + r0); + const double ratio1 = z1 / (s + 1.0); + g = ratio0 * ratio0 + ratio1 * ratio1 - 1.0; + if ((g > 0.0) && (g > EPSILON)) { s0 = s; - } else if (g < 0) { + } else if ((g < 0.0) && (g < -EPSILON)) { s1 = s; } else { break; @@ -475,24 +477,24 @@ double GetRoot2D(double r0, double z0, double z1, double g) double DistancePointEllipse(double e0, double e1, double y0, double y1, double &x0, double &x1) { double distance; - if (y1 > 0) { - if (y0 > 0) { + if (y1 > 0.0) { + if (y0 > 0.0) { double z0 = y0 / e0; double z1 = y1 / e1; - double g = z0 * z0 + z1 * z1 - 1; - if (g != 0) { + double g = z0 * z0 + z1 * z1 - 1.0; + if (g != 0.0) { double r0 = (e0 * e0) / (e1 * e1); double sbar = GetRoot2D(r0, z0, z1, g); x0 = r0 * y0 / (sbar + r0); - x1 = y1 / (sbar + 1); + x1 = y1 / (sbar + 1.0); distance = sqrt((x0 - y0) * (x0 - y0) + (x1 - y1) * (x1 - y1)); } else { x0 = y0; x1 = y1; - distance = 0; + distance = 0.0; } } else { - x0 = 0; + x0 = 0.0; x1 = e1; distance = fabs(y1 - e1); } @@ -506,7 +508,7 @@ double DistancePointEllipse(double e0, double e1, double y0, double y1, double & distance = sqrt((x0 - y0) * (x0 - y0) + x1 * x1); } else { x0 = e0; - x1 = 0; + x1 = 0.0; distance = fabs(y0 - e0); } } @@ -514,28 +516,26 @@ double DistancePointEllipse(double e0, double e1, double y0, double y1, double & } /* ---------------------------------------------------------------------- - functions for the 3D case + static helper functions for the 3D case ------------------------------------------------------------------------- */ double GetRoot3D(double r0, double r1, double z0, double z1, double z2, double g) { - int maxIterations = - std::numeric_limits::digits - std::numeric_limits::min_exponent; - double n0 = r0 * z0; - double n1 = r1 * z1; - double s0 = z2 - 1; - double s1 = (g < 0 ? 0 : sqrt(n0 * n0 + n1 * n1 + z2 * z2) - 1); - double s = 0; + const double n0 = r0 * z0; + const double n1 = r1 * z1; + double s0 = z2 - 1.0; + double s1 = (g < 0.0 ? 0.0 : sqrt(n0 * n0 + n1 * n1 + z2 * z2) - 1.0); + double s = 0.0; for (int i = 0; i < maxIterations; ++i) { - s = (s0 + s1) / 2; + s = (s0 + s1) / 2.0; if (s == s0 || s == s1) { break; } - double ratio0 = n0 / (s + r0); - double ratio1 = n1 / (s + r1); - double ratio2 = z2 / (s + 1); - g = ratio0 * ratio0 + ratio1 * ratio1 + ratio2 * ratio2 - 1; - if (g > 0) { + const double ratio0 = n0 / (s + r0); + const double ratio1 = n1 / (s + r1); + const double ratio2 = z2 / (s + 1.0); + g = ratio0 * ratio0 + ratio1 * ratio1 + ratio2 * ratio2 - 1.0; + if ((g > 0.0) && (g > EPSILON)) { s0 = s; - } else if (g < 0) { + } else if ((g < 0.0) && (g < -EPSILON)) { s1 = s; } else { break; @@ -548,38 +548,38 @@ double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double double &x0, double &x1, double &x2) { double distance; - if (y2 > 0) { - if (y1 > 0) { - if (y0 > 0) { + if (y2 > 0.0) { + if (y1 > 0.0) { + if (y0 > 0.0) { double z0 = y0 / e0; double z1 = y1 / e1; double z2 = y2 / e2; - double g = z0 * z0 + z1 * z1 + z2 * z2 - 1; - if (g != 0) { + double g = z0 * z0 + z1 * z1 + z2 * z2 - 1.0; + if (g != 0.0) { double r0 = e0 * e0 / (e2 * e2); double r1 = e1 * e1 / (e2 * e2); double sbar = GetRoot3D(r0, r1, z0, z1, z2, g); x0 = r0 * y0 / (sbar + r0); x1 = r1 * y1 / (sbar + r1); - x2 = y2 / (sbar + 1); + x2 = y2 / (sbar + 1.0); distance = sqrt((x0 - y0) * (x0 - y0) + (x1 - y1) * (x1 - y1) + (x2 - y2) * (x2 - y2)); } else { x0 = y0; x1 = y1; x2 = y2; - distance = 0; + distance = 0.0; } } else { - x0 = 0; + x0 = 0.0; distance = DistancePointEllipse(e1, e2, y1, y2, x1, x2); } } else { - if (y0 > 0) { - x1 = 0; + if (y0 > 0.0) { + x1 = 0.0; distance = DistancePointEllipse(e0, e2, y0, y2, x0, x2); } else { - x0 = 0; - x1 = 0; + x0 = 0.0; + x1 = 0.0; x2 = e2; distance = fabs(y2 - e2); } @@ -595,8 +595,8 @@ double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double double xde1 = numer1 / denom1; double xde0sqr = xde0 * xde0; double xde1sqr = xde1 * xde1; - double discr = 1 - xde0sqr - xde1sqr; - if (discr > 0) { + double discr = 1.0 - xde0sqr - xde1sqr; + if (discr > 0.0) { x0 = e0 * xde0; x1 = e1 * xde1; x2 = e2 * sqrt(discr); @@ -605,7 +605,7 @@ double DistancePointEllipsoid(double e0, double e1, double e2, double y0, double } } if (!computed) { - x2 = 0; + x2 = 0.0; distance = DistancePointEllipse(e0, e1, y0, y1, x0, x1); } } From b0deb87188347ee7cb96d2f7cab4d30cc06eb145 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Oct 2023 15:13:22 -0400 Subject: [PATCH 154/417] include Qt version in About dialog --- tools/lammps-gui/lammpsgui.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index b6b590e855..422122775c 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1185,14 +1185,15 @@ void LammpsGui::view_variables() void LammpsGui::about() { std::string version = "This is LAMMPS-GUI version " LAMMPS_GUI_VERSION; + version += " using Qt version " QT_VERSION_STR "\n"; if (lammps.has_plugin()) { - version += " - LAMMPS library loaded as plugin"; + version += "LAMMPS library loaded as plugin"; if (!plugin_path.empty()) { version += " from file "; version += plugin_path; } } else { - version += " - LAMMPS library linked to executable"; + version += "LAMMPS library linked to executable"; } QString to_clipboard(version.c_str()); From 7d1c5b4106d7afc08eb5494f4d066634a11f3064 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Thu, 5 Oct 2023 15:56:51 +0200 Subject: [PATCH 155/417] Updated the manual to explain the new parameter and the physics of the barostat. --- doc/src/fix_press_langevin.rst | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index 045194d4db..fc80c80f9d 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -25,7 +25,7 @@ Syntax Pdamp = pressure damping parameter *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *mass* value = Mass of the barostat fictious particle + *friction* value = Friction coefficient for the barostat *temp* values = Tstart, Tstop, seed Tstart, Tstop = target temperature used for the barostat at start/end of run seed = seed of the random number generator @@ -68,7 +68,7 @@ two first terms on the righthand side of the first equation are the virial expression of the canonical pressure. It is to be noted that the temperature used to compute the pressure is not the velocity of the atom but the canonical target temperature directly. This temperature is specified using the *temp* -keyword parameter and should be close to the current target temperature of the +keyword parameter and should be close to the expected target temperature of the system. Regardless of what atoms are in the fix group, a global pressure is @@ -115,9 +115,13 @@ will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -For all barostat keywords, the *Pdamp* parameter determines the "friction -parameter" :math:`\alpha` of the pseudo particle acting as a barostat. The -relation is such that :math:`\alpha = \frac{Q}{P_{damp}}` where Q is the mass. +The *Pdamp* parameter can be seen in the same way as a Nosé-Hoover parameter as +it is used to compute the mass of the fictitious particle. Without friction, +the barostat can be compared to a single particle Nosé-Hoover barostat and as +such should follow a similar decay in time. As such the mass of the barostat is +also linked to *Pdamp* by the relation +:math:`Q=(N_{at}+1)\cdot{}k_BT_{target}\cdot{}P_{damp}^2`. Note that *Pdamp* +should be expressed in time units. .. note:: @@ -212,16 +216,16 @@ error. ---------- -The *mass* keyword sets the mass parameter :math:`Q` in the -equations of movement of the barostat. All the barostat use the same value. - -.. note:: - - The same recommandation with regard to the bulk modulus of a berendsen - barostat applies to a Langevin barostat mass. It is however important to - note that not only the absolute value used for the mass is important, but - also its ratio with Pdamp values which defines the friction coeffiction - value. +The *friction* keyword sets the friction parameter :math:`\alpha` in the +equations of movement of the barostat. For each barostat, the value of +:math:`\alpha` depends on both *Pdamp* and *friction*. The value given as a +parameter is the Langevin characteristic time :math:`\tau_{L} +=\frac{Q}{\alpha}` in time units. The langevin time can be understood as a +decorrelation time for the pressure. A long langevin time value will make the +barostat act as an underdamped oscillator while a short value will make it +act as an overdamped oscillator. The ideal configuration would be to find +the critical parameter of the barostat. Such a value is empirically found +so that :math:`\tau_{L}\approx{}P_{damp}/2.`. ---------- From ea8d6aaa522140116b01abf5b4ddf8cae75b7d76 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Thu, 5 Oct 2023 16:01:03 +0200 Subject: [PATCH 156/417] Version of the code with Pdamp similar to NH barostat and friction input as Langevin caracteristic time. --- src/fix_press_langevin.cpp | 61 +++++++++++++++++++++++++------------- src/fix_press_langevin.h | 7 +++-- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 2fad9e300f..41ca69f78a 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -65,19 +65,19 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pre_exchange_flag = 0; flipflag = 1; - // Piston mass - p_mass = 1e-3; + p_ltime = 1000.; + p_fric = 1./p_ltime; // Target temperature t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - // Pressure and pistons period tau_p + // Pressure and pistons period p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; - // p_mass[i] = 1e-3; + p_alpha[i] = 0; - p_fric[i] = 0.; + p_mass[i] = 0.; // Pistons coordinates derivative V p_deriv[i] = 0.0; @@ -216,11 +216,11 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; - } else if (strcmp(arg[iarg],"mass") == 0) { + } else if (strcmp(arg[iarg],"friction") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); - p_mass = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_mass <= 0.0) + p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (p_ltime < 0.0) error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { @@ -365,10 +365,18 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // p_fric is alpha coeff from GJF // with alpha = Q/p_period // similar to fix_langevin formalism + double kt = force->boltz * t_start; + double nkt = (atom->natoms + 1) * kt; + if (p_ltime == 0) { + p_fric = 0; + } else { + p_fric = 1./p_ltime; + } for (int i = 0; i < 6; i++) { - // p_mass[i] = p_period[i]; // force->boltz*t_start*(atom->natoms + 1)*p_period[i]*p_period[i]; - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = 1./(1.0 + update->dt / 2.0 / p_period[i]); + p_mass[i] = nkt*p_period[i]*p_period[i]; + p_alpha[i] = p_mass[i] * p_fric; + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); } nrigid = 0; @@ -396,6 +404,7 @@ int FixPressLangevin::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; + mask |= POST_INTEGRATE; mask |= POST_FORCE; mask |= END_OF_STEP; if (pre_exchange_flag) mask |= PRE_EXCHANGE; @@ -444,6 +453,14 @@ void FixPressLangevin::init() for (int i = 0; i < modify->nfix; i++) if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; } + + // Nullifies piston derivatives and forces so that it is not integrated at + // the start of a second run. + for (int i = 0; i < 6; i++) { + p_deriv[i] = 0.0; + dilation[i] = 0.0; + } + } /* ---------------------------------------------------------------------- @@ -471,8 +488,6 @@ void FixPressLangevin::initial_integrate(int /* vflag */) // Compute new random term on pistons dynamics if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop-t_start); - // for (int i = 0; i < 6; i++) - // p_mass[i] = force->boltz*t_target*(atom->natoms + 1)*p_period[i]*p_period[i]; couple_beta(t_target); dt = update->dt; @@ -481,17 +496,19 @@ void FixPressLangevin::initial_integrate(int /* vflag */) if (p_flag[i]) { // See equation 13 displacement = dt*p_deriv[i]*gjfb[i]; - displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass; - displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass; + displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass[i]; + displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass[i]; dl = domain->boxhi[i] - domain->boxlo[i]; if (i < 3) dilation[i] = (dl + displacement)/dl; else dilation[i] = displacement; } } +} +void FixPressLangevin::post_integrate() +{ // remap simulation box and atoms // redo KSpace coeffs since volume has changed - remap(); if (kspace_flag) force->kspace->setup(); @@ -540,8 +557,8 @@ void FixPressLangevin::end_of_step() for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; - p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass; - p_deriv[i] += fran[i]*gjfb[i]/p_mass; + p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass[i]; + p_deriv[i] += fran[i]*gjfb[i]/p_mass[i]; } } @@ -584,12 +601,14 @@ void FixPressLangevin::couple_pressure() void FixPressLangevin::couple_kinetic(double t_target) { double Pk, volume; + nktv2p = force->nktv2p; // Kinetic part if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; else volume = domain->xprd * domain->yprd; Pk = atom->natoms*force->boltz*t_target/volume; + Pk *= nktv2p; p_current[0] += Pk; p_current[1] += Pk; @@ -604,7 +623,7 @@ void FixPressLangevin::couple_beta(double t_target) int me = comm->me; for (int i=0; i<6; i++) - gamma[i] = sqrt(2.0*p_mass*force->boltz*update->dt/p_period[i]*t_target); + gamma[i] = sqrt(2.0*p_fric*force->boltz*update->dt*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; @@ -810,7 +829,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - update->dt / 2.0 / p_period[i]) / (1.0 + update->dt / 2.0 / p_period[i]); - gjfb[i] = sqrt(1.0 + update->dt / 2.0 / p_period[i]); + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); } } diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index d6ea9df714..7d0b27c834 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -33,6 +33,7 @@ class FixPressLangevin : public Fix { void setup(int) override; void pre_exchange() override; void initial_integrate(int) override; + void post_integrate() override; void post_force(int) override; void end_of_step() override; void reset_dt() override; @@ -43,10 +44,12 @@ class FixPressLangevin : public Fix { int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not + double nktv2p; double t_start, t_stop, t_target; - double p_mass; + double p_fric, p_ltime; // Friction and Langevin charac. time + double p_alpha[6]; double p_start[6], p_stop[6], p_period[6]; - double p_fric[6], p_target[6], p_current[6]; + double p_mass[6], p_target[6], p_current[6]; double p_deriv[6], dilation[6]; double f_piston[6], f_old_piston[6]; double gjfa[6], gjfb[6], fran[6]; From 127dcd5613a472eefbfda48fdb539bf5ac097ba1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 5 Oct 2023 13:16:03 -0400 Subject: [PATCH 157/417] fix cut-n-paste error --- src/update.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/update.cpp b/src/update.cpp index 1074d8dcf6..04d3f7e1e6 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -396,7 +396,7 @@ void Update::new_integrate(char *style, int narg, char **arg, int trysuffix, int void Update::create_minimize(int narg, char **arg, int trysuffix) { - if (narg < 1) error->all(FLERR, "Illegal run_style command"); + if (narg < 1) error->all(FLERR, "Illegal minimize_style command"); delete[] minimize_style; delete minimize; From 3999b3e5571b7c4aa90abe4248d09c989a76d8bc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 5 Oct 2023 13:22:15 -0400 Subject: [PATCH 158/417] enforce newline before adding run 0 command to avoid syntax errors. --- tools/lammps-gui/lammpsgui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 422122775c..01933c46eb 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1098,7 +1098,7 @@ void LammpsGui::render_image() cursor.movePosition(QTextCursor::EndOfLine); cursor.movePosition(QTextCursor::Start, QTextCursor::KeepAnchor); auto selection = cursor.selectedText().replace(QChar(0x2029), '\n'); - selection += "run 0 pre yes post no"; + selection += "\nrun 0 pre yes post no"; ui->textEdit->setTextCursor(saved); lammps.command("clear"); lammps.commands_string(selection.toStdString().c_str()); From b38e828c49a755f16afe5b06f28b8101a1050de5 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 5 Oct 2023 22:51:48 -0600 Subject: [PATCH 159/417] Prevent segfault with unsupported radial basis --- src/KOKKOS/pair_pace_kokkos.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/KOKKOS/pair_pace_kokkos.cpp b/src/KOKKOS/pair_pace_kokkos.cpp index 56a6656d78..153a6d0333 100644 --- a/src/KOKKOS/pair_pace_kokkos.cpp +++ b/src/KOKKOS/pair_pace_kokkos.cpp @@ -237,6 +237,9 @@ void PairPACEKokkos::copy_splines() ACERadialFunctions* radial_functions = dynamic_cast(basis_set->radial_functions); + if (radial_functions == nullptr) + error->all(FLERR,"Chosen radial basis style not supported by pair style pace/kk"); + for (int i = 0; i < nelements; i++) { for (int j = 0; j < nelements; j++) { k_splines_gk.h_view(i, j) = radial_functions->splines_gk(i, j); From fcc92b50dbc5e0986d7784d6aba8fd71d2248cd5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Oct 2023 02:46:15 -0400 Subject: [PATCH 160/417] add support for a help flag and print text mode error message for nonexisting file --- tools/lammps-gui/main.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/main.cpp b/tools/lammps-gui/main.cpp index bdd3885492..310ccb291f 100644 --- a/tools/lammps-gui/main.cpp +++ b/tools/lammps-gui/main.cpp @@ -14,13 +14,30 @@ #include "lammpsgui.h" #include +#include + +#include +#include int main(int argc, char *argv[]) { QApplication a(argc, argv); const char *infile = nullptr; - if (argc > 1) infile = argv[1]; + if (argc > 1) { + infile = argv[1]; + if ((strcmp(infile, "-help") == 0) || (strcmp(infile, "-h") == 0)) { + printf("This is LAMMPS-GUI version " LAMMPS_GUI_VERSION + " using Qt version " QT_VERSION_STR "\n"); + printf("Usage: %s [-h|-help|]\n", argv[0]); + return 1; + } + if (!QFileInfo::exists(infile)) { + printf("Input file %s does not exist\n", infile); + printf("Usage: %s [-h|-help|]\n", argv[0]); + return 2; + } + } LammpsGui w(nullptr, infile); w.show(); From d388ef762d91766b09564ce1b52a18da3e2df3f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Oct 2023 06:42:40 -0400 Subject: [PATCH 161/417] Implement more conventional behavior when opening non-existing file. Instead of only printing a warning we now create a *named* and empty buffer and change to the directory of the filename, so that the file will be created in the desired location as soon as it is saved. --- tools/lammps-gui/lammpsgui.cpp | 15 ++++++++------- tools/lammps-gui/main.cpp | 5 ----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 01933c46eb..c9d8b9bef0 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -588,22 +588,23 @@ void LammpsGui::open_file(const QString &fileName) if (!file.open(QIODevice::ReadOnly | QFile::Text)) { QMessageBox::warning(this, "Warning", "Cannot open file " + path.absoluteFilePath() + ": " + - file.errorString()); - return; + file.errorString() + ".\nWill create new file on saving editor buffer."); + ui->textEdit->document()->setPlainText(QString()); + } else { + QTextStream in(&file); + QString text = in.readAll(); + ui->textEdit->document()->setPlainText(text); + ui->textEdit->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); + file.close(); } setWindowTitle(QString("LAMMPS-GUI - " + current_file)); run_counter = 0; - QTextStream in(&file); - QString text = in.readAll(); - ui->textEdit->document()->setPlainText(text); - ui->textEdit->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); ui->textEdit->document()->setModified(false); ui->textEdit->setGroupList(); ui->textEdit->setVarNameList(); ui->textEdit->setComputeIDList(); ui->textEdit->setFixIDList(); ui->textEdit->setFileList(); - file.close(); dirstatus->setText(QString(" Directory: ") + current_dir); status->setText("Ready."); diff --git a/tools/lammps-gui/main.cpp b/tools/lammps-gui/main.cpp index 310ccb291f..cf09fbb892 100644 --- a/tools/lammps-gui/main.cpp +++ b/tools/lammps-gui/main.cpp @@ -32,11 +32,6 @@ int main(int argc, char *argv[]) printf("Usage: %s [-h|-help|]\n", argv[0]); return 1; } - if (!QFileInfo::exists(infile)) { - printf("Input file %s does not exist\n", infile); - printf("Usage: %s [-h|-help|]\n", argv[0]); - return 2; - } } LammpsGui w(nullptr, infile); From f688a28d7f6a36a5d147f421589adc55cb152608 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Oct 2023 12:42:17 -0400 Subject: [PATCH 162/417] update help index table --- tools/lammps-gui/help_index.table | 8 ++------ tools/lammps-gui/update-help-index.sh | 2 ++ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/help_index.table b/tools/lammps-gui/help_index.table index d32483760a..5ce4ae6203 100644 --- a/tools/lammps-gui/help_index.table +++ b/tools/lammps-gui/help_index.table @@ -196,6 +196,8 @@ compute_cluster_atom.html compute fragment/atom compute_cna_atom.html compute cna/atom compute_cnp_atom.html compute cnp/atom compute_com_chunk.html compute com/chunk +compute_composition_atom.html compute composition/atom +compute_composition_atom.html compute composition/atom/kk compute_com.html compute com compute_contact_atom.html compute contact/atom compute_coord_atom.html compute coord/atom @@ -242,8 +244,6 @@ compute_ke_atom.html compute ke/atom compute_ke_eff.html compute ke/eff compute_ke_rigid.html compute ke/rigid compute_ke.html compute ke -compute_local_comp_atom.html compute local/comp/atom -compute_local_comp_atom.html compute local/comp/atom/kk compute_mliap.html compute mliap compute_modify.html compute_modify compute_momentum.html compute momentum @@ -409,15 +409,12 @@ dump_netcdf.html dump netcdf/mpiio dump.html dump dump.html dump atom dump.html dump atom/gz -dump.html dump atom/mpiio dump.html dump atom/zstd dump.html dump cfg dump.html dump cfg/gz -dump.html dump cfg/mpiio dump.html dump cfg/zstd dump.html dump custom dump.html dump custom/gz -dump.html dump custom/mpiio dump.html dump custom/zstd dump.html dump dcd dump.html dump grid @@ -428,7 +425,6 @@ dump.html dump local/zstd dump.html dump xtc dump.html dump xyz dump.html dump xyz/gz -dump.html dump xyz/mpiio dump.html dump xyz/zstd dump.html dump yaml dump_vtk.html dump vtk diff --git a/tools/lammps-gui/update-help-index.sh b/tools/lammps-gui/update-help-index.sh index 5bb57c7148..77b924d38d 100755 --- a/tools/lammps-gui/update-help-index.sh +++ b/tools/lammps-gui/update-help-index.sh @@ -1,4 +1,6 @@ #!/bin/sh # this updates the help index table +mv help_index.table help_index.oldtable grep '\.\. index::' ../../doc/src/*.rst | sort | sed -e 's/^.*src\/\([^/]\+\)\.rst:/\1.html /' -e 's/\.\. \+index:: \+//' > help_index.table +cmp help_index.table help_index.oldtable > /dev/null || touch lammpsgui.qrc From dc3b6aa6977775f91ec8db94888e13c1ebd8175b Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Fri, 6 Oct 2023 16:47:38 -0600 Subject: [PATCH 163/417] Minor edits, mainly affecting friction keyword --- doc/src/fix_press_langevin.rst | 47 +++++++++++---------- doc/utils/sphinx-config/false_positives.txt | 2 + 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/doc/src/fix_press_langevin.rst b/doc/src/fix_press_langevin.rst index fc80c80f9d..8438d72192 100644 --- a/doc/src/fix_press_langevin.rst +++ b/doc/src/fix_press_langevin.rst @@ -19,13 +19,13 @@ Syntax keyword = *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *xz* or *yz* or *couple* or *dilate* or *modulus* or *temp* or *flip* *iso* or *aniso* or *tri* values = Pstart Pstop Pdamp Pstart,Pstop = scalar external pressure at start/end of run (pressure units) - Pdamp = pressure damping parameter + Pdamp = pressure damping parameter (time units) *x* or *y* or *z* or *xy* or *xz* or *yz* values = Pstart Pstop Pdamp Pstart,Pstop = external stress tensor component at start/end of run (pressure units) Pdamp = pressure damping parameter *flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed *couple* = *none* or *xyz* or *xy* or *yz* or *xz* - *friction* value = Friction coefficient for the barostat + *friction* value = Friction coefficient for the barostat (time units) *temp* values = Tstart, Tstop, seed Tstart, Tstop = target temperature used for the barostat at start/end of run seed = seed of the random number generator @@ -42,8 +42,8 @@ Examples Description """"""""""" -Reset the pressure of the system by using a Langevin stochastic barostat -:ref:`(Grønbech) `, which rescales the system volume and +Adjust the pressure of the system by using a Langevin stochastic barostat +:ref:`(Gronbech) `, which rescales the system volume and (optionally) the atoms coordinates within the simulation box every timestep. @@ -64,9 +64,10 @@ Where :math:`dt` is the timestep :math:`\dot{L}` and :math:`\ddot{L}` the first and second derivatives of the coupled direction with regard to time, :math:`\alpha` is a friction coefficient, :math:`\beta` is a random gaussian variable and :math:`Q` the effective mass of the coupled pseudoparticle. The -two first terms on the righthand side of the first equation are the virial +two first terms on the right-hand side of the first equation are the virial expression of the canonical pressure. It is to be noted that the temperature -used to compute the pressure is not the velocity of the atom but the canonical +used to compute the pressure is not based on the atom velocities but rather on +the canonical target temperature directly. This temperature is specified using the *temp* keyword parameter and should be close to the expected target temperature of the system. @@ -82,7 +83,7 @@ unchanged and controlling the pressure of a surrounding fluid. .. note:: Unlike the :doc:`fix npt ` or :doc:`fix nph ` commands which - perform Nose/Hoover barostatting AND time integration, this fix does NOT + perform Nose-Hoover barostatting AND time integration, this fix does NOT perform time integration of the atoms but only of the barostat coupled coordinate. It then only modifies the box size and atom coordinates to effect barostatting. Thus you must use a separate time integration fix, @@ -115,11 +116,11 @@ will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -The *Pdamp* parameter can be seen in the same way as a Nosé-Hoover parameter as +The *Pdamp* parameter can be seen in the same way as a Nose-Hoover parameter as it is used to compute the mass of the fictitious particle. Without friction, -the barostat can be compared to a single particle Nosé-Hoover barostat and as -such should follow a similar decay in time. As such the mass of the barostat is -also linked to *Pdamp* by the relation +the barostat can be compared to a single particle Nose-Hoover barostat and +should follow a similar decay in time. The mass of the barostat is +linked to *Pdamp* by the relation :math:`Q=(N_{at}+1)\cdot{}k_BT_{target}\cdot{}P_{damp}^2`. Note that *Pdamp* should be expressed in time units. @@ -139,7 +140,7 @@ The *temp* keyword sets the temperature to use in the equation of motion of the barostat. This value is used to compute the value of the force :math:`f_P` in the equation of motion. It is important to note that this value is not the instantaneous temperature but a target temperature that ramps from *Tstart* to -*Tstop*. Also the required argument *seed* also sets the seed for the random +*Tstop*. Also the required argument *seed* sets the seed for the random number generator used in the generation of the random forces. ---------- @@ -217,15 +218,16 @@ error. ---------- The *friction* keyword sets the friction parameter :math:`\alpha` in the -equations of movement of the barostat. For each barostat, the value of +equations of motion of the barostat. For each barostat direction, the value of :math:`\alpha` depends on both *Pdamp* and *friction*. The value given as a -parameter is the Langevin characteristic time :math:`\tau_{L} -=\frac{Q}{\alpha}` in time units. The langevin time can be understood as a -decorrelation time for the pressure. A long langevin time value will make the +parameter is the Langevin characteristic time +:math:`\tau_{L}=\frac{Q}{\alpha}` in time units. The langevin time can be understood as a +decorrelation time for the pressure. A long Langevin time value will make the barostat act as an underdamped oscillator while a short value will make it act as an overdamped oscillator. The ideal configuration would be to find -the critical parameter of the barostat. Such a value is empirically found -so that :math:`\tau_{L}\approx{}P_{damp}/2.`. +the critical parameter of the barostat. Empirically this is observed to +occur for :math:`\tau_{L}\approx{}P_{damp}`. For this reason, if the *friction* +keyword is not used, the default value *Pdamp* is used for each barostat direction. ---------- @@ -270,7 +272,7 @@ This fix can ramp its target pressure and temperature over multiple runs, using the *start* and *stop* keywords of the :doc:`run ` command. See the :doc:`run ` command for details of how to do this. It is recommended that the ramped temperature is the same as the effective temperature of the -thermalised system. That is, if the system's temperature is ramped by other +thermostatted system. That is, if the system's temperature is ramped by other commands, it is recommended to do the same with this pressure control. This fix is not invoked during :doc:`energy minimization `. @@ -290,11 +292,10 @@ Related commands Default """"""" -The keyword defaults are dilate = all and mass = 0.001 in units of mass for -whatever :doc:`units ` defined. +The keyword defaults are *dilate* = all, *flip* = yes, and *friction* = *Pdamp*. ---------- -.. _Grønbech: +.. _Gronbech: -**(Grønbech)** Grønbech-Jensen, Farago, J Chem Phys, 141, 194108 (2014). +**(Gronbech)** Gronbech-Jensen, Farago, J Chem Phys, 141, 194108 (2014). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 8f3486b1a7..75589e3115 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2892,6 +2892,7 @@ pscrozi pseudocode Pseudocode pseudodynamics +pseudoparticle pseudopotential psllod pSp @@ -3755,6 +3756,7 @@ uncomment uncommented uncompress uncompute +underdamped underprediction undump uniaxial From 090f12e029ee9e3491a7cf64f8654eebd7c8ed1a Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Fri, 6 Oct 2023 17:03:41 -0600 Subject: [PATCH 164/417] Minor edits, mainly affecting friction keyword --- src/fix_press_langevin.cpp | 94 +++++++++++++++++++------------------- src/fix_press_langevin.h | 3 +- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 41ca69f78a..301eb95f6b 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -54,7 +54,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Langevin barostat applied every step // For details on the equations of motion see: - // Grønbech-Jensen & Farago J. Chem. Phys. 141 194108 (2014) + // Gronbech-Jensen & Farago J. Chem. Phys. 141 194108 (2014) nevery = 1; @@ -65,28 +65,33 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : pre_exchange_flag = 0; flipflag = 1; - p_ltime = 1000.; - p_fric = 1./p_ltime; + p_ltime = 0.0; - // Target temperature + // target temperature + t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - // Pressure and pistons period + + // pressure and pistons period + p_start[i] = p_stop[i] = p_period[i] = 0.0; p_flag[i] = 0; p_alpha[i] = 0; p_mass[i] = 0.; - // Pistons coordinates derivative V + // pistons coordinates derivative V + p_deriv[i] = 0.0; // a and b values for each piston + gjfa[i] = 0.0; gjfb[i] = 0.0; - // Random value for each piston + // random value for each piston + fran[i] = 0.0; f_piston[i] = 0.0; dilation[i] = 0.0; @@ -220,7 +225,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) error->all(FLERR,"Illegal fix press/langevin command"); p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_ltime < 0.0) + if (p_ltime <= 0.0) error->all(FLERR,"Illegal fix press/langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { @@ -327,7 +332,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; - // pre_exchange only required if flips can occur due to shape changes + // pre_exchange only required if flips can occur due to shape changes if (flipflag && (p_flag[3] || p_flag[4] || p_flag[5])) pre_exchange_flag = pre_exchange_migrate = 1; @@ -338,25 +343,12 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (pre_exchange_flag) irregular = new Irregular(lmp); else irregular = nullptr; - // C1 // Langevin GJF dynamics does NOT need a temperature compute // This is stated explicitely in their paper. // The temperature used for the pressure is NkT/V on purpose. - // id = fix-ID + temp - // compute group = all since pressure is always global (group all) - // and thus its KE/temperature contribution should use group all - - // id_temp = utils::strdup(std::string(id) + "_temp"); - // modify->add_compute(fmt::format("{} all temp",id_temp)); - // tflag = 1; - - // C2 - // Following C1, the compute must use the virial pressure + // For this reason, the compute must use the virial pressure // Kinetic contribution will be added by the fix style - // create a new compute pressure style - // id = fix-ID + press, compute group = all - // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); @@ -365,17 +357,19 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // p_fric is alpha coeff from GJF // with alpha = Q/p_period // similar to fix_langevin formalism + double kt = force->boltz * t_start; double nkt = (atom->natoms + 1) * kt; - if (p_ltime == 0) { - p_fric = 0; - } else { - p_fric = 1./p_ltime; + for (int i = 0; i < 6; i++) { + if (p_ltime > 0.0) p_fric[i] = p_ltime; + else p_fric[i] = p_period[i]; } + for (int i = 0; i < 6; i++) { p_mass[i] = nkt*p_period[i]*p_period[i]; - p_alpha[i] = p_mass[i] * p_fric; - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + p_alpha[i] = p_mass[i] * p_fric[i]; + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); } @@ -431,7 +425,8 @@ void FixPressLangevin::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) - error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); + error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", + id_press); // Kspace setting @@ -485,7 +480,8 @@ void FixPressLangevin::initial_integrate(int /* vflag */) double displacement; double delta = update->ntimestep - update->beginstep; - // Compute new random term on pistons dynamics + // compute new random term on pistons dynamics + if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop-t_start); couple_beta(t_target); @@ -509,6 +505,7 @@ void FixPressLangevin::post_integrate() { // remap simulation box and atoms // redo KSpace coeffs since volume has changed + remap(); if (kspace_flag) force->kspace->setup(); @@ -522,7 +519,8 @@ void FixPressLangevin::post_force(int /*vflag*/) double delta = update->ntimestep - update->beginstep; if (delta != 0.0) delta /= update->endstep - update->beginstep; - // Compute current pressure tensor and add kinetic term + // compute current pressure tensor and add kinetic term + if (pstyle == ISO) { pressure->compute_scalar(); } else { @@ -600,19 +598,20 @@ void FixPressLangevin::couple_pressure() void FixPressLangevin::couple_kinetic(double t_target) { - double Pk, volume; + double pk, volume; nktv2p = force->nktv2p; - // Kinetic part + // kinetic part + if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; else volume = domain->xprd * domain->yprd; - Pk = atom->natoms*force->boltz*t_target/volume; - Pk *= nktv2p; + pk = atom->natoms*force->boltz*t_target/volume; + pk *= nktv2p; - p_current[0] += Pk; - p_current[1] += Pk; - if (dimension == 3) p_current[2] += Pk; + p_current[0] += pk; + p_current[1] += pk; + if (dimension == 3) p_current[2] += pk; } /* ---------------------------------------------------------------------- */ @@ -622,8 +621,8 @@ void FixPressLangevin::couple_beta(double t_target) double gamma[6]; int me = comm->me; - for (int i=0; i<6; i++) - gamma[i] = sqrt(2.0*p_fric*force->boltz*update->dt*t_target); + for (int i = 0; i < 6; i++) + gamma[i] = sqrt(2.0*p_fric[i]*force->boltz*update->dt*t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; @@ -816,9 +815,11 @@ int FixPressLangevin::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (pressure) error->all(FLERR,"Could not find fix_modify pressure compute ID: {}", arg[1]); + if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", + arg[1]); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure compute {} does not compute pressure", arg[1]); + error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", + arg[1]); return 2; } return 0; @@ -828,8 +829,9 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { - for (int i=0; i<6; i++) { - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + for (int i = 0; i < 6; i++) { + gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); - } + } } diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index 7d0b27c834..c923efed25 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -41,12 +41,11 @@ class FixPressLangevin : public Fix { protected: int dimension, which; - int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not double nktv2p; double t_start, t_stop, t_target; - double p_fric, p_ltime; // Friction and Langevin charac. time + double p_fric[6], p_ltime; // Friction and Langevin charac. time double p_alpha[6]; double p_start[6], p_stop[6], p_period[6]; double p_mass[6], p_target[6], p_current[6]; From 578c95fb4277b3f79b58cf0717d4069d29df12dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:01:13 -0400 Subject: [PATCH 165/417] modernize access to list of fixes and their properties --- src/fix_press_langevin.cpp | 30 +++++++++++++++--------------- src/fix_press_langevin.h | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 301eb95f6b..6670caad90 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -411,14 +411,14 @@ void FixPressLangevin::init() { // ensure no conflict with fix deform - for (const auto &ifix : modify->get_fix_list()) - if (strcmp(ifix->style, "^deform") == 0) { - int *dimflag = static_cast(ifix)->dimflag; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || - (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) - error->all(FLERR,"Cannot use fix press/langevin and " - "fix deform on same component of stress tensor"); + for (const auto &ifix : modify->get_fix_by_style("^deform")) { + int *dimflag = static_cast(ifix)->dimflag; + if (!dimflag) continue; + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || + (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || + (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) + error->all(FLERR, + "Cannot use fix press/langevin and fix deform on same component of stress tensor"); } // set pressure ptr @@ -440,13 +440,13 @@ void FixPressLangevin::init() nrigid = 0; rfix = nullptr; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; + for (const auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) nrigid++; if (nrigid > 0) { - rfix = new int[nrigid]; + rfix = new Fix*[nrigid]; nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix[nrigid++] = ifix; } // Nullifies piston derivatives and forces so that it is not integrated at @@ -678,7 +678,7 @@ void FixPressLangevin::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + rfix[i]->deform(0); // reset global and local box to new size/shape @@ -719,7 +719,7 @@ void FixPressLangevin::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + rfix[i]->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index c923efed25..20ce76170b 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -54,7 +54,7 @@ class FixPressLangevin : public Fix { double gjfa[6], gjfb[6], fran[6]; int kspace_flag; // 1 if KSpace invoked, 0 if not int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + class Fix **rfix; // list of rigid fixes char *id_temp, *id_press; class Compute *temperature, *pressure; From 3b029796454b39d559cebaed2e598f32d313ed6d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:01:33 -0400 Subject: [PATCH 166/417] improve error messages --- src/fix_press_langevin.cpp | 83 ++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 49 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 6670caad90..dec3ca7a05 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -50,7 +50,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) { - if (narg < 5) error->all(FLERR,"Illegal fix press/langevin command"); + if (narg < 5) utils::missing_cmd_args(FLERR, "fix press/langevin", error); // Langevin barostat applied every step // For details on the equations of motion see: @@ -105,8 +105,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin iso", error); pcouple = XYZ; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -118,8 +117,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin aniso", error); pcouple = NONE; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -131,8 +129,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; } else if (strcmp(arg[iarg],"tri") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); pcouple = NONE; p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); @@ -153,6 +150,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; } else if (strcmp(arg[iarg],"x") == 0) { + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); if (iarg+4 > narg) error->all(FLERR,"Illegal fix press/langevin command"); p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); @@ -161,43 +159,43 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_flag[0] = 1; iarg += 4; } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin y", error); p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[1] = 1; iarg += 4; } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin z", error); p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[2] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + error->all(FLERR,"Fix press/langevin z option not allowed for a 2d simulation"); } else if (strcmp(arg[iarg],"xy") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} yz", style), error); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin yz", error); p_start[3] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[3] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[3] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[3] = 1; iarg += 4; - if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + if (dimension == 2) + error->all(FLERR,"Fix press/langevin yz option not allowed for a 2d simulation"); } else if (strcmp(arg[iarg],"xz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xz", style), error); - p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xz", error); + p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[4] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[4] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[4] = 1; iarg += 4; - if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + if (dimension == 2) + error->all(FLERR,"Fix press/langevin zz option not allowed for a 2d simulation"); } else if (strcmp(arg[iarg],"yz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} xy", style), error); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xy", error); p_start[5] = utils::numeric(FLERR,arg[iarg+1],false,lmp); p_stop[5] = utils::numeric(FLERR,arg[iarg+2],false,lmp); p_period[5] = utils::numeric(FLERR,arg[iarg+3],false,lmp); @@ -206,47 +204,41 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); } else if (strcmp(arg[iarg],"flip") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} flip", style), error); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin flip", error); flipflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin couple", error); if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Illegal fix press/langevin command"); + else error->all(FLERR,"Unknown fix press/langevin couple option: {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"friction") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin friction", error); p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_ltime <= 0.0) - error->all(FLERR,"Illegal fix press/langevin command"); + if (p_ltime <= 0.0) error->all(FLERR,"Fix press/langevin friction value must be > 0"); iarg += 2; } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin dilate", error); if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; - else error->all(FLERR,"Illegal fix press/langevin command"); + else error->all(FLERR,"Unknown fix press/langevin dilate option: {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg], "temp") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin temp", error); t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); seed = utils::numeric(FLERR,arg[iarg+3],false,lmp); - if (seed <= 0.0) - error->all(FLERR,"Illegal fix press/langevin command"); + if (seed <= 0.0) error->all(FLERR,"Fix press/langevin temp seed must be > 0"); iarg += 4; } - else error->all(FLERR,"Illegal fix press/langevin command"); + else error->all(FLERR,"Unknown fix press/langevin keyword: {}", arg[iarg]); } if (allremap == 0) restart_pbc = 1; @@ -272,14 +264,11 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Invalid fix press/langevin pressure settings"); if (p_flag[0] && domain->xperiodic == 0) - error->all(FLERR, - "Cannot use fix press/langevin on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); if (p_flag[1] && domain->yperiodic == 0) - error->all(FLERR, - "Cannot use fix press/langevin on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); if (p_flag[2] && domain->zperiodic == 0) - error->all(FLERR, - "Cannot use fix press/langevin on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); // require periodicity in 2nd dim of off-diagonal tilt component @@ -336,8 +325,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (flipflag && (p_flag[3] || p_flag[4] || p_flag[5])) pre_exchange_flag = pre_exchange_migrate = 1; - if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || - domain->xy != 0.0)) + if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || domain->xy != 0.0)) pre_exchange_flag = pre_exchange_migrate = 1; if (pre_exchange_flag) irregular = new Irregular(lmp); @@ -425,8 +413,7 @@ void FixPressLangevin::init() pressure = modify->get_compute_by_id(id_press); if (!pressure) - error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", - id_press); + error->all(FLERR, "Pressure compute ID {} for fix press/langevin does not exist", id_press); // Kspace setting @@ -806,7 +793,7 @@ void FixPressLangevin::pre_exchange() int FixPressLangevin::modify_param(int narg, char **arg) { if (strcmp(arg[0],"press") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) utils::missing_cmd_args(FLERR,"fix_modify press", error); if (pflag) { modify->delete_compute(id_press); pflag = 0; @@ -815,11 +802,9 @@ int FixPressLangevin::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", - arg[1]); + if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); if (pressure->pressflag == 0) - error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", - arg[1]); + error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", arg[1]); return 2; } return 0; From 5649381f01d517710bb5473f2bdeb5a7a125453b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:03:18 -0400 Subject: [PATCH 167/417] enable and apply clang-format --- src/fix_press_langevin.cpp | 421 +++++++++++++++++++------------------ src/fix_press_langevin.h | 8 +- 2 files changed, 216 insertions(+), 213 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index dec3ca7a05..d275799430 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -41,14 +40,13 @@ using namespace FixConst; #define DELTAFLIP 0.1 #define TILTMAX 1.5 -enum{NONE,XYZ,XY,YZ,XZ}; -enum{ISO,ANISO,TRICLINIC}; +enum { NONE, XYZ, XY, YZ, XZ }; +enum { ISO, ANISO, TRICLINIC }; /* ---------------------------------------------------------------------- */ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) + Fix(lmp, narg, arg), id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) { if (narg < 5) utils::missing_cmd_args(FLERR, "fix press/langevin", error); @@ -68,11 +66,11 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_ltime = 0.0; // target temperature - + t_start = t_stop = t_target = 0.0; for (int i = 0; i < 6; i++) { - + // pressure and pistons period p_start[i] = p_stop[i] = p_period[i] = 0.0; @@ -82,16 +80,16 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_mass[i] = 0.; // pistons coordinates derivative V - + p_deriv[i] = 0.0; // a and b values for each piston - + gjfa[i] = 0.0; gjfb[i] = 0.0; // random value for each piston - + fran[i] = 0.0; f_piston[i] = 0.0; dilation[i] = 0.0; @@ -104,41 +102,40 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : int iarg = 3; while (iarg < narg) { - if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin iso", error); + if (strcmp(arg[iarg], "iso") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin iso", error); pcouple = XYZ; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin aniso", error); + } else if (strcmp(arg[iarg], "aniso") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin aniso", error); pcouple = NONE; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"tri") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); + } else if (strcmp(arg[iarg], "tri") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); pcouple = NONE; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; p_start[3] = p_start[4] = p_start[5] = 0.0; p_stop[3] = p_stop[4] = p_stop[5] = 0.0; - p_period[3] = p_period[4] = p_period[5] = - utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_period[3] = p_period[4] = p_period[5] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[3] = p_flag[4] = p_flag[5] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; @@ -149,96 +146,105 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : p_flag[4] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"x") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/langevin command"); - p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "x") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin tri", error); + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/langevin command"); + p_start[0] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin y", error); - p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "y") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin y", error); + p_start[1] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[1] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[1] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[1] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin z", error); - p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "z") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin z", error); + p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[2] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Fix press/langevin z option not allowed for a 2d simulation"); - } else if (strcmp(arg[iarg],"xy") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin yz", error); - p_start[3] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[3] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[3] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + error->all(FLERR, "Fix press/langevin z option not allowed for a 2d simulation"); + } else if (strcmp(arg[iarg], "xy") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin yz", error); + p_start[3] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[3] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[3] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[3] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Fix press/langevin yz option not allowed for a 2d simulation"); + error->all(FLERR, "Fix press/langevin yz option not allowed for a 2d simulation"); - } else if (strcmp(arg[iarg],"xz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xz", error); - p_start[4] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[4] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[4] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "xz") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xz", error); + p_start[4] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[4] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[4] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[4] = 1; iarg += 4; if (dimension == 2) - error->all(FLERR,"Fix press/langevin zz option not allowed for a 2d simulation"); + error->all(FLERR, "Fix press/langevin zz option not allowed for a 2d simulation"); - } else if (strcmp(arg[iarg],"yz") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xy", error); - p_start[5] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[5] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[5] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "yz") == 0) { + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin xy", error); + p_start[5] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[5] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[5] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[5] = 1; iarg += 4; - if (dimension == 2) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); + if (dimension == 2) error->all(FLERR, "Invalid fix {} command for a 2d simulation", style); - } else if (strcmp(arg[iarg],"flip") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin flip", error); - flipflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "flip") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin flip", error); + flipflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin couple", error); - if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; - else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; - else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; - else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; - else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Unknown fix press/langevin couple option: {}", arg[iarg+1]); + } else if (strcmp(arg[iarg], "couple") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin couple", error); + if (strcmp(arg[iarg + 1], "xyz") == 0) + pcouple = XYZ; + else if (strcmp(arg[iarg + 1], "xy") == 0) + pcouple = XY; + else if (strcmp(arg[iarg + 1], "yz") == 0) + pcouple = YZ; + else if (strcmp(arg[iarg + 1], "xz") == 0) + pcouple = XZ; + else if (strcmp(arg[iarg + 1], "none") == 0) + pcouple = NONE; + else + error->all(FLERR, "Unknown fix press/langevin couple option: {}", arg[iarg + 1]); iarg += 2; - } else if (strcmp(arg[iarg],"friction") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin friction", error); - p_ltime = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (p_ltime <= 0.0) error->all(FLERR,"Fix press/langevin friction value must be > 0"); + } else if (strcmp(arg[iarg], "friction") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin friction", error); + p_ltime = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + if (p_ltime <= 0.0) error->all(FLERR, "Fix press/langevin friction value must be > 0"); iarg += 2; - } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin dilate", error); - if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; - else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; - else error->all(FLERR,"Unknown fix press/langevin dilate option: {}", arg[iarg+1]); + } else if (strcmp(arg[iarg], "dilate") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin dilate", error); + if (strcmp(arg[iarg + 1], "all") == 0) + allremap = 1; + else if (strcmp(arg[iarg + 1], "partial") == 0) + allremap = 0; + else + error->all(FLERR, "Unknown fix press/langevin dilate option: {}", arg[iarg + 1]); iarg += 2; } else if (strcmp(arg[iarg], "temp") == 0) { - if (iarg+4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin temp", error); - t_start = utils::numeric(FLERR,arg[iarg+1],false,lmp); - t_stop = utils::numeric(FLERR,arg[iarg+2],false,lmp); - seed = utils::numeric(FLERR,arg[iarg+3],false,lmp); - if (seed <= 0.0) error->all(FLERR,"Fix press/langevin temp seed must be > 0"); + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "fix press/langevin temp", error); + t_start = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + t_stop = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + seed = utils::numeric(FLERR, arg[iarg + 3], false, lmp); + if (seed <= 0.0) error->all(FLERR, "Fix press/langevin temp seed must be > 0"); iarg += 4; } - else error->all(FLERR,"Unknown fix press/langevin keyword: {}", arg[iarg]); + else + error->all(FLERR, "Unknown fix press/langevin keyword: {}", arg[iarg]); } if (allremap == 0) restart_pbc = 1; @@ -248,20 +254,20 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // error checks if (dimension == 2 && p_flag[2]) - error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + error->all(FLERR, "Invalid fix press/langevin for a 2d simulation"); if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) - error->all(FLERR,"Invalid fix press/langevin for a 2d simulation"); + error->all(FLERR, "Invalid fix press/langevin for a 2d simulation"); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (p_flag[0] && domain->xperiodic == 0) error->all(FLERR, "Cannot use fix press/langevin on a non-periodic dimension"); @@ -279,47 +285,42 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (p_flag[5] && domain->yperiodic == 0) error->all(FLERR, "Cannot use fix {} on a 2nd non-periodic dimension", style); if (!domain->triclinic && (p_flag[3] || p_flag[4] || p_flag[5])) - error->all(FLERR,"Can not specify Pxy/Pxz/Pyz in fix {} with non-triclinic box", style); + error->all(FLERR, "Can not specify Pxy/Pxz/Pyz in fix {} with non-triclinic box", style); if (pcouple == XYZ && dimension == 3 && - (p_start[0] != p_start[1] || p_start[0] != p_start[2] || - p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[1] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || + p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XYZ && dimension == 2 && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XY && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == YZ && - (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || - p_period[1] != p_period[2])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || p_period[1] != p_period[2])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (pcouple == XZ && - (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/langevin pressure settings"); + (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/langevin pressure settings"); if (t_start < 0.0 || t_stop < 0.0) - error->all(FLERR,"Fix press/langevin temperature parameters must be >= 0.0"); + error->all(FLERR, "Fix press/langevin temperature parameters must be >= 0.0"); - if ((p_flag[0] && p_period[0] <= 0.0) || - (p_flag[1] && p_period[1] <= 0.0) || - (p_flag[2] && p_period[2] <= 0.0) || - (p_flag[3] && p_period[3] <= 0.0) || - (p_flag[4] && p_period[4] <= 0.0) || - (p_flag[5] && p_period[5] <= 0.0)) - error->all(FLERR,"Fix press/langevin damping parameters must be > 0.0"); + if ((p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || + (p_flag[2] && p_period[2] <= 0.0) || (p_flag[3] && p_period[3] <= 0.0) || + (p_flag[4] && p_period[4] <= 0.0) || (p_flag[5] && p_period[5] <= 0.0)) + error->all(FLERR, "Fix press/langevin damping parameters must be > 0.0"); // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof - if (p_flag[3] || p_flag[4] || p_flag[5]) pstyle = TRICLINIC; - else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; - else pstyle = ANISO; + if (p_flag[3] || p_flag[4] || p_flag[5]) + pstyle = TRICLINIC; + else if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) + pstyle = ISO; + else + pstyle = ANISO; // pre_exchange only required if flips can occur due to shape changes @@ -328,8 +329,10 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : if (flipflag && (domain->yz != 0.0 || domain->xz != 0.0 || domain->xy != 0.0)) pre_exchange_flag = pre_exchange_migrate = 1; - if (pre_exchange_flag) irregular = new Irregular(lmp); - else irregular = nullptr; + if (pre_exchange_flag) + irregular = new Irregular(lmp); + else + irregular = nullptr; // Langevin GJF dynamics does NOT need a temperature compute // This is stated explicitely in their paper. @@ -349,16 +352,18 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : double kt = force->boltz * t_start; double nkt = (atom->natoms + 1) * kt; for (int i = 0; i < 6; i++) { - if (p_ltime > 0.0) p_fric[i] = p_ltime; - else p_fric[i] = p_period[i]; + if (p_ltime > 0.0) + p_fric[i] = p_ltime; + else + p_fric[i] = p_period[i]; } for (int i = 0; i < 6; i++) { - p_mass[i] = nkt*p_period[i]*p_period[i]; + p_mass[i] = nkt * p_period[i] * p_period[i]; p_alpha[i] = p_mass[i] * p_fric[i]; - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / - (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); - gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfa[i] = (1.0 - p_alpha[i] * update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1. / (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); } nrigid = 0; @@ -373,7 +378,6 @@ FixPressLangevin::~FixPressLangevin() delete[] rfix; delete irregular; - // delete temperature and pressure if fix created them if (pflag) modify->delete_compute(id_press); @@ -402,12 +406,11 @@ void FixPressLangevin::init() for (const auto &ifix : modify->get_fix_by_style("^deform")) { int *dimflag = static_cast(ifix)->dimflag; if (!dimflag) continue; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || - (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2]) || + (p_flag[3] && dimflag[3]) || (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) error->all(FLERR, "Cannot use fix press/langevin and fix deform on same component of stress tensor"); - } + } // set pressure ptr @@ -417,8 +420,10 @@ void FixPressLangevin::init() // Kspace setting - if (force->kspace) kspace_flag = 1; - else kspace_flag = 0; + if (force->kspace) + kspace_flag = 1; + else + kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped // rfix[] = indices to each fix rigid @@ -430,7 +435,7 @@ void FixPressLangevin::init() for (const auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) nrigid++; if (nrigid > 0) { - rfix = new Fix*[nrigid]; + rfix = new Fix *[nrigid]; nrigid = 0; for (auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) rfix[nrigid++] = ifix; @@ -442,7 +447,6 @@ void FixPressLangevin::init() p_deriv[i] = 0.0; dilation[i] = 0.0; } - } /* ---------------------------------------------------------------------- @@ -453,7 +457,7 @@ void FixPressLangevin::setup(int /*vflag*/) { // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -470,7 +474,7 @@ void FixPressLangevin::initial_integrate(int /* vflag */) // compute new random term on pistons dynamics if (delta != 0.0) delta /= update->endstep - update->beginstep; - t_target = t_start + delta * (t_stop-t_start); + t_target = t_start + delta * (t_stop - t_start); couple_beta(t_target); dt = update->dt; @@ -478,12 +482,14 @@ void FixPressLangevin::initial_integrate(int /* vflag */) for (int i = 0; i < 6; i++) { if (p_flag[i]) { // See equation 13 - displacement = dt*p_deriv[i]*gjfb[i]; - displacement += 0.5*dt*dt*f_piston[i]*gjfb[i]/p_mass[i]; - displacement += 0.5*dt*fran[i]*gjfb[i]/p_mass[i]; + displacement = dt * p_deriv[i] * gjfb[i]; + displacement += 0.5 * dt * dt * f_piston[i] * gjfb[i] / p_mass[i]; + displacement += 0.5 * dt * fran[i] * gjfb[i] / p_mass[i]; dl = domain->boxhi[i] - domain->boxlo[i]; - if (i < 3) dilation[i] = (dl + displacement)/dl; - else dilation[i] = displacement; + if (i < 3) + dilation[i] = (dl + displacement) / dl; + else + dilation[i] = displacement; } } } @@ -495,7 +501,6 @@ void FixPressLangevin::post_integrate() remap(); if (kspace_flag) force->kspace->setup(); - } /* ---------------------------------------------------------------------- */ @@ -507,7 +512,7 @@ void FixPressLangevin::post_force(int /*vflag*/) if (delta != 0.0) delta /= update->endstep - update->beginstep; // compute current pressure tensor and add kinetic term - + if (pstyle == ISO) { pressure->compute_scalar(); } else { @@ -520,14 +525,14 @@ void FixPressLangevin::post_force(int /*vflag*/) for (int i = 0; i < 6; i++) { if (p_flag[i]) { f_old_piston[i] = f_piston[i]; - p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); + p_target[i] = p_start[i] + delta * (p_stop[i] - p_start[i]); f_piston[i] = p_current[i] - p_target[i]; } } // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -542,11 +547,10 @@ void FixPressLangevin::end_of_step() for (int i = 0; i < 6; i++) { if (p_flag[i]) { p_deriv[i] *= gjfa[i]; - p_deriv[i] += 0.5*dt*(gjfa[i]*f_old_piston[i]+f_piston[i])/p_mass[i]; - p_deriv[i] += fran[i]*gjfb[i]/p_mass[i]; + p_deriv[i] += 0.5 * dt * (gjfa[i] * f_old_piston[i] + f_piston[i]) / p_mass[i]; + p_deriv[i] += fran[i] * gjfb[i] / p_mass[i]; } } - } /* ---------------------------------------------------------------------- */ @@ -558,7 +562,7 @@ void FixPressLangevin::couple_pressure() if (pstyle == ISO) p_current[0] = p_current[1] = p_current[2] = pressure->scalar; else if (pcouple == XYZ) { - double ave = 1.0/3.0 * (tensor[0] + tensor[1] + tensor[2]); + double ave = 1.0 / 3.0 * (tensor[0] + tensor[1] + tensor[2]); p_current[0] = p_current[1] = p_current[2] = ave; } else if (pcouple == XY) { double ave = 0.5 * (tensor[0] + tensor[1]); @@ -577,9 +581,9 @@ void FixPressLangevin::couple_pressure() p_current[1] = tensor[1]; p_current[2] = tensor[2]; } - p_current[3] = tensor[3]; - p_current[4] = tensor[4]; - p_current[5] = tensor[5]; + p_current[3] = tensor[3]; + p_current[4] = tensor[4]; + p_current[5] = tensor[5]; } /* ---------------------------------------------------------------------- */ @@ -589,11 +593,13 @@ void FixPressLangevin::couple_kinetic(double t_target) nktv2p = force->nktv2p; // kinetic part - - if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd; - else volume = domain->xprd * domain->yprd; - pk = atom->natoms*force->boltz*t_target/volume; + if (dimension == 3) + volume = domain->xprd * domain->yprd * domain->zprd; + else + volume = domain->xprd * domain->yprd; + + pk = atom->natoms * force->boltz * t_target / volume; pk *= nktv2p; p_current[0] += pk; @@ -609,32 +615,32 @@ void FixPressLangevin::couple_beta(double t_target) int me = comm->me; for (int i = 0; i < 6; i++) - gamma[i] = sqrt(2.0*p_fric[i]*force->boltz*update->dt*t_target); + gamma[i] = sqrt(2.0 * p_fric[i] * force->boltz * update->dt * t_target); fran[0] = fran[1] = fran[2] = 0.0; fran[3] = fran[4] = fran[5] = 0.0; if (me == 0) { if (pstyle == ISO) - fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0] * random->gaussian(); else if (pcouple == XYZ) { - fran[0] = fran[1] = fran[2] = gamma[0]*random->gaussian(); + fran[0] = fran[1] = fran[2] = gamma[0] * random->gaussian(); } else if (pcouple == XY) { - fran[0] = fran[1] = gamma[0]*random->gaussian(); - fran[2] = gamma[2]*random->gaussian(); + fran[0] = fran[1] = gamma[0] * random->gaussian(); + fran[2] = gamma[2] * random->gaussian(); } else if (pcouple == YZ) { - fran[1] = fran[2] = gamma[1]*random->gaussian(); - fran[0] = gamma[0]*random->gaussian(); + fran[1] = fran[2] = gamma[1] * random->gaussian(); + fran[0] = gamma[0] * random->gaussian(); } else if (pcouple == XZ) { - fran[0] = fran[2] = gamma[0]*random->gaussian(); - fran[1] = gamma[1]*random->gaussian(); + fran[0] = fran[2] = gamma[0] * random->gaussian(); + fran[1] = gamma[1] * random->gaussian(); } else { - fran[0] = gamma[0]*random->gaussian(); - fran[1] = gamma[1]*random->gaussian(); - fran[2] = gamma[2]*random->gaussian(); + fran[0] = gamma[0] * random->gaussian(); + fran[1] = gamma[1] * random->gaussian(); + fran[2] = gamma[2] * random->gaussian(); } - fran[3] = gamma[3]*random->gaussian(); - fran[4] = gamma[4]*random->gaussian(); - fran[5] = gamma[5]*random->gaussian(); + fran[3] = gamma[3] * random->gaussian(); + fran[4] = gamma[4] * random->gaussian(); + fran[5] = gamma[5] * random->gaussian(); } MPI_Bcast(&fran, 6, MPI_DOUBLE, 0, world); } @@ -648,7 +654,7 @@ void FixPressLangevin::couple_beta(double t_target) void FixPressLangevin::remap() { int i; - double oldlo,oldhi,ctr; + double oldlo, oldhi, ctr; double **x = atom->x; int *mask = atom->mask; @@ -656,16 +662,15 @@ void FixPressLangevin::remap() // convert pertinent atoms and rigid bodies to lamda coords - if (allremap) domain->x2lamda(nlocal); + if (allremap) + domain->x2lamda(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->x2lamda(x[i],x[i]); + if (mask[i] & groupbit) domain->x2lamda(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(0); + for (i = 0; i < nrigid; i++) rfix[i]->deform(0); // reset global and local box to new size/shape @@ -674,8 +679,8 @@ void FixPressLangevin::remap() oldlo = domain->boxlo[i]; oldhi = domain->boxhi[i]; ctr = 0.5 * (oldlo + oldhi); - domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; - domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + domain->boxlo[i] = (oldlo - ctr) * dilation[i] + ctr; + domain->boxhi[i] = (oldhi - ctr) * dilation[i] + ctr; } } @@ -683,30 +688,28 @@ void FixPressLangevin::remap() if (p_flag[4]) domain->xz += dilation[4]; if (p_flag[5]) domain->yz += dilation[5]; - if (domain->yz < -TILTMAX*domain->yprd || - domain->yz > TILTMAX*domain->yprd || - domain->xz < -TILTMAX*domain->xprd || - domain->xz > TILTMAX*domain->xprd || - domain->xy < -TILTMAX*domain->xprd || - domain->xy > TILTMAX*domain->xprd) - error->all(FLERR,"Fix {} has tilted box too far in one step - " - "periodic cell is too far from equilibrium state", style); + if (domain->yz < -TILTMAX * domain->yprd || domain->yz > TILTMAX * domain->yprd || + domain->xz < -TILTMAX * domain->xprd || domain->xz > TILTMAX * domain->xprd || + domain->xy < -TILTMAX * domain->xprd || domain->xy > TILTMAX * domain->xprd) + error->all(FLERR, + "Fix {} has tilted box too far in one step - " + "periodic cell is too far from equilibrium state", + style); domain->set_global_box(); domain->set_local_box(); // convert pertinent atoms and rigid bodies back to box coords - if (allremap) domain->lamda2x(nlocal); + if (allremap) + domain->lamda2x(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->lamda2x(x[i],x[i]); + if (mask[i] & groupbit) domain->lamda2x(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(1); + for (i = 0; i < nrigid; i++) rfix[i]->deform(1); } /* ---------------------------------------------------------------------- @@ -733,10 +736,10 @@ void FixPressLangevin::pre_exchange() // flip is only triggered when tilt exceeds 0.5 by DELTAFLIP // this avoids immediate re-flipping due to tilt oscillations - double xtiltmax = (0.5+DELTAFLIP)*xprd; - double ytiltmax = (0.5+DELTAFLIP)*yprd; + double xtiltmax = (0.5 + DELTAFLIP) * xprd; + double ytiltmax = (0.5 + DELTAFLIP) * yprd; - int flipxy,flipxz,flipyz; + int flipxy, flipxz, flipyz; flipxy = flipxz = flipyz = 0; if (domain->yperiodic) { @@ -775,12 +778,12 @@ void FixPressLangevin::pre_exchange() domain->set_global_box(); domain->set_local_box(); - domain->image_flip(flipxy,flipxz,flipyz); + domain->image_flip(flipxy, flipxz, flipyz); double **x = atom->x; imageint *image = atom->image; int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); + for (int i = 0; i < nlocal; i++) domain->remap(x[i], image[i]); domain->x2lamda(atom->nlocal); irregular->migrate_atoms(); @@ -792,8 +795,8 @@ void FixPressLangevin::pre_exchange() int FixPressLangevin::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"press") == 0) { - if (narg < 2) utils::missing_cmd_args(FLERR,"fix_modify press", error); + if (strcmp(arg[0], "press") == 0) { + if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify press", error); if (pflag) { modify->delete_compute(id_press); pflag = 0; @@ -815,8 +818,8 @@ int FixPressLangevin::modify_param(int narg, char **arg) void FixPressLangevin::reset_dt() { for (int i = 0; i < 6; i++) { - gjfa[i] = (1.0 - p_alpha[i]*update->dt / 2.0 / p_mass[i]) / - (1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); - gjfb[i] = 1./(1.0 + p_alpha[i]*update->dt / 2.0 / p_mass[i]); + gjfa[i] = (1.0 - p_alpha[i] * update->dt / 2.0 / p_mass[i]) / + (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); + gjfb[i] = 1. / (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); } } diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index 20ce76170b..fc9f39c434 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -45,7 +45,7 @@ class FixPressLangevin : public Fix { int p_flag[6]; // 1 if control P on this dim, 0 if not double nktv2p; double t_start, t_stop, t_target; - double p_fric[6], p_ltime; // Friction and Langevin charac. time + double p_fric[6], p_ltime; // Friction and Langevin charac. time double p_alpha[6]; double p_start[6], p_stop[6], p_period[6]; double p_mass[6], p_target[6], p_current[6]; @@ -61,15 +61,15 @@ class FixPressLangevin : public Fix { int pflag; int flipflag; - int pre_exchange_flag; // set if pre_exchange needed for box flips + int pre_exchange_flag; // set if pre_exchange needed for box flips class Irregular *irregular; // for migrating atoms after box flips class RanMars *random; int seed; void couple_pressure(); - void couple_kinetic(double ); - void couple_beta(double ); + void couple_kinetic(double); + void couple_beta(double); void remap(); }; From 6442763b7021ecafbd15d4db3a9a3af4ac7bdafe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:08:02 -0400 Subject: [PATCH 168/417] indicate that fix press/langevin changes box dimensions --- src/fix_press_langevin.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index d275799430..d8b90d8b49 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -312,6 +312,13 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : (p_flag[4] && p_period[4] <= 0.0) || (p_flag[5] && p_period[5] <= 0.0)) error->all(FLERR, "Fix press/langevin damping parameters must be > 0.0"); + if (p_flag[0]) box_change |= BOX_CHANGE_X; + if (p_flag[1]) box_change |= BOX_CHANGE_Y; + if (p_flag[2]) box_change |= BOX_CHANGE_Z; + if (p_flag[3]) box_change |= BOX_CHANGE_YZ; + if (p_flag[4]) box_change |= BOX_CHANGE_XZ; + if (p_flag[5]) box_change |= BOX_CHANGE_XY; + // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof From 8d305cb44fd93ba1a36a8d09c6b2521effef27dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:15:57 -0400 Subject: [PATCH 169/417] modernize access to list of fixes and fix properties also for fix press/berendsen --- src/fix_press_berendsen.cpp | 27 +++++++++++++-------------- src/fix_press_berendsen.h | 6 +++--- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index e27a4560f0..2f418dd102 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -269,14 +269,13 @@ void FixPressBerendsen::init() // ensure no conflict with fix deform - for (const auto &ifix : modify->get_fix_list()) - if (strcmp(ifix->style, "^deform") == 0) { - int *dimflag = static_cast(ifix)->dimflag; - if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || - (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix press/berendsen and " + for (const auto &ifix : modify->get_fix_by_style("^deform")) { + int *dimflag = static_cast(ifix)->dimflag; + if (!dimflag) continue; + if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) + error->all(FLERR,"Cannot use fix press/berendsen and " "fix deform on same component of stress tensor"); - } + } // set temperature and pressure ptrs @@ -303,13 +302,13 @@ void FixPressBerendsen::init() nrigid = 0; rfix = nullptr; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; + for (const auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) nrigid++; if (nrigid > 0) { - rfix = new int[nrigid]; + rfix = new Fix *[nrigid]; nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix[nrigid++] = ifix; } } @@ -418,7 +417,7 @@ void FixPressBerendsen::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + rfix[i]->deform(0); // reset global and local box to new size/shape @@ -446,7 +445,7 @@ void FixPressBerendsen::remap() if (nrigid) for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + rfix[i]->deform(1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_press_berendsen.h b/src/fix_press_berendsen.h index 85a4895901..9e83533746 100644 --- a/src/fix_press_berendsen.h +++ b/src/fix_press_berendsen.h @@ -44,9 +44,9 @@ class FixPressBerendsen : public Fix { double p_period[3], p_target[3]; double p_current[3], dilation[3]; double factor[3]; - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + int nrigid; // number of rigid fixes + class Fix **rfix; // indices of rigid fixes char *id_temp, *id_press; class Compute *temperature, *pressure; From 60ffcf74dc8eac22beb7effc4adc16ae53f6668c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 12:17:05 -0400 Subject: [PATCH 170/417] enable and apply clang-format to fix press/berendsen --- src/fix_press_berendsen.cpp | 264 +++++++++++++++++------------------- 1 file changed, 128 insertions(+), 136 deletions(-) diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index 2f418dd102..05e523abae 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -32,17 +31,16 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum{NOBIAS,BIAS}; -enum{NONE,XYZ,XY,YZ,XZ}; -enum{ISO,ANISO}; +enum { NOBIAS, BIAS }; +enum { NONE, XYZ, XY, YZ, XZ }; +enum { ISO, ANISO }; /* ---------------------------------------------------------------------- */ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - id_temp(nullptr), id_press(nullptr), tflag(0), pflag(0) + Fix(lmp, narg, arg), id_temp(nullptr), id_press(nullptr), tflag(0), pflag(0) { - if (narg < 5) error->all(FLERR,"Illegal fix press/berendsen command"); + if (narg < 5) error->all(FLERR, "Illegal fix press/berendsen command"); // Berendsen barostat applied every step @@ -67,26 +65,24 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : int iarg = 3; while (iarg < narg) { - if (strcmp(arg[iarg],"iso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); + if (strcmp(arg[iarg], "iso") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); pcouple = XYZ; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } iarg += 4; - } else if (strcmp(arg[iarg],"aniso") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "aniso") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); pcouple = NONE; - p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + p_start[0] = p_start[1] = p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; if (dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; @@ -94,59 +90,61 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : } iarg += 4; - } else if (strcmp(arg[iarg],"x") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - p_start[0] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[0] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[0] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "x") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + p_start[0] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[0] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[0] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"y") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - p_start[1] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[1] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[1] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "y") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + p_start[1] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[1] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[1] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[1] = 1; iarg += 4; - } else if (strcmp(arg[iarg],"z") == 0) { - if (iarg+4 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - p_start[2] = utils::numeric(FLERR,arg[iarg+1],false,lmp); - p_stop[2] = utils::numeric(FLERR,arg[iarg+2],false,lmp); - p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); + } else if (strcmp(arg[iarg], "z") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + p_start[2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[2] = 1; iarg += 4; - if (dimension == 2) - error->all(FLERR,"Invalid fix press/berendsen for a 2d simulation"); + if (dimension == 2) error->all(FLERR, "Invalid fix press/berendsen for a 2d simulation"); - } else if (strcmp(arg[iarg],"couple") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ; - else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY; - else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ; - else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ; - else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE; - else error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "couple") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + if (strcmp(arg[iarg + 1], "xyz") == 0) + pcouple = XYZ; + else if (strcmp(arg[iarg + 1], "xy") == 0) + pcouple = XY; + else if (strcmp(arg[iarg + 1], "yz") == 0) + pcouple = YZ; + else if (strcmp(arg[iarg + 1], "xz") == 0) + pcouple = XZ; + else if (strcmp(arg[iarg + 1], "none") == 0) + pcouple = NONE; + else + error->all(FLERR, "Illegal fix press/berendsen command"); iarg += 2; - } else if (strcmp(arg[iarg],"modulus") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - bulkmodulus = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (bulkmodulus <= 0.0) - error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "modulus") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + bulkmodulus = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + if (bulkmodulus <= 0.0) error->all(FLERR, "Illegal fix press/berendsen command"); iarg += 2; - } else if (strcmp(arg[iarg],"dilate") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal fix press/berendsen command"); - if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; - else if (strcmp(arg[iarg+1],"partial") == 0) allremap = 0; - else error->all(FLERR,"Illegal fix press/berendsen command"); + } else if (strcmp(arg[iarg], "dilate") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix press/berendsen command"); + if (strcmp(arg[iarg + 1], "all") == 0) + allremap = 1; + else if (strcmp(arg[iarg + 1], "partial") == 0) + allremap = 0; + else + error->all(FLERR, "Illegal fix press/berendsen command"); iarg += 2; - } else error->all(FLERR,"Illegal fix press/berendsen command"); + } else + error->all(FLERR, "Illegal fix press/berendsen command"); } if (allremap == 0) restart_pbc = 1; @@ -154,57 +152,48 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // error checks if (dimension == 2 && p_flag[2]) - error->all(FLERR,"Invalid fix press/berendsen for a 2d simulation"); + error->all(FLERR, "Invalid fix press/berendsen for a 2d simulation"); if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) - error->all(FLERR,"Invalid fix press/berendsen for a 2d simulation"); + error->all(FLERR, "Invalid fix press/berendsen for a 2d simulation"); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (p_flag[0] && domain->xperiodic == 0) - error->all(FLERR, - "Cannot use fix press/berendsen on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/berendsen on a non-periodic dimension"); if (p_flag[1] && domain->yperiodic == 0) - error->all(FLERR, - "Cannot use fix press/berendsen on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/berendsen on a non-periodic dimension"); if (p_flag[2] && domain->zperiodic == 0) - error->all(FLERR, - "Cannot use fix press/berendsen on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix press/berendsen on a non-periodic dimension"); if (pcouple == XYZ && dimension == 3 && - (p_start[0] != p_start[1] || p_start[0] != p_start[2] || - p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[1] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || + p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XYZ && dimension == 2 && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XY && - (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || - p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == YZ && - (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || - p_period[1] != p_period[2])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || p_period[1] != p_period[2])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); if (pcouple == XZ && - (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || - p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix press/berendsen pressure settings"); + (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || p_period[0] != p_period[2])) + error->all(FLERR, "Invalid fix press/berendsen pressure settings"); - if ((p_flag[0] && p_period[0] <= 0.0) || - (p_flag[1] && p_period[1] <= 0.0) || + if ((p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || (p_flag[2] && p_period[2] <= 0.0)) - error->all(FLERR,"Fix press/berendsen damping parameters must be > 0.0"); + error->all(FLERR, "Fix press/berendsen damping parameters must be > 0.0"); if (p_flag[0]) box_change |= BOX_CHANGE_X; if (p_flag[1]) box_change |= BOX_CHANGE_Y; @@ -213,8 +202,10 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // pstyle = ISO if XYZ coupling or XY coupling in 2d -> 1 dof // else pstyle = ANISO -> 3 dof - if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; - else pstyle = ANISO; + if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) + pstyle = ISO; + else + pstyle = ANISO; // create a new compute temp style // id = fix-ID + temp @@ -222,7 +213,7 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // and thus its KE/temperature contribution should use group all id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} all temp",id_temp)); + modify->add_compute(fmt::format("{} all temp", id_temp)); tflag = 1; // create a new compute pressure style @@ -230,7 +221,7 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure {}",id_press, id_temp)); + modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pflag = 1; nrigid = 0; @@ -264,8 +255,7 @@ int FixPressBerendsen::setmask() void FixPressBerendsen::init() { - if (domain->triclinic) - error->all(FLERR,"Cannot use fix press/berendsen with triclinic box"); + if (domain->triclinic) error->all(FLERR, "Cannot use fix press/berendsen with triclinic box"); // ensure no conflict with fix deform @@ -273,8 +263,9 @@ void FixPressBerendsen::init() int *dimflag = static_cast(ifix)->dimflag; if (!dimflag) continue; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix press/berendsen and " - "fix deform on same component of stress tensor"); + error->all(FLERR, + "Cannot use fix press/berendsen and " + "fix deform on same component of stress tensor"); } // set temperature and pressure ptrs @@ -283,8 +274,10 @@ void FixPressBerendsen::init() if (!temperature) error->all(FLERR, "Temperature compute ID {} for fix press/berendsen does not exist", id_temp); - if (temperature->tempbias) which = BIAS; - else which = NOBIAS; + if (temperature->tempbias) + which = BIAS; + else + which = NOBIAS; pressure = modify->get_compute_by_id(id_press); if (!pressure) @@ -292,8 +285,10 @@ void FixPressBerendsen::init() // Kspace setting - if (force->kspace) kspace_flag = 1; - else kspace_flag = 0; + if (force->kspace) + kspace_flag = 1; + else + kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped // rfix[] = indices to each fix rigid @@ -320,7 +315,7 @@ void FixPressBerendsen::setup(int /*vflag*/) { // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -343,10 +338,9 @@ void FixPressBerendsen::end_of_step() for (int i = 0; i < 3; i++) { if (p_flag[i]) { - p_target[i] = p_start[i] + delta * (p_stop[i]-p_start[i]); - dilation[i] = - pow(1.0 - update->dt/p_period[i] * - (p_target[i]-p_current[i])/bulkmodulus,1.0/3.0); + p_target[i] = p_start[i] + delta * (p_stop[i] - p_start[i]); + dilation[i] = pow(1.0 - update->dt / p_period[i] * (p_target[i] - p_current[i]) / bulkmodulus, + 1.0 / 3.0); } } @@ -358,7 +352,7 @@ void FixPressBerendsen::end_of_step() // trigger virial computation on next timestep - pressure->addstep(update->ntimestep+1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -370,7 +364,7 @@ void FixPressBerendsen::couple() if (pstyle == ISO) p_current[0] = p_current[1] = p_current[2] = pressure->scalar; else if (pcouple == XYZ) { - double ave = 1.0/3.0 * (tensor[0] + tensor[1] + tensor[2]); + double ave = 1.0 / 3.0 * (tensor[0] + tensor[1] + tensor[2]); p_current[0] = p_current[1] = p_current[2] = ave; } else if (pcouple == XY) { double ave = 0.5 * (tensor[0] + tensor[1]); @@ -400,7 +394,7 @@ void FixPressBerendsen::couple() void FixPressBerendsen::remap() { int i; - double oldlo,oldhi,ctr; + double oldlo, oldhi, ctr; double **x = atom->x; int *mask = atom->mask; @@ -408,16 +402,15 @@ void FixPressBerendsen::remap() // convert pertinent atoms and rigid bodies to lamda coords - if (allremap) domain->x2lamda(nlocal); + if (allremap) + domain->x2lamda(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->x2lamda(x[i],x[i]); + if (mask[i] & groupbit) domain->x2lamda(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(0); + for (i = 0; i < nrigid; i++) rfix[i]->deform(0); // reset global and local box to new size/shape @@ -426,8 +419,8 @@ void FixPressBerendsen::remap() oldlo = domain->boxlo[i]; oldhi = domain->boxhi[i]; ctr = 0.5 * (oldlo + oldhi); - domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; - domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + domain->boxlo[i] = (oldlo - ctr) * dilation[i] + ctr; + domain->boxhi[i] = (oldhi - ctr) * dilation[i] + ctr; } } @@ -436,24 +429,23 @@ void FixPressBerendsen::remap() // convert pertinent atoms and rigid bodies back to box coords - if (allremap) domain->lamda2x(nlocal); + if (allremap) + domain->lamda2x(nlocal); else { for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - domain->lamda2x(x[i],x[i]); + if (mask[i] & groupbit) domain->lamda2x(x[i], x[i]); } if (nrigid) - for (i = 0; i < nrigid; i++) - rfix[i]->deform(1); + for (i = 0; i < nrigid; i++) rfix[i]->deform(1); } /* ---------------------------------------------------------------------- */ int FixPressBerendsen::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"temp") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (strcmp(arg[0], "temp") == 0) { + if (narg < 2) error->all(FLERR, "Illegal fix_modify command"); if (tflag) { modify->delete_compute(id_temp); tflag = 0; @@ -463,25 +455,25 @@ int FixPressBerendsen::modify_param(int narg, char **arg) temperature = modify->get_compute_by_id(arg[1]); if (!temperature) - error->all(FLERR,"Could not find fix_modify temperature compute ID: ", arg[1]); + error->all(FLERR, "Could not find fix_modify temperature compute ID: ", arg[1]); if (temperature->tempflag == 0) - error->all(FLERR,"Fix_modify temperature compute {} does not compute temperature", arg[1]); + error->all(FLERR, "Fix_modify temperature compute {} does not compute temperature", arg[1]); if (temperature->igroup != 0 && comm->me == 0) - error->warning(FLERR,"Temperature compute {} for fix {} is not for group all: {}", - arg[1], style, group->names[temperature->igroup]); + error->warning(FLERR, "Temperature compute {} for fix {} is not for group all: {}", arg[1], + style, group->names[temperature->igroup]); // reset id_temp of pressure to new temperature ID auto icompute = modify->get_compute_by_id(id_press); if (!icompute) - error->all(FLERR,"Pressure compute ID {} for fix {} does not exist", id_press, style); + error->all(FLERR, "Pressure compute ID {} for fix {} does not exist", id_press, style); icompute->reset_extra_compute_fix(id_temp); return 2; - } else if (strcmp(arg[0],"press") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + } else if (strcmp(arg[0], "press") == 0) { + if (narg < 2) error->all(FLERR, "Illegal fix_modify command"); if (pflag) { modify->delete_compute(id_press); pflag = 0; @@ -490,9 +482,9 @@ int FixPressBerendsen::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (!pressure) error->all(FLERR,"Could not find fix_modify pressure compute ID: {}", arg[1]); + if (!pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure compute {} does not compute pressure", arg[1]); + error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", arg[1]); return 2; } return 0; From 3e6997e98b75971077838f94fa5f5816dc47e504 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 13:33:43 -0400 Subject: [PATCH 171/417] restore saved text cursor when initializing system before creating an image --- tools/lammps-gui/lammpsgui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index c9d8b9bef0..afd9b99ed2 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1112,6 +1112,7 @@ void LammpsGui::render_image() "Cannot create snapshot image without a system box"); return; } + ui->textEdit->setTextCursor(saved); } // if configured, delete old image window before opening new one if (QSettings().value("imagereplace", true).toBool()) delete imagewindow; From d1f910af2c0e961fee9a9e4ddbb284e35f6f495c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 13:33:59 -0400 Subject: [PATCH 172/417] remove redundant close button --- tools/lammps-gui/imageviewer.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 445ff16590..5d16fe9876 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -143,11 +142,6 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge scrollArea->setWidget(imageLabel); scrollArea->setVisible(false); - buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - - connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); - connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - QVBoxLayout *mainLayout = new QVBoxLayout; QSettings settings; @@ -265,7 +259,6 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge mainLayout->addLayout(menuLayout); mainLayout->addWidget(scrollArea); - mainLayout->addWidget(buttonBox); setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); setWindowTitle(QString("Image Viewer: ") + QFileInfo(fileName).fileName()); createActions(); From 2d597f61b8a5bba2aa99d8908e75ad29c6739df1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Oct 2023 13:35:32 -0400 Subject: [PATCH 173/417] adjust default size of image area --- tools/lammps-gui/imageviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 5d16fe9876..85e9170ac6 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -274,7 +274,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge doanti->setChecked(antialias); scaleFactor = 1.0; - resize(image.width() + 20, image.height() + 50); + resize(image.width() + 20, image.height() + 75); scrollArea->setVisible(true); updateActions(); From 1390a92a5b7bbb70e4a89e7750843c3625bfdefe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:12:37 -0400 Subject: [PATCH 174/417] correct indexing bug with FSAA --- src/image.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/image.cpp b/src/image.cpp index 27079eee58..3133723b32 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -395,12 +395,12 @@ void Image::merge() if (fsaa) { for (int h=0; h < height; h += 2) { for (int w=0; w < width; w +=2) { - int idx1 = 3*height*h + 3*w; - int idx2 = 3*height*h + 3*(w+1); - int idx3 = 3*height*(h+1) + 3*w; - int idx4 = 3*height*(h+1) + 3*(w+1); + int idx1 = 3*width*h + 3*w; + int idx2 = 3*width*h + 3*(w+1); + int idx3 = 3*width*(h+1) + 3*w; + int idx4 = 3*width*(h+1) + 3*(w+1); - int out = 3*(height/2)*(h/2) + 3*(w/2); + int out = 3*(width/2)*(h/2) + 3*(w/2); for (int i=0; i < 3; ++i) { writeBuffer[out+i] = (unsigned char) (0.25*((int)writeBuffer[idx1+i] +(int)writeBuffer[idx2+i] From e5190a0ff9adcd0b59082ecc6bb84b0494bea3cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:14:04 -0400 Subject: [PATCH 175/417] more specific preferences label --- tools/lammps-gui/preferences.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index aa192e8c11..c760e6610b 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -205,7 +205,7 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa { auto *layout = new QVBoxLayout; - auto *echo = new QCheckBox("Echo input to log"); + auto *echo = new QCheckBox("Echo input to output buffer"); echo->setObjectName("echo"); echo->setCheckState(settings->value("echo", false).toBool() ? Qt::Checked : Qt::Unchecked); auto *cite = new QCheckBox("Include citation details"); From b2c52c5032238395d307227b7119ec9d5112099d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:23:07 -0400 Subject: [PATCH 176/417] use FSAA implementation of dump image instead of emulating it --- tools/lammps-gui/imageviewer.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 85e9170ac6..04d3f0a489 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -435,9 +435,6 @@ void ImageViewer::createImage() dumpcmd += "'" + dumpfile.fileName() + "'"; settings.beginGroup("snapshot"); - int aa = antialias ? 2 : 1; - int tmpxsize = xsize * aa; - int tmpysize = ysize * aa; int hhrot = (hrot > 180) ? 360 - hrot : hrot; // determine elements from masses and set their covalent radii @@ -473,9 +470,10 @@ void ImageViewer::createImage() else dumpcmd += blank + settings.value("color", "type").toString(); dumpcmd += blank + settings.value("diameter", "type").toString(); - dumpcmd += QString(" size ") + QString::number(tmpxsize) + blank + QString::number(tmpysize); - dumpcmd += QString(" zoom ") + QString::number(zoom); + dumpcmd += QString(" size %1 %2").arg(xsize).arg(ysize); + dumpcmd += QString(" zoom %1").arg(zoom); dumpcmd += " shiny 0.5 "; + dumpcmd += QString(" fsaa %1").arg(antialias ? "yes" : "no"); if (nbondtypes > 0) { if (vdwfactor > 1.0) dumpcmd += " bond none none "; @@ -483,16 +481,16 @@ void ImageViewer::createImage() dumpcmd += " bond atom 0.5 "; } if (lammps->extract_setting("dimension") == 3) { - dumpcmd += QString(" view ") + QString::number(hhrot) + blank + QString::number(vrot); + dumpcmd += QString(" view %1 %2").arg(hhrot).arg(vrot); } - if (usessao) dumpcmd += QString(" ssao yes 453983 0.75"); + if (usessao) dumpcmd += " ssao yes 453983 0.75"; if (showbox) - dumpcmd += QString(" box yes 0.025"); + dumpcmd += " box yes 0.025"; else - dumpcmd += QString(" box no 0.0"); + dumpcmd += " box no 0.0"; if (showaxes) - dumpcmd += QString(" axes yes 0.5 0.025"); + dumpcmd += " axes yes 0.5 0.025"; else dumpcmd += QString(" axes no 0.0 0.0"); @@ -512,7 +510,7 @@ void ImageViewer::createImage() if (newImage.isNull()) return; // scale back to achieve antialiasing - image = newImage.scaled(xsize, ysize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + image = newImage; imageLabel->setPixmap(QPixmap::fromImage(image)); imageLabel->adjustSize(); if (renderstatus) renderstatus->setEnabled(false); From 4eef20e80850916f6ea7e01f0ffca2d08bf7fc14 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 8 Oct 2023 19:26:08 -0400 Subject: [PATCH 177/417] make consistent --- tools/lammps-gui/imageviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 04d3f0a489..86be0b66df 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -492,7 +492,7 @@ void ImageViewer::createImage() if (showaxes) dumpcmd += " axes yes 0.5 0.025"; else - dumpcmd += QString(" axes no 0.0 0.0"); + dumpcmd += " axes no 0.0 0.0"; dumpcmd += " modify boxcolor " + settings.value("boxcolor", "yellow").toString(); dumpcmd += " backcolor " + settings.value("background", "black").toString(); From 1db12d7df5a63d7f0184da06c926be1728379d2e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Oct 2023 00:09:18 -0400 Subject: [PATCH 178/417] update LAMMPS GUI help summary text --- doc/src/Howto_lammps_gui.rst | 13 ++++++++----- doc/src/Tools.rst | 17 +++++++++++------ tools/lammps-gui/lammpsgui.cpp | 26 ++++++++++++++++---------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 4db8b532ce..165ed84d95 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -5,11 +5,14 @@ This document describes **LAMMPS GUI version 1.5**. ----- -LAMMPS GUI is a graphical text editor that is linked to the :ref:`LAMMPS -library ` and thus can run LAMMPS directly using the -contents of the editor's text buffer as input. It can retrieve and -display information from LAMMPS while it is running and is adapted in -multiple ways specifically for editing LAMMPS input files. +LAMMPS GUI is a graphical text editor customized for editing LAMMPS +input files that is linked to the :ref:`LAMMPS library ` +and thus can run LAMMPS directly using the contents of the editor's text +buffer as input. It can retrieve and display information from LAMMPS +while it is running, display visualizations created with the :doc:`dump +image command `, and is adapted specifically for editing +LAMMPS input files through text completion and reformatting, and linking +to the online LAMMPS documentation for known LAMMPS commands and styles. .. note:: diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 2e8bd3eac4..a42e7c56a5 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -645,9 +645,14 @@ LAMMPS GUI Overview ^^^^^^^^ -LAMMPS GUI is a simple graphical text editor that is linked to the -:ref:`LAMMPS C-library interface ` and thus can run LAMMPS -directly using the contents of the editor's text buffer as input. +LAMMPS GUI is a graphical text editor customized for editing LAMMPS +input files that is linked to the :ref:`LAMMPS C-library ` +and thus can run LAMMPS directly using the contents of the editor's text +buffer as input. It can retrieve and display information from LAMMPS +while it is running, display visualizations created with the :doc:`dump +image command `, and is adapted specifically for editing +LAMMPS input files through text completion and reformatting, and linking +to the online LAMMPS documentation for known LAMMPS commands and styles. This is similar to what people traditionally would do to run LAMMPS: using a regular text editor to edit the input and run the necessary @@ -656,9 +661,9 @@ terminal window. This similarity is a design goal. While making it easy for beginners to start with LAMMPS, it is also the intention to simplify the transition to workflows like most experienced LAMMPS users do. -All features have been extensively exposed to hotkeys, so that there is -also appeal for experienced LAMMPS users, too, especially for -prototyping and testing simulations setups. +All features have been extensively exposed to keyboard shortcuts, so +that there is also appeal for experienced LAMMPS users for prototyping +and testing simulations setups. Features ^^^^^^^^ diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index afd9b99ed2..ba080dbec3 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1243,9 +1243,12 @@ void LammpsGui::help() msg.setWindowTitle("LAMMPS-GUI Quick Help"); msg.setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); msg.setText("

"); - msg.setInformativeText("

LAMMPS GUI is a graphical text editor that is linked to the LAMMPS " + msg.setInformativeText("

LAMMPS GUI is a graphical text editor that is customized for " + "editing LAMMPS input files and linked to the LAMMPS " "library and thus can run LAMMPS directly using the contents of the " - "text buffer as input through the LAMMPS C-library interface.

" + "text buffer as input. It can retrieve and display information from " + "LAMMPS while it is running and display visualizations created " + "with the dump image command.

" "

The main window of the LAMMPS GUI is a text editor window with " "LAMMPS specific syntax highlighting. When typing Ctrl-Enter " "or clicking on 'Run LAMMMPS' in the 'Run' menu, LAMMPS will be run " @@ -1254,26 +1257,29 @@ void LammpsGui::help() "is displayed in a chart window. Both are updated regularly during the " "run, as is a progress bar in the main window. The running simulation " "can be stopped cleanly by typing Ctrl-/ or by clicking on " - "'Stop LAMMPS' in the 'Run' menu. After the simulation is finished " - "or stopped, an image of the simulated system can be shown in an image " + "'Stop LAMMPS' in the 'Run' menu. While LAMMPS is not running, " + "an image of the simulated system can be created and shown in an image " "viewer window by typing Ctrl-i or by clicking on 'View Image' " "in the 'Run' menu. Multiple image settings can be changed through the " - "buttons in the menu bar and the image will be re-renderd.

" + "buttons in the menu bar and the image will be re-renderd. In case " + "an input file contains a dump image command, LAMMPS GUI will load " + "the images as they are created and display them in a slide show.

" "

When opening a file, the editor will determine the directory " "where the input file resides and switch its current working directory " "to that same folder and thus enabling the run to read other files in " - "that folder, e.g. a data file .The GUI will show its current working " + "that folder, e.g. a data file. The GUI will show its current working " "directory in the status bar. In addition to using the menu, the " "editor window can also receive files as the first command line " "argument or via drag-n-drop from a graphical file manager or a " "desktop environment.

" - "

Almost all commands are accessible via hotkeys. Which those " - "hotkeys are, is typically shown next to their entries in the menus. " + "

Almost all commands are accessible via keyboard shortcuts. Which " + "those shortcuts are, is typically shown next to their entries in the " + "menus. " "In addition, the documentation for the command in the current line " "can be viewed by typing Ctrl-? or by choosing the respective " "entry in the context menu, available by right-clicking the mouse. " - "Log, chart, and image windows can be closed with Ctrl-W, the " - "main window with Ctrl-Q.

" + "Log, chart, slide show, and image windows can be closed with " + "Ctrl-W and the application terminated with Ctrl-Q.

" "

The 'About LAMMPS' dialog will show the LAMMPS version and the " "features included into the LAMMPS library linked to the LAMMPS GUI. " "A number of settings can be adjusted in the 'Preferences' dialog (in " From 4ff226b00f664defa3a761244f41b4d1f00457b6 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 9 Oct 2023 16:12:27 -0600 Subject: [PATCH 179/417] Fix issues in Kokkos fix property/atom --- src/KOKKOS/atom_kokkos.cpp | 52 ++++++++++++- src/KOKKOS/atom_kokkos.h | 4 + src/KOKKOS/atom_vec_dpd_kokkos.cpp | 8 -- src/KOKKOS/atom_vec_kokkos.h | 2 + src/KOKKOS/fix_property_atom_kokkos.cpp | 98 +++++++++++++++++++++---- src/KOKKOS/fix_property_atom_kokkos.h | 10 +++ src/KOKKOS/kokkos_base.h | 8 +- src/fix_property_atom.cpp | 14 +++- src/fix_property_atom.h | 1 + 9 files changed, 163 insertions(+), 34 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index 03537e7b88..a009972628 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -44,6 +44,10 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) h_tag_min = Kokkos::subview(h_tag_min_max,0); h_tag_max = Kokkos::subview(h_tag_min_max,1); + + nprop_atom = 0; + prop_atom = nullptr; + fix_prop_atom = nullptr; } /* ---------------------------------------------------------------------- */ @@ -112,6 +116,7 @@ AtomKokkos::~AtomKokkos() memoryKK->destroy_kokkos(k_dvector, dvector); dvector = nullptr; + delete [] fix_prop_atom; } /* ---------------------------------------------------------------------- */ @@ -121,15 +126,46 @@ void AtomKokkos::init() Atom::init(); sort_classic = lmp->kokkos->sort_classic; + + nprop_atom = 0; + for (int ifix = 0; ifix < modify->nfix; ifix++) { + if (modify->fix[ifix] && utils::strmatch(modify->fix[ifix]->style, "^property/atom")) { + auto fix_i = modify->fix[ifix]; + if (!fix_i->kokkosable) + error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); + + memory->grow(prop_atom,nprop_atom+1,"atom::prop_atom"); + prop_atom[nprop_atom++] = ifix; + } + } + + delete [] fix_prop_atom; + fix_prop_atom = new FixPropertyAtomKokkos*[nprop_atom]; + + printf("HERE %i\n",nprop_atom); + + for (int n = 0; n < nprop_atom; n++) { + auto fix_n = dynamic_cast(modify->fix[prop_atom[n]]); + fix_n->atom_init_flag = 1; + fix_prop_atom[n] = fix_n; + } + + memory->destroy(prop_atom); } /* ---------------------------------------------------------------------- */ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) { - if (space == Device && lmp->kokkos->auto_sync) avecKK->modified(Host, mask); + if (space == Device && lmp->kokkos->auto_sync) { + avecKK->modified(Host, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->modified(Host, mask); + } avecKK->sync(space, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->sync(space, mask); } /* ---------------------------------------------------------------------- */ @@ -137,13 +173,23 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) { avecKK->modified(space, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->modified(space, mask); - if (space == Device && lmp->kokkos->auto_sync) avecKK->sync(Host, mask); + if (space == Device && lmp->kokkos->auto_sync) { + avecKK->sync(Host, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->sync(Host, mask); + } } +/* ---------------------------------------------------------------------- */ + void AtomKokkos::sync_overlapping_device(const ExecutionSpace space, unsigned int mask) { avecKK->sync_overlapping_device(space, mask); + for (int n = 0; n < nprop_atom; n++) + fix_prop_atom[n]->sync_overlapping_device(space, mask); } /* ---------------------------------------------------------------------- */ @@ -375,7 +421,7 @@ AtomVec *AtomKokkos::new_avec(const std::string &style, int trysuffix, int &sfla int hybrid_substyle_flag = (avec != nullptr); AtomVec *avec = Atom::new_avec(style, trysuffix, sflag); - if (!avec->kokkosable) error->all(FLERR, "KOKKOS package requires a kokkos enabled atom_style"); + if (!avec->kokkosable) error->all(FLERR, "KOKKOS package requires a Kokkos-enabled atom_style"); if (!hybrid_substyle_flag) avecKK = dynamic_cast(avec); diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index f8b00f21f2..c26a1b291f 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -14,6 +14,7 @@ #include "atom.h" // IWYU pragma: export #include "kokkos_type.h" +#include "fix_property_atom_kokkos.h" #include @@ -25,6 +26,9 @@ namespace LAMMPS_NS { class AtomKokkos : public Atom { public: bool sort_classic; + int nprop_atom; + int* prop_atom; + FixPropertyAtomKokkos** fix_prop_atom; DAT::tdual_tagint_1d k_tag; DAT::tdual_int_1d k_type, k_mask; diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.cpp b/src/KOKKOS/atom_vec_dpd_kokkos.cpp index a8ce29f666..c3430b9f6e 100644 --- a/src/KOKKOS/atom_vec_dpd_kokkos.cpp +++ b/src/KOKKOS/atom_vec_dpd_kokkos.cpp @@ -963,7 +963,6 @@ void AtomVecDPDKokkos::sync(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.sync(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); } else { if (mask & X_MASK) atomKK->k_x.sync(); if (mask & V_MASK) atomKK->k_v.sync(); @@ -980,7 +979,6 @@ void AtomVecDPDKokkos::sync(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.sync(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); } } @@ -1019,8 +1017,6 @@ void AtomVecDPDKokkos::sync_overlapping_device(ExecutionSpace space, unsigned in perform_async_copy(atomKK->k_uCGnew,space); if ((mask & DUCHEM_MASK) && atomKK->k_duChem.need_sync()) perform_async_copy(atomKK->k_duChem,space); - if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) - perform_async_copy(atomKK->k_dvector,space); } else { if ((mask & X_MASK) && atomKK->k_x.need_sync()) perform_async_copy(atomKK->k_x,space); @@ -1052,8 +1048,6 @@ void AtomVecDPDKokkos::sync_overlapping_device(ExecutionSpace space, unsigned in perform_async_copy(atomKK->k_uCGnew,space); if ((mask & DUCHEM_MASK) && atomKK->k_duChem.need_sync()) perform_async_copy(atomKK->k_duChem,space); - if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) - perform_async_copy(atomKK->k_dvector,space); } } @@ -1077,7 +1071,6 @@ void AtomVecDPDKokkos::modified(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.modify(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.modify(); if (mask & DUCHEM_MASK) atomKK->k_duChem.modify(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.modify(); } else { if (mask & X_MASK) atomKK->k_x.modify(); if (mask & V_MASK) atomKK->k_v.modify(); @@ -1094,6 +1087,5 @@ void AtomVecDPDKokkos::modified(ExecutionSpace space, unsigned int mask) if (mask & UCG_MASK) atomKK->k_uCG.modify(); if (mask & UCGNEW_MASK) atomKK->k_uCGnew.modify(); if (mask & DUCHEM_MASK) atomKK->k_duChem.modify(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.modify(); } } diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index d3b2578b68..c10ff5b40a 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -139,6 +139,8 @@ class AtomVecKokkos : virtual public AtomVec { DAT::tdual_int_1d k_count; + public: + #ifdef LMP_KOKKOS_GPU template Kokkos::Viewnmax); + kokkosable = 1; + + dvector_flag = 0; + for (int nv = 0; nv < nvalue; nv++) + if (styles[nv] == DVEC) dvector_flag = 1; + + atom_init_flag = 0; } /* ---------------------------------------------------------------------- */ @@ -68,19 +74,20 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) { for (int nv = 0; nv < nvalue; nv++) { if (styles[nv] == MOLECULE) { - atomKK->sync(Device,MOLECULE_MASK); - memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); - size_t nbytes = (nmax-nmax_old) * sizeof(tagint); - atomKK->modified(Device,MOLECULE_MASK); + if (!atom_init_flag) this->modified(Host,MOLECULE_MASK); + else atomKK->sync(Device,MOLECULE_MASK); + memoryKK->grow_kokkos(atomKK->k_molecule,atom->molecule,nmax,"atom:molecule"); + if (atom_init_flag) atomKK->modified(Device,MOLECULE_MASK); } else if (styles[nv] == CHARGE) { - atomKK->sync(Device,Q_MASK); - memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); - size_t nbytes = (nmax-nmax_old) * sizeof(double); - atomKK->modified(Device,Q_MASK); + if (!atom_init_flag) this->modified(Host,Q_MASK); + else atomKK->sync(Device,Q_MASK); + memoryKK->grow_kokkos(atomKK->k_q,atom->q,nmax,"atom:q"); + if (atom_init_flag) atomKK->modified(Device,Q_MASK); } else if (styles[nv] == RMASS) { - atomKK->sync(Device,MOLECULE_MASK); - memoryKK->grow_kokkos(atomKK->k_rmass,atomKK->rmass,nmax,"atom:rmass"); - atomKK->modified(Device,RMASS_MASK); + if (!atom_init_flag) this->modified(Host,RMASS_MASK); + else atomKK->sync(Device,RMASS_MASK); + memoryKK->grow_kokkos(atomKK->k_rmass,atom->rmass,nmax,"atom:rmass"); + if (atom_init_flag) atomKK->modified(Device,RMASS_MASK); } else if (styles[nv] == TEMPERATURE) { memory->grow(atom->temperature, nmax, "atom:temperature"); size_t nbytes = (nmax - nmax_old) * sizeof(double); @@ -94,10 +101,11 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) size_t nbytes = (nmax-nmax_old) * sizeof(int); memset(&atom->ivector[index[nv]][nmax_old],0,nbytes); } else if (styles[nv] == DVEC) { - atomKK->sync(Device,DVECTOR_MASK); - memoryKK->grow_kokkos(atomKK->k_dvector,atomKK->dvector,atomKK->k_dvector.extent(0),nmax, + if (!atom_init_flag) this->modified(Host,DVECTOR_MASK); + else atomKK->sync(Device,DVECTOR_MASK); + memoryKK->grow_kokkos(atomKK->k_dvector,atom->dvector,atomKK->k_dvector.extent(0),nmax, "atom:dvector"); - atomKK->modified(Device,DVECTOR_MASK); + if (atom_init_flag) atomKK->modified(Device,DVECTOR_MASK); } else if (styles[nv] == IARRAY) { memory->grow(atom->iarray[index[nv]], nmax, cols[nv], "atom:iarray"); size_t nbytes = (size_t) (nmax - nmax_old) * cols[nv] * sizeof(int); @@ -110,3 +118,63 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) } nmax_old = nmax; } + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::sync(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.sync(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.sync(); + if (rmass_flag && (mask & RMASS_MASK)) {atomKK->k_rmass.sync();} + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.sync(); + } else { + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.sync(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.sync(); + if (rmass_flag && (mask & RMASS_MASK)) atomKK->k_rmass.sync(); + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.sync(); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::sync_overlapping_device(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if ((mask & MOLECULE_MASK) && atomKK->k_molecule.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_molecule,space); + if ((mask & Q_MASK) && atomKK->k_q.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_q,space); + if ((mask & RMASS_MASK) && atomKK->k_rmass.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_rmass,space); + if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_dvector,space); + } else { + if ((mask & MOLECULE_MASK) && atomKK->k_molecule.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_molecule,space); + if ((mask & Q_MASK) && atomKK->k_q.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_q,space); + if ((mask & RMASS_MASK) && atomKK->k_rmass.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_rmass,space); + if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) + atomKK->avecKK->perform_async_copy(atomKK->k_dvector,space); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::modified(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.modify(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.modify(); + if (rmass_flag && (mask & RMASS_MASK)) atomKK->k_rmass.modify(); + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.modify(); + } else { + if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.modify(); + if (q_flag && (mask & Q_MASK)) atomKK->k_q.modify(); + if (rmass_flag && (mask & RMASS_MASK)) atomKK->k_rmass.modify(); + if (dvector_flag && (mask & DVECTOR_MASK)) atomKK->k_dvector.modify(); + } +} diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h index 29b07b1f5b..74a20a28b5 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.h +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -22,6 +22,7 @@ FixStyle(property/atom/kk,FixPropertyAtomKokkos); #define LMP_FIX_PROPERTY_ATOM_KOKKOS_H #include "fix_property_atom.h" +#include "atom_vec_kokkos.h" namespace LAMMPS_NS { @@ -31,6 +32,15 @@ class FixPropertyAtomKokkos : public FixPropertyAtom { ~FixPropertyAtomKokkos() override; void grow_arrays(int) override; + + void sync(ExecutionSpace space, unsigned int mask); + void modified(ExecutionSpace space, unsigned int mask); + void sync_overlapping_device(ExecutionSpace space, unsigned int mask); + + int atom_init_flag; + + private: + int dvector_flag; }; } diff --git a/src/KOKKOS/kokkos_base.h b/src/KOKKOS/kokkos_base.h index 7d9ecb5d80..1e22a38657 100644 --- a/src/KOKKOS/kokkos_base.h +++ b/src/KOKKOS/kokkos_base.h @@ -41,11 +41,6 @@ class KokkosBase { int, int *) {return 0;}; virtual void unpack_forward_comm_fix_kokkos(int, int, DAT::tdual_xfloat_1d &) {} - - // Region - virtual void match_all_kokkos(int, DAT::tdual_int_1d) {} - - // Fix virtual int pack_exchange_kokkos(const int & /*nsend*/, DAT::tdual_xfloat_2d & /*k_buf*/, DAT::tdual_int_1d /*k_sendlist*/, DAT::tdual_int_1d /*k_copylist*/, @@ -54,6 +49,9 @@ class KokkosBase { DAT::tdual_int_1d & /*indices*/, int /*nrecv*/, ExecutionSpace /*space*/) {} + // Region + virtual void match_all_kokkos(int, DAT::tdual_int_1d) {} + using KeyViewType = DAT::t_x_array; using BinOp = BinOp3DLAMMPS; virtual void diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 994b4f0f19..3a53110839 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -198,16 +198,24 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : astyle = utils::strdup(atom->atom_style); - // perform initial allocation of atom-based array // register with Atom class - nmax_old = 0; - if (!lmp->kokkos) FixPropertyAtom::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); if (border) atom->add_callback(Atom::BORDER); } + +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtom::post_constructor() +{ + // perform initial allocation of atom-based array + + nmax_old = 0; + grow_arrays(atom->nmax); +} + /* ---------------------------------------------------------------------- */ FixPropertyAtom::~FixPropertyAtom() diff --git a/src/fix_property_atom.h b/src/fix_property_atom.h index 92497d6188..c50b6049dc 100644 --- a/src/fix_property_atom.h +++ b/src/fix_property_atom.h @@ -27,6 +27,7 @@ namespace LAMMPS_NS { class FixPropertyAtom : public Fix { public: FixPropertyAtom(class LAMMPS *, int, char **); + void post_constructor() override; ~FixPropertyAtom() override; int setmask() override; void init() override; From b24e1e10a0262edd4d30b4a71bcb54e0fe270c00 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Oct 2023 22:24:22 -0400 Subject: [PATCH 180/417] reposition the cursor for the context menu, but only if there is no selection --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/codeeditor.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index be7bcff10a..44fc45c0e2 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.8 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.9 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 46b970bd0a..af6e3b3790 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -668,7 +668,9 @@ void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event) void CodeEditor::contextMenuEvent(QContextMenuEvent *event) { - // reposition the cursor here? + // reposition the cursor here, but only if there is no active selection + if (!textCursor().hasSelection()) setTextCursor(cursorForPosition(event->pos())); + QString page, help; find_help(page, help); From b816029d709cded4c2955b08d9113495e6cb9300 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Oct 2023 23:32:22 -0400 Subject: [PATCH 181/417] pop down completion list when all characters have been deleted --- tools/lammps-gui/codeeditor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index af6e3b3790..34193bc320 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -577,6 +577,10 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) --begin; } if (((cursor.positionInBlock() - begin) > 2) || (line[begin + 1] == '$')) runCompletion(); + if (current_comp && current_comp->popup()->isVisible() && + ((cursor.positionInBlock() - begin) < 2)) { + current_comp->popup()->hide(); + } } } From 2b1985f755fb5019f03d4e76b6174808e7f543c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Oct 2023 11:36:49 -0400 Subject: [PATCH 182/417] restore GNU make build capability for ML-PACE --- lib/pace/Makefile | 6 +++--- lib/pace/Makefile.lammps | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pace/Makefile b/lib/pace/Makefile index 5a1588ef93..37f00ee70e 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -1,4 +1,5 @@ SHELL = /bin/sh +CMAKE= cmake # ------ FILES ------ @@ -35,7 +36,7 @@ lib: $(OBJ) lib-yaml-cpp lib-yaml-cpp: - cd $(YAML_CPP_PATH) && $(MAKE) lib + cd $(YAML_CPP_PATH) && $(CMAKE) . && $(MAKE) all # ------ COMPILE RULES ------ @@ -45,9 +46,8 @@ lib-yaml-cpp: # ------ CLEAN ------ clean-all: -rm -f *~ $(OBJ) $(LIB) - cd $(YAML_CPP_PATH) && $(MAKE) clean-all + cd $(YAML_CPP_PATH) && $(MAKE) clean clean-build: -rm -f *~ $(OBJ) - cd $(YAML_CPP_PATH) && $(MAKE) clean-build diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 6411e49a07..1c549e31d0 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include -DEXTRA_C_PROJECTIONS -pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp +pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp-pace pace_SYSPATH = From 07a03336702ff90501b2158b1ab14d6f1f2391fe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Oct 2023 13:53:56 -0400 Subject: [PATCH 183/417] prevent potential memory leak --- src/compute_msd_chunk.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/compute_msd_chunk.cpp b/src/compute_msd_chunk.cpp index 07234ecfdb..6e7436d6ad 100644 --- a/src/compute_msd_chunk.cpp +++ b/src/compute_msd_chunk.cpp @@ -27,8 +27,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ ComputeMSDChunk::ComputeMSDChunk(LAMMPS *lmp, int narg, char **arg) : - ComputeChunk(lmp, narg, arg), id_fix(nullptr), massproc(nullptr), masstotal(nullptr), - com(nullptr), comall(nullptr), msd(nullptr) + ComputeChunk(lmp, narg, arg), id_fix(nullptr), fix(nullptr), massproc(nullptr), + masstotal(nullptr), com(nullptr), comall(nullptr), msd(nullptr) { if (narg != 4) error->all(FLERR, "Illegal compute msd/chunk command"); @@ -196,6 +196,12 @@ void ComputeMSDChunk::compute_array() void ComputeMSDChunk::allocate() { ComputeChunk::allocate(); + memory->destroy(massproc); + memory->destroy(masstotal); + memory->destroy(com); + memory->destroy(comall); + memory->destroy(msd); + memory->create(massproc, nchunk, "msd/chunk:massproc"); memory->create(masstotal, nchunk, "msd/chunk:masstotal"); memory->create(com, nchunk, 3, "msd/chunk:com"); From 84eab70fb4252eb691d52000dae1ce2280ffb2ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Oct 2023 22:18:41 -0400 Subject: [PATCH 184/417] must select entire non-blank string under cursor for completion insertions --- tools/lammps-gui/codeeditor.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 34193bc320..7a1624c192 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -564,7 +564,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) // process key event in parent class QPlainTextEdit::keyPressEvent(event); - // if enabled, try pop up completion automatically after 3 characters + // if enabled, try pop up completion automatically after 2 characters if (automatic_completion) { auto cursor = textCursor(); auto line = cursor.block().text(); @@ -990,8 +990,26 @@ void CodeEditor::insertCompletedCommand(const QString &completion) { auto *completer = qobject_cast(sender()); if (completer->widget() != this) return; + + // select the entire word (non-space text) under the cursor + // we need to do it in this compicated way, since QTextCursor does not recognize + // special characters as part of a word. auto cursor = textCursor(); - cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); + auto line = cursor.block().text(); + int begin = cursor.positionInBlock(); + do { + if (line[begin].isSpace()) break; + --begin; + } while (begin >= 0); + + int end = begin + 1; + while (end < line.length()) { + if (line[end].isSpace()) break; + ++end; + } + + cursor.setPosition(cursor.position() - cursor.positionInBlock() + begin + 1); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin); cursor.insertText(completion); setTextCursor(cursor); } From 86a5d6bb151c196bb1843d947d901fe228625669 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 02:05:23 -0400 Subject: [PATCH 185/417] must re-initialized threads also for neigbor lists --- src/OPENMP/npair_omp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OPENMP/npair_omp.h b/src/OPENMP/npair_omp.h index 318fddfd54..7249c59406 100644 --- a/src/OPENMP/npair_omp.h +++ b/src/OPENMP/npair_omp.h @@ -32,6 +32,7 @@ namespace LAMMPS_NS { // get access to number of threads and per-thread data structures via FixOMP #define NPAIR_OMP_INIT \ const int nthreads = comm->nthreads; \ + omp_set_num_threads(nthreads); \ const int ifix = modify->find_fix("package_omp") // get thread id and then assign each thread a fixed chunk of atoms From cc5c5bbd498553dc529f94516401a24979b65a79 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 02:12:03 -0400 Subject: [PATCH 186/417] block waiting for end of stdout data not more than a second --- tools/lammps-gui/stdcapture.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/stdcapture.cpp b/tools/lammps-gui/stdcapture.cpp index 428277cc10..b09aebf053 100644 --- a/tools/lammps-gui/stdcapture.cpp +++ b/tools/lammps-gui/stdcapture.cpp @@ -77,6 +77,7 @@ bool StdCapture::EndCapture() int bytesRead; bool fd_blocked; + int maxwait = 100; do { bytesRead = 0; @@ -93,9 +94,10 @@ bool StdCapture::EndCapture() buf[bytesRead] = 0; m_captured += buf; } else if (bytesRead < 0) { - fd_blocked = ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)); + fd_blocked = ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)) && (maxwait > 0); if (fd_blocked) std::this_thread::sleep_for(std::chrono::milliseconds(10)); + --maxwait; } } while (fd_blocked || (bytesRead == (bufSize - 1))); m_capturing = false; From eff74405c1382b4d9b20734e62134333bcf5f88d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 02:16:23 -0400 Subject: [PATCH 187/417] don't replace end of line character from completion --- tools/lammps-gui/codeeditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 7a1624c192..b7a14871b7 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -1009,7 +1009,7 @@ void CodeEditor::insertCompletedCommand(const QString &completion) } cursor.setPosition(cursor.position() - cursor.positionInBlock() + begin + 1); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin - 1); cursor.insertText(completion); setTextCursor(cursor); } From bb7e8c66edfedccb7f192d06a6a1595f2c931b13 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 08:26:50 -0400 Subject: [PATCH 188/417] clarify --- doc/src/pair_reaxff.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/src/pair_reaxff.rst b/doc/src/pair_reaxff.rst index 4dac9baf85..067eb3afc3 100644 --- a/doc/src/pair_reaxff.rst +++ b/doc/src/pair_reaxff.rst @@ -43,22 +43,22 @@ Examples Description """"""""""" -Style *reaxff* computes the ReaxFF potential of van Duin, Goddard and -co-workers. ReaxFF uses distance-dependent bond-order functions to +Pair style *reaxff* computes the ReaxFF potential of van Duin, Goddard +and co-workers. ReaxFF uses distance-dependent bond-order functions to represent the contributions of chemical bonding to the potential -energy. There is more than one version of ReaxFF. The version +energy. There is more than one version of ReaxFF. The version implemented in LAMMPS uses the functional forms documented in the supplemental information of the following paper: -:ref:`(Chenoweth et al., 2008) `. The version integrated -into LAMMPS matches the version of ReaxFF From Summer 2010. For more -technical details about the pair reaxff implementation of ReaxFF, see -the :ref:`(Aktulga) ` paper. The *reaxff* style was initially -implemented as a stand-alone C code and is now converted to C++ and -integrated into LAMMPS as a package. +:ref:`(Chenoweth et al., 2008) ` and matches the +version of the reference ReaxFF implementation from Summer 2010. For +more technical details about the implementation of ReaxFF in pair style +*reaxff*, see the :ref:`(Aktulga) ` paper. The *reaxff* style +was initially implemented as a stand-alone C code and is now converted +to C++ and integrated into LAMMPS as a package. The *reaxff/kk* style is a Kokkos version of the ReaxFF potential that -is derived from the *reaxff* style. The Kokkos version can run on GPUs -and can also use OpenMP multithreading. For more information about the +is derived from the *reaxff* style. The Kokkos version can run on GPUs +and can also use OpenMP multithreading. For more information about the Kokkos package, see :doc:`Packages details ` and :doc:`Speed kokkos ` doc pages. One important consideration when using the *reaxff/kk* style is the choice of either From 45172d33a9c2296111e341260912b5cb380e5aac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 09:20:05 -0400 Subject: [PATCH 189/417] use potential file name distributed with LAMMPS in examples --- doc/src/pair_ilp_tmd.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/src/pair_ilp_tmd.rst b/doc/src/pair_ilp_tmd.rst index 482d75a100..70a4768389 100644 --- a/doc/src/pair_ilp_tmd.rst +++ b/doc/src/pair_ilp_tmd.rst @@ -22,12 +22,12 @@ Examples .. code-block:: LAMMPS pair_style hybrid/overlay ilp/tmd 16.0 1 - pair_coeff * * ilp/tmd TMD.ILP Mo S S + pair_coeff * * ilp/tmd MoS2.ILP Mo S S pair_style hybrid/overlay sw/mod sw/mod ilp/tmd 16.0 pair_coeff * * sw/mod 1 tmd.sw.mod Mo S S NULL NULL NULL pair_coeff * * sw/mod 2 tmd.sw.mod NULL NULL NULL Mo S S - pair_coeff * * ilp/tmd TMD.ILP Mo S S Mo S S + pair_coeff * * ilp/tmd MoS2.ILP Mo S S Mo S S Description """"""""""" @@ -69,7 +69,7 @@ calculating the normals. each atom `i`, its six nearest neighboring atoms belonging to the same sub-layer are chosen to define the normal vector `{\bf n}_i`. -The parameter file (e.g. TMD.ILP), is intended for use with *metal* +The parameter file (e.g. MoS2.ILP), is intended for use with *metal* :doc:`units `, with energies in meV. Two additional parameters, *S*, and *rcut* are included in the parameter file. *S* is designed to facilitate scaling of energies. *rcut* is designed to build the neighbor @@ -77,7 +77,7 @@ list for calculating the normals for each atom pair. .. note:: - The parameters presented in the parameter file (e.g. TMD.ILP), + The parameters presented in the parameter file (e.g. MoS2.ILP), are fitted with taper function by setting the cutoff equal to 16.0 Angstrom. Using different cutoff or taper function should be careful. These parameters provide a good description in both short- and long-range @@ -133,10 +133,10 @@ if LAMMPS was built with that package. See the :doc:`Build package This pair style requires the newton setting to be *on* for pair interactions. -The TMD.ILP potential file provided with LAMMPS (see the potentials +The MoS2.ILP potential file provided with LAMMPS (see the potentials directory) are parameterized for *metal* units. You can use this potential with any LAMMPS units, but you would need to create your own -custom TMD.ILP potential file with coefficients listed in the appropriate +custom MoS2.ILP potential file with coefficients listed in the appropriate units, if your simulation does not use *metal* units. Related commands From fbdd61e28c814ba21a1c2e774386d1f469fc0981 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Oct 2023 18:15:13 -0400 Subject: [PATCH 190/417] enable spacefilling sphere option also for systems with per-atom radius --- tools/lammps-gui/imageviewer.cpp | 14 +++++++++----- tools/lammps-gui/imageviewer.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 86be0b66df..ee81f61253 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -131,7 +131,7 @@ static const QString blank(" "); ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidget *parent) : QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea), - lammps(_lammps), group("all"), filename(fileName), useelements(false) + lammps(_lammps), group("all"), filename(fileName), useelements(false), usediameter(false) { imageLabel->setBackgroundRole(QPalette::Base); imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); @@ -268,7 +268,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge // properties directly since lookup in reset_view() will have failed dobox->setChecked(showbox); dovdw->setChecked(vdwfactor > 1.0); - dovdw->setEnabled(useelements); + dovdw->setEnabled(useelements || usediameter); doaxes->setChecked(showaxes); dossao->setChecked(usessao); doanti->setChecked(antialias); @@ -435,7 +435,7 @@ void ImageViewer::createImage() dumpcmd += "'" + dumpfile.fileName() + "'"; settings.beginGroup("snapshot"); - int hhrot = (hrot > 180) ? 360 - hrot : hrot; + int hhrot = (hrot > 180) ? 360 - hrot : hrot; // determine elements from masses and set their covalent radii int ntypes = lammps->extract_setting("ntypes"); @@ -454,9 +454,10 @@ void ImageViewer::createImage() adiams += QString("adiam %1 %2 ").arg(i).arg(vdwfactor * pte_vdw_radius[idx]); } } + usediameter = lammps->extract_setting("radius_flag") != 0; // adjust pushbutton state and clear adiams string to disable VDW display, if needed - if (useelements) { + if (useelements || usediameter) { auto *button = findChild("vdw"); if (button) button->setEnabled(true); } else { @@ -469,7 +470,10 @@ void ImageViewer::createImage() dumpcmd += blank + "element"; else dumpcmd += blank + settings.value("color", "type").toString(); - dumpcmd += blank + settings.value("diameter", "type").toString(); + if (usediameter && (vdwfactor > 1.0)) + dumpcmd += blank + "diameter"; + else + dumpcmd += blank + settings.value("diameter", "type").toString(); dumpcmd += QString(" size %1 %2").arg(xsize).arg(ysize); dumpcmd += QString(" zoom %1").arg(zoom); dumpcmd += " shiny 0.5 "; diff --git a/tools/lammps-gui/imageviewer.h b/tools/lammps-gui/imageviewer.h index 8946c6cc8b..1be7790666 100644 --- a/tools/lammps-gui/imageviewer.h +++ b/tools/lammps-gui/imageviewer.h @@ -88,7 +88,7 @@ private: int xsize, ysize; int hrot, vrot; double zoom, vdwfactor; - bool showbox, showaxes, antialias, usessao, useelements; + bool showbox, showaxes, antialias, usessao, useelements, usediameter; }; #endif From 9b108a631bb4b7361855b755ce6accfd657bbbf8 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 11 Oct 2023 16:36:15 -0600 Subject: [PATCH 191/417] Do not zero forces in pair if using hybrid/overlay --- src/KOKKOS/pair_buck_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_buck_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_buck_kokkos.h | 15 ++-- src/KOKKOS/pair_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_coul_debye_kokkos.h | 13 +-- src/KOKKOS/pair_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_kokkos.h | 81 +++++++++++-------- ...ir_lj_charmm_coul_charmm_implicit_kokkos.h | 46 ++++++----- .../pair_lj_charmm_coul_charmm_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_lj_class2_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_class2_kokkos.h | 15 ++-- src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h | 13 +-- src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h | 13 +-- src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h | 13 +-- src/KOKKOS/pair_lj_cut_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_cut_kokkos.h | 15 ++-- src/KOKKOS/pair_lj_expand_coul_long_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_expand_kokkos.h | 15 ++-- .../pair_lj_gromacs_coul_gromacs_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_gromacs_kokkos.h | 46 ++++++----- src/KOKKOS/pair_lj_spica_kokkos.h | 15 ++-- src/KOKKOS/pair_morse_kokkos.h | 15 ++-- src/KOKKOS/pair_table_kokkos.cpp | 12 +-- src/KOKKOS/pair_table_kokkos.h | 51 ++++++------ src/KOKKOS/pair_yukawa_kokkos.h | 19 +++-- src/KOKKOS/pair_zbl_kokkos.h | 15 ++-- 28 files changed, 465 insertions(+), 354 deletions(-) diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.h b/src/KOKKOS/pair_buck_coul_cut_kokkos.h index b91348d557..9b6cc31898 100644 --- a/src/KOKKOS/pair_buck_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.h @@ -112,15 +112,18 @@ class PairBuckCoulCutKokkos : public PairBuckCoulCut { void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckCoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairBuckCoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairBuckCoulCutKokkos*); diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.h b/src/KOKKOS/pair_buck_coul_long_kokkos.h index b776a84e3c..bed9b0d0f8 100644 --- a/src/KOKKOS/pair_buck_coul_long_kokkos.h +++ b/src/KOKKOS/pair_buck_coul_long_kokkos.h @@ -115,27 +115,33 @@ class PairBuckCoulLongKokkos : public PairBuckCoulLong { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairBuckCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairBuckCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairBuckCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairBuckCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairBuckCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairBuckCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairBuckCoulLongKokkos*); diff --git a/src/KOKKOS/pair_buck_kokkos.h b/src/KOKKOS/pair_buck_kokkos.h index 364716453b..15325cd56a 100644 --- a/src/KOKKOS/pair_buck_kokkos.h +++ b/src/KOKKOS/pair_buck_kokkos.h @@ -91,16 +91,19 @@ class PairBuckKokkos : public PairBuck { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairBuckKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairBuckKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairBuckKokkos*); }; diff --git a/src/KOKKOS/pair_coul_cut_kokkos.h b/src/KOKKOS/pair_coul_cut_kokkos.h index 6626889660..3e0501edd9 100644 --- a/src/KOKKOS/pair_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_coul_cut_kokkos.h @@ -112,15 +112,18 @@ class PairCoulCutKokkos : public PairCoulCut { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairCoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairCoulCutKokkos*); diff --git a/src/KOKKOS/pair_coul_debye_kokkos.h b/src/KOKKOS/pair_coul_debye_kokkos.h index b6bed9d557..d239291a25 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.h +++ b/src/KOKKOS/pair_coul_debye_kokkos.h @@ -112,15 +112,18 @@ class PairCoulDebyeKokkos : public PairCoulDebye { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairCoulDebyeKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairCoulDebyeKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairCoulDebyeKokkos*); diff --git a/src/KOKKOS/pair_coul_long_kokkos.h b/src/KOKKOS/pair_coul_long_kokkos.h index fcb1402028..232cdbb6df 100644 --- a/src/KOKKOS/pair_coul_long_kokkos.h +++ b/src/KOKKOS/pair_coul_long_kokkos.h @@ -114,27 +114,33 @@ class PairCoulLongKokkos : public PairCoulLong { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairCoulLongKokkos*); diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 2c2a622791..d3c766f5ae 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -50,7 +50,7 @@ struct DoCoul<1> { //Specialisation for Neighborlist types Half, HalfThread, Full -template +template struct PairComputeFunctor { typedef typename PairStyle::device_type device_type ; typedef ArrayTypes AT; @@ -137,7 +137,7 @@ struct PairComputeFunctor { F_FLOAT fytmp = 0.0; F_FLOAT fztmp = 0.0; - if (NEIGHFLAG == FULL) { + if (NEIGHFLAG == FULL && ZEROFLAG) { f(i,0) = 0.0; f(i,1) = 0.0; f(i,2) = 0.0; @@ -211,7 +211,7 @@ struct PairComputeFunctor { F_FLOAT fytmp = 0.0; F_FLOAT fztmp = 0.0; - if (NEIGHFLAG == FULL) { + if (NEIGHFLAG == FULL && ZEROFLAG) { f(i,0) = 0.0; f(i,1) = 0.0; f(i,2) = 0.0; @@ -292,11 +292,13 @@ struct PairComputeFunctor { const X_FLOAT ztmp = c.x(i,2); const int itype = c.type(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -355,11 +357,13 @@ struct PairComputeFunctor { const int itype = c.type(i); const F_FLOAT qtmp = c.q(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -423,11 +427,13 @@ struct PairComputeFunctor { const X_FLOAT ztmp = c.x(i,2); const int itype = c.type(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -525,11 +531,13 @@ struct PairComputeFunctor { const int itype = c.type(i); const F_FLOAT qtmp = c.q(i); - Kokkos::single(Kokkos::PerThread(team), [&] (){ - f(i,0) = 0.0; - f(i,1) = 0.0; - f(i,2) = 0.0; - }); + if (ZEROFLAG) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) = 0.0; + f(i,1) = 0.0; + f(i,2) = 0.0; + }); + } const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -740,7 +748,7 @@ struct PairComputeFunctor { // By having the enable_if with a ! and without it, exactly one of the functions // pair_compute_neighlist will match - either the dummy version // or the real one further below. -template +template EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t*> list) { EV_FLOAT ev; (void) fpair; @@ -770,7 +778,7 @@ int GetTeamSize(FunctorStyle& KOKKOS_GPU_ARG(functor), int KOKKOS_GPU_ARG(inum), } // Submit ParallelFor for NEIGHFLAG=HALF,HALFTHREAD,FULL -template +template EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&PairStyle::EnabledNeighFlags) != 0, NeighListKokkos*> list) { EV_FLOAT ev; @@ -784,13 +792,13 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P int atoms_per_team = 32; if (fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { - PairComputeFunctor ff(fpair,list); + PairComputeFunctor ff(fpair,list); atoms_per_team = GetTeamSize(ff, list->inum, (fpair->eflag || fpair->vflag), 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); + PairComputeFunctor ff(fpair,list); atoms_per_team = GetTeamSize(ff, list->inum, (fpair->eflag || fpair->vflag), 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); @@ -798,12 +806,12 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P } } else { if (fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { - PairComputeFunctor ff(fpair,list); + 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); + 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(); @@ -812,16 +820,21 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P return ev; } -template +template EV_FLOAT pair_compute (PairStyle* fpair, NeighListKokkos* list) { EV_FLOAT ev; if (fpair->neighflag == FULL) { - fpair->fuse_force_clear_flag = 1; - ev = pair_compute_neighlist (fpair,list); + if (utils::strmatch(fpair->lmp->force->pair_style,"^hybrid/overlay")) { + fpair->fuse_force_clear_flag = 0; + ev = pair_compute_neighlist (fpair,list); + } else { + fpair->fuse_force_clear_flag = 1; + ev = pair_compute_neighlist (fpair,list); + } } else if (fpair->neighflag == HALFTHREAD) { - ev = pair_compute_neighlist (fpair,list); + ev = pair_compute_neighlist (fpair,list); } else if (fpair->neighflag == HALF) { - ev = pair_compute_neighlist (fpair,list); + ev = pair_compute_neighlist (fpair,list); } return ev; } diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h index ae27ee68ab..7e21676fd5 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h @@ -110,27 +110,33 @@ class PairLJCharmmCoulCharmmImplicitKokkos : public PairLJCharmmCoulCharmmImplic void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmImplicitKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmImplicitKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmImplicitKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmImplicitKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmImplicitKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCharmmCoulCharmmImplicitKokkos*); diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h index 912ad573c6..1f26242ded 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h @@ -108,27 +108,33 @@ class PairLJCharmmCoulCharmmKokkos : public PairLJCharmmCoulCharmm { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulCharmmKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulCharmmKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulCharmmKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCharmmCoulCharmmKokkos*); diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h index 4ae8a12944..c6c80e76dc 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h @@ -106,27 +106,33 @@ class PairLJCharmmCoulLongKokkos : public PairLJCharmmCoulLong { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCharmmCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCharmmCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCharmmCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCharmmCoulLongKokkos*); diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h index 5ca276c28e..9399345458 100644 --- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h @@ -104,15 +104,18 @@ class PairLJClass2CoulCutKokkos : public PairLJClass2CoulCut { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2CoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJClass2CoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJClass2CoulCutKokkos*); diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h index 599cc2a83c..1cf6590855 100644 --- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h @@ -107,27 +107,33 @@ class PairLJClass2CoulLongKokkos : public PairLJClass2CoulLong { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJClass2CoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJClass2CoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJClass2CoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJClass2CoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJClass2CoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJClass2CoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJClass2CoulLongKokkos*); diff --git a/src/KOKKOS/pair_lj_class2_kokkos.h b/src/KOKKOS/pair_lj_class2_kokkos.h index 0936399ca8..5594680929 100644 --- a/src/KOKKOS/pair_lj_class2_kokkos.h +++ b/src/KOKKOS/pair_lj_class2_kokkos.h @@ -96,16 +96,19 @@ class PairLJClass2Kokkos : public PairLJClass2 { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJClass2Kokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJClass2Kokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJClass2Kokkos*); }; diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h index 87464b37dc..affc67bf16 100644 --- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h @@ -104,15 +104,18 @@ class PairLJCutCoulCutKokkos : public PairLJCutCoulCut { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulCutKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJCutCoulCutKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulCutKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h index ea0b401959..eeed483b76 100644 --- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h @@ -104,15 +104,18 @@ class PairLJCutCoulDebyeKokkos : public PairLJCutCoulDebye { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDebyeKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJCutCoulDebyeKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulDebyeKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h index e420bd22a9..d9e5fcfe49 100644 --- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h @@ -101,15 +101,18 @@ class PairLJCutCoulDSFKokkos : public PairLJCutCoulDSF { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutCoulDSFKokkos*,NeighListKokkos*); friend EV_FLOAT pair_compute(PairLJCutCoulDSFKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulDSFKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h index bcb97a59cd..ec6e2db176 100644 --- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h @@ -107,27 +107,33 @@ class PairLJCutCoulLongKokkos : public PairLJCutCoulLong { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCutCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCutCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJCutCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJCutCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJCutCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJCutCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutCoulLongKokkos*); diff --git a/src/KOKKOS/pair_lj_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_kokkos.h index 106f1a9048..b44c1aa6fe 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.h +++ b/src/KOKKOS/pair_lj_cut_kokkos.h @@ -92,16 +92,19 @@ class PairLJCutKokkos : public PairLJCut { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJCutKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJCutKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJCutKokkos*); }; diff --git a/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h b/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h index 09a694a122..30e82b7dab 100644 --- a/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h +++ b/src/KOKKOS/pair_lj_expand_coul_long_kokkos.h @@ -116,27 +116,33 @@ class PairLJExpandCoulLongKokkos : public PairLJExpandCoulLong { double qqrd2e; void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJExpandCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJExpandCoulLongKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJExpandCoulLongKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJExpandCoulLongKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJExpandCoulLongKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJExpandCoulLongKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJExpandCoulLongKokkos*); }; diff --git a/src/KOKKOS/pair_lj_expand_kokkos.h b/src/KOKKOS/pair_lj_expand_kokkos.h index 0df0a6f8f8..64fe7d8b8e 100644 --- a/src/KOKKOS/pair_lj_expand_kokkos.h +++ b/src/KOKKOS/pair_lj_expand_kokkos.h @@ -97,16 +97,19 @@ class PairLJExpandKokkos : public PairLJExpand { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJExpandKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJExpandKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJExpandKokkos*); }; diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h index 359c4a1229..020b621e33 100644 --- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h +++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h @@ -115,27 +115,33 @@ class PairLJGromacsCoulGromacsKokkos : public PairLJGromacsCoulGromacs { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsCoulGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsCoulGromacsKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsCoulGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsCoulGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsCoulGromacsKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJGromacsCoulGromacsKokkos*); diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_kokkos.h index 95c600a415..ad41ca5120 100644 --- a/src/KOKKOS/pair_lj_gromacs_kokkos.h +++ b/src/KOKKOS/pair_lj_gromacs_kokkos.h @@ -115,27 +115,33 @@ class PairLJGromacsKokkos : public PairLJGromacs { void allocate() override; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsKokkos*, NeighListKokkos*); - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist >(PairLJGromacsKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute >(PairLJGromacsKokkos*, + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend struct PairComputeFunctor>; + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist>(PairLJGromacsKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute>(PairLJGromacsKokkos*, NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJGromacsKokkos*); diff --git a/src/KOKKOS/pair_lj_spica_kokkos.h b/src/KOKKOS/pair_lj_spica_kokkos.h index b330af4bfd..06c70ebd3e 100644 --- a/src/KOKKOS/pair_lj_spica_kokkos.h +++ b/src/KOKKOS/pair_lj_spica_kokkos.h @@ -97,16 +97,19 @@ class PairLJSPICAKokkos : public PairLJSPICA { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairLJSPICAKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairLJSPICAKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairLJSPICAKokkos*); }; diff --git a/src/KOKKOS/pair_morse_kokkos.h b/src/KOKKOS/pair_morse_kokkos.h index d06cf2deb1..ccf27b018b 100644 --- a/src/KOKKOS/pair_morse_kokkos.h +++ b/src/KOKKOS/pair_morse_kokkos.h @@ -92,16 +92,19 @@ class PairMorseKokkos : public PairMorse { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairMorseKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairMorseKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairMorseKokkos*); }; diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp index 83bd74d4af..99d01be4a5 100644 --- a/src/KOKKOS/pair_table_kokkos.cpp +++ b/src/KOKKOS/pair_table_kokkos.cpp @@ -133,19 +133,19 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) EV_FLOAT ev; if (atom->ntypes > MAX_TYPES_STACKPARAMS) { if (neighflag == FULL) { - PairComputeFunctor,FULL,false,S_TableCompute > + PairComputeFunctor,FULL,false,0,S_TableCompute > ff(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,ff,ev); else Kokkos::parallel_for(list->inum,ff); ff.contribute(); } else if (neighflag == HALFTHREAD) { - PairComputeFunctor,HALFTHREAD,false,S_TableCompute > + PairComputeFunctor,HALFTHREAD,false,0,S_TableCompute > ff(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,ff,ev); else Kokkos::parallel_for(list->inum,ff); ff.contribute(); } else if (neighflag == HALF) { - PairComputeFunctor,HALF,false,S_TableCompute > + PairComputeFunctor,HALF,false,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); @@ -153,19 +153,19 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) } } else { if (neighflag == FULL) { - PairComputeFunctor,FULL,true,S_TableCompute > + PairComputeFunctor,FULL,true,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); f.contribute(); } else if (neighflag == HALFTHREAD) { - PairComputeFunctor,HALFTHREAD,true,S_TableCompute > + PairComputeFunctor,HALFTHREAD,true,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); f.contribute(); } else if (neighflag == HALF) { - PairComputeFunctor,HALF,true,S_TableCompute > + PairComputeFunctor,HALF,true,0,S_TableCompute > f(this,(NeighListKokkos*) list); if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); else Kokkos::parallel_for(list->inum,f); diff --git a/src/KOKKOS/pair_table_kokkos.h b/src/KOKKOS/pair_table_kokkos.h index 80226d3770..18112e4c18 100644 --- a/src/KOKKOS/pair_table_kokkos.h +++ b/src/KOKKOS/pair_table_kokkos.h @@ -35,9 +35,6 @@ struct S_TableCompute { static constexpr int TabStyle = TABSTYLE; }; -template -struct PairTableComputeFunctor; - template class PairTableKokkos : public PairTable { public: @@ -135,33 +132,33 @@ class PairTableKokkos : public PairTable { F_FLOAT compute_ecoul(const F_FLOAT& /*rsq*/, const int& /*i*/, const int& /*j*/, const int& /*itype*/, const int& /*jtype*/) const { return 0; } - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; - friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; + friend struct PairComputeFunctor >; friend void pair_virial_fdotr_compute(PairTableKokkos*); }; diff --git a/src/KOKKOS/pair_yukawa_kokkos.h b/src/KOKKOS/pair_yukawa_kokkos.h index e04f65264b..dc93e83aea 100644 --- a/src/KOKKOS/pair_yukawa_kokkos.h +++ b/src/KOKKOS/pair_yukawa_kokkos.h @@ -95,20 +95,19 @@ class PairYukawaKokkos : public PairYukawa { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist( - PairYukawaKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( - PairYukawaKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( - PairYukawaKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute( - PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairYukawaKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairYukawaKokkos*); }; diff --git a/src/KOKKOS/pair_zbl_kokkos.h b/src/KOKKOS/pair_zbl_kokkos.h index bd33cdb5e0..b7638a25e0 100644 --- a/src/KOKKOS/pair_zbl_kokkos.h +++ b/src/KOKKOS/pair_zbl_kokkos.h @@ -89,16 +89,19 @@ class PairZBLKokkos : public PairZBL { void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairZBLKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairZBLKokkos*); }; From 8bc396558342e3dea89abcfb4364bf6260706be3 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 12 Oct 2023 12:06:55 -0600 Subject: [PATCH 192/417] More robust refactor of Kokkos fix property/atom --- src/KOKKOS/atom_kokkos.cpp | 8 ++++--- src/KOKKOS/atom_kokkos.h | 1 + src/KOKKOS/fix_property_atom_kokkos.cpp | 32 ++++++++++++++----------- src/KOKKOS/fix_property_atom_kokkos.h | 4 +--- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index a009972628..f118b2a204 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -126,7 +126,12 @@ void AtomKokkos::init() Atom::init(); sort_classic = lmp->kokkos->sort_classic; +} +/* ---------------------------------------------------------------------- */ + +void AtomKokkos::update_property_atom() +{ nprop_atom = 0; for (int ifix = 0; ifix < modify->nfix; ifix++) { if (modify->fix[ifix] && utils::strmatch(modify->fix[ifix]->style, "^property/atom")) { @@ -142,11 +147,8 @@ void AtomKokkos::init() delete [] fix_prop_atom; fix_prop_atom = new FixPropertyAtomKokkos*[nprop_atom]; - printf("HERE %i\n",nprop_atom); - for (int n = 0; n < nprop_atom; n++) { auto fix_n = dynamic_cast(modify->fix[prop_atom[n]]); - fix_n->atom_init_flag = 1; fix_prop_atom[n] = fix_n; } diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index c26a1b291f..26ea7da296 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -148,6 +148,7 @@ class AtomKokkos : public Atom { } void init() override; + void update_property_atom(); void allocate_type_arrays() override; void sync(const ExecutionSpace space, unsigned int mask); void modified(const ExecutionSpace space, unsigned int mask); diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp index 080a8f6fe4..dcd943cac6 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.cpp +++ b/src/KOKKOS/fix_property_atom_kokkos.cpp @@ -35,8 +35,15 @@ FixPropertyAtomKokkos::FixPropertyAtomKokkos(LAMMPS *lmp, int narg, char **arg) dvector_flag = 0; for (int nv = 0; nv < nvalue; nv++) if (styles[nv] == DVEC) dvector_flag = 1; +} - atom_init_flag = 0; +/* ---------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::post_constructor() +{ + atomKK->update_property_atom(); + + FixPropertyAtom::post_constructor(); } /* ---------------------------------------------------------------------- */ @@ -61,6 +68,8 @@ FixPropertyAtomKokkos::~FixPropertyAtomKokkos() atom->rmass = nullptr; } } + + atomKK->update_property_atom(); } /* ---------------------------------------------------------------------- @@ -74,20 +83,17 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) { for (int nv = 0; nv < nvalue; nv++) { if (styles[nv] == MOLECULE) { - if (!atom_init_flag) this->modified(Host,MOLECULE_MASK); - else atomKK->sync(Device,MOLECULE_MASK); + atomKK->sync(Device,MOLECULE_MASK); memoryKK->grow_kokkos(atomKK->k_molecule,atom->molecule,nmax,"atom:molecule"); - if (atom_init_flag) atomKK->modified(Device,MOLECULE_MASK); + atomKK->modified(Device,MOLECULE_MASK); } else if (styles[nv] == CHARGE) { - if (!atom_init_flag) this->modified(Host,Q_MASK); - else atomKK->sync(Device,Q_MASK); + atomKK->sync(Device,Q_MASK); memoryKK->grow_kokkos(atomKK->k_q,atom->q,nmax,"atom:q"); - if (atom_init_flag) atomKK->modified(Device,Q_MASK); + atomKK->modified(Device,Q_MASK); } else if (styles[nv] == RMASS) { - if (!atom_init_flag) this->modified(Host,RMASS_MASK); - else atomKK->sync(Device,RMASS_MASK); + atomKK->sync(Device,RMASS_MASK); memoryKK->grow_kokkos(atomKK->k_rmass,atom->rmass,nmax,"atom:rmass"); - if (atom_init_flag) atomKK->modified(Device,RMASS_MASK); + atomKK->modified(Device,RMASS_MASK); } else if (styles[nv] == TEMPERATURE) { memory->grow(atom->temperature, nmax, "atom:temperature"); size_t nbytes = (nmax - nmax_old) * sizeof(double); @@ -101,11 +107,10 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) size_t nbytes = (nmax-nmax_old) * sizeof(int); memset(&atom->ivector[index[nv]][nmax_old],0,nbytes); } else if (styles[nv] == DVEC) { - if (!atom_init_flag) this->modified(Host,DVECTOR_MASK); - else atomKK->sync(Device,DVECTOR_MASK); + atomKK->sync(Device,DVECTOR_MASK); memoryKK->grow_kokkos(atomKK->k_dvector,atom->dvector,atomKK->k_dvector.extent(0),nmax, "atom:dvector"); - if (atom_init_flag) atomKK->modified(Device,DVECTOR_MASK); + atomKK->modified(Device,DVECTOR_MASK); } else if (styles[nv] == IARRAY) { memory->grow(atom->iarray[index[nv]], nmax, cols[nv], "atom:iarray"); size_t nbytes = (size_t) (nmax - nmax_old) * cols[nv] * sizeof(int); @@ -124,7 +129,6 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax) void FixPropertyAtomKokkos::sync(ExecutionSpace space, unsigned int mask) { if (space == Device) { - if (molecule_flag && (mask & MOLECULE_MASK)) atomKK->k_molecule.sync(); if (q_flag && (mask & Q_MASK)) atomKK->k_q.sync(); if (rmass_flag && (mask & RMASS_MASK)) {atomKK->k_rmass.sync();} diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h index 74a20a28b5..adbe6ab20b 100644 --- a/src/KOKKOS/fix_property_atom_kokkos.h +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -29,16 +29,14 @@ namespace LAMMPS_NS { class FixPropertyAtomKokkos : public FixPropertyAtom { public: FixPropertyAtomKokkos(class LAMMPS *, int, char **); + void post_constructor() override; ~FixPropertyAtomKokkos() override; - void grow_arrays(int) override; void sync(ExecutionSpace space, unsigned int mask); void modified(ExecutionSpace space, unsigned int mask); void sync_overlapping_device(ExecutionSpace space, unsigned int mask); - int atom_init_flag; - private: int dvector_flag; }; From 4910401f6c43c54318e1c4509475c6f693129f0b Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 12 Oct 2023 12:52:57 -0600 Subject: [PATCH 193/417] Add accelerator package text --- doc/src/fix_efield.rst | 6 ++++++ doc/src/fix_spring_self.rst | 6 ++++++ doc/src/pair_yukawa_colloid.rst | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/doc/src/fix_efield.rst b/doc/src/fix_efield.rst index c6ac3a0722..71be030266 100644 --- a/doc/src/fix_efield.rst +++ b/doc/src/fix_efield.rst @@ -211,6 +211,12 @@ the iteration count during the minimization. system (the quantity being minimized), you MUST enable the :doc:`fix_modify ` *energy* option for this fix. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" diff --git a/doc/src/fix_spring_self.rst b/doc/src/fix_spring_self.rst index 0def6d51f0..3a3e246455 100644 --- a/doc/src/fix_spring_self.rst +++ b/doc/src/fix_spring_self.rst @@ -81,6 +81,12 @@ invoked by the :doc:`minimize ` command. you MUST enable the :doc:`fix_modify ` *energy* option for this fix. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" none diff --git a/doc/src/pair_yukawa_colloid.rst b/doc/src/pair_yukawa_colloid.rst index 96893f8e37..c6f201d249 100644 --- a/doc/src/pair_yukawa_colloid.rst +++ b/doc/src/pair_yukawa_colloid.rst @@ -132,6 +132,12 @@ per-type polydispersity is allowed. This means all particles of the same type must have the same diameter. Each type can have a different diameter. +---------- + +.. include:: accel_styles.rst + +---------- + Related commands """""""""""""""" From 26133bd26ad1251dd43e16c34f988997fa792b09 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 12 Oct 2023 16:29:01 -0400 Subject: [PATCH 194/417] Revert "restore GNU make build capability for ML-PACE" This reverts commit 2b1985f755fb5019f03d4e76b6174808e7f543c1. --- lib/pace/Makefile | 6 +++--- lib/pace/Makefile.lammps | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pace/Makefile b/lib/pace/Makefile index 37f00ee70e..5a1588ef93 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -1,5 +1,4 @@ SHELL = /bin/sh -CMAKE= cmake # ------ FILES ------ @@ -36,7 +35,7 @@ lib: $(OBJ) lib-yaml-cpp lib-yaml-cpp: - cd $(YAML_CPP_PATH) && $(CMAKE) . && $(MAKE) all + cd $(YAML_CPP_PATH) && $(MAKE) lib # ------ COMPILE RULES ------ @@ -46,8 +45,9 @@ lib-yaml-cpp: # ------ CLEAN ------ clean-all: -rm -f *~ $(OBJ) $(LIB) - cd $(YAML_CPP_PATH) && $(MAKE) clean + cd $(YAML_CPP_PATH) && $(MAKE) clean-all clean-build: -rm -f *~ $(OBJ) + cd $(YAML_CPP_PATH) && $(MAKE) clean-build diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 1c549e31d0..6411e49a07 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include -DEXTRA_C_PROJECTIONS -pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp-pace +pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp pace_SYSPATH = From 1a9dac83d7513e9dad2815b2a291f7b810eaa3a6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 12 Oct 2023 21:52:32 -0400 Subject: [PATCH 195/417] update fix srd docs --- doc/src/fix_srd.rst | 49 +++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index 1fc574a7ad..8bfbcf2387 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -71,14 +71,15 @@ imbue the SRD particles with fluid-like properties, including an effective viscosity. Thus simulations with large solute particles can be run more quickly, to measure solute properties like diffusivity and viscosity in a background fluid. The usual LAMMPS fixes for such -simulations, such as :doc:`fix deform `, :doc:`fix viscosity `, and :doc:`fix nvt/sllod `, +simulations, such as :doc:`fix deform `, +:doc:`fix viscosity `, and :doc:`fix nvt/sllod `, can be used in conjunction with the SRD model. -For more details on how the SRD model is implemented in LAMMPS, :ref:`this paper ` describes the implementation and usage of pure SRD -fluids. :ref:`This paper `, which is nearly complete, describes -the implementation and usage of mixture systems (solute particles in -an SRD fluid). See the examples/srd directory for sample input -scripts using SRD particles in both settings. +For more details on how the SRD model is implemented in LAMMPS, +:ref:`(Petersen) ` describes the implementation and usage of +pure SRD fluids. See the ``examples/srd`` directory for sample input +scripts using SRD particles for that and for mixture systems (solute +particles in an SRD fluid). This fix does two things: @@ -357,28 +358,28 @@ These are the 12 quantities. All are values for the current timestep, except for quantity 5 and the last three, each of which are cumulative quantities since the beginning of the run. -* (1) # of SRD/big collision checks performed -* (2) # of SRDs which had a collision -* (3) # of SRD/big collisions (including multiple bounces) -* (4) # of SRD particles inside a big particle -* (5) # of SRD particles whose velocity was rescaled to be < Vmax -* (6) # of bins for collision searching -* (7) # of bins for SRD velocity rotation -* (8) # of bins in which SRD temperature was computed -* (9) SRD temperature -* (10) # of SRD particles which have undergone max # of bounces -* (11) max # of bounces any SRD particle has had in a single step -* (12) # of reneighborings due to SRD particles moving too far +(1) # of SRD/big collision checks performed +(2) # of SRDs which had a collision +(3) # of SRD/big collisions (including multiple bounces) +(4) # of SRD particles inside a big particle +(5) # of SRD particles whose velocity was rescaled to be < Vmax +(6) # of bins for collision searching +(7) # of bins for SRD velocity rotation +(8) # of bins in which SRD temperature was computed +(9) SRD temperature +(10) # of SRD particles which have undergone max # of bounces +(11) max # of bounces any SRD particle has had in a single step +(12) # of reneighborings due to SRD particles moving too far No parameter of this fix can be used with the *start/stop* keywords of -the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. Restrictions """""""""""" -This command can only be used if LAMMPS was built with the SRD -package. See the :doc:`Build package ` doc -page for more info. +This command can only be used if LAMMPS was built with the SRD package. +See the :doc:`Build package ` doc page for more info. Related commands """""""""""""""" @@ -403,7 +404,3 @@ no, and rescale = yes. **(Petersen)** Petersen, Lechman, Plimpton, Grest, in' t Veld, Schunk, J Chem Phys, 132, 174106 (2010). - -.. _Lechman: - -**(Lechman)** Lechman, et al, in preparation (2010). From 6ad5c0eced4a80b80a0c9b7aa2c3d8ee23450408 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 12 Oct 2023 23:24:11 -0400 Subject: [PATCH 196/417] port LAMMPS GUI to Qt6 while still supporting Qt5 --- tools/lammps-gui/CMakeLists.txt | 41 +++++++++++++++++++++++++------- tools/lammps-gui/chartviewer.cpp | 12 ++++++++-- tools/lammps-gui/chartviewer.h | 24 ++++++++++++------- tools/lammps-gui/lammpsgui.cpp | 16 ++++++++----- tools/lammps-gui/lammpsgui.h | 2 ++ 5 files changed, 71 insertions(+), 24 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 44fc45c0e2..83d5dc3216 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -11,6 +11,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) option(LAMMPS_GUI_USE_PLUGIN "Load LAMMPS library dynamically at runtime" OFF) mark_as_advanced(LAMMPS_GUI_USE_PLUGIN) +option(LAMMPS_GUI_USE_QT5 "Prefer using Qt5 over Qt6" OFF) # checks # when this file is included as subdirectory in the LAMMPS build, many settings are directly imported @@ -73,7 +74,15 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") endif() # we require Qt 5 and at least version 5.12 at that. -find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) +if(NOT LAMMPS_GUI_USE_QT5) + find_package(Qt6 6.2 COMPONENTS Widgets Charts) +endif() +if(NOT Qt6_FOUND) + find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) + set(QT_VERSION_MAJOR "5") +else() + set(QT_VERSION_MAJOR "6") +endif() set(PROJECT_SOURCES main.cpp @@ -105,7 +114,11 @@ set(PROJECT_SOURCES ${PLUGIN_LOADER_SRC} ${ICON_RC_FILE} ) -qt5_add_resources(PROJECT_SOURCES lammpsgui.qrc) +if(QT_VERSION_MAJOR EQUAL 6) + qt6_add_resources(PROJECT_SOURCES lammpsgui.qrc) +else() + qt5_add_resources(PROJECT_SOURCES lammpsgui.qrc) +endif() if(APPLE) set(MACOSX_ICON_FILE ${LAMMPS_DIR}/cmake/packaging/lammps.icns) @@ -113,10 +126,22 @@ if(APPLE) set(MACOSX_BACKGROUND_FILE ${LAMMPS_DIR}/cmake/packaging/LAMMPS_DMG_Background.png) endif() -add_executable(lammps-gui - ${MACOSX_ICON_FILE} - ${PROJECT_SOURCES} -) +if(QT_VERSION_MAJOR EQUAL 6) + qt_add_executable(lammps-gui + MANUAL_FINALIZATION + ${MACOSX_ICON_FILE} + ${PROJECT_SOURCES} + ) +else() + add_executable(lammps-gui + ${MACOSX_ICON_FILE} + ${PROJECT_SOURCES} + ) +endif() + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(lammps-gui) +endif() # compilation settings if(LAMMPS_GUI_USE_PLUGIN) @@ -128,7 +153,7 @@ else() endif() target_include_directories(lammps-gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(lammps-gui PRIVATE LAMMPS_GUI_VERSION="${PROJECT_VERSION}") -target_link_libraries(lammps-gui PRIVATE Qt5::Widgets Qt5::Charts) +target_link_libraries(lammps-gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${VERSION_MAJOR}::Charts) if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) @@ -209,7 +234,7 @@ elseif((CMAKE_SYSTEM_NAME STREQUAL "Windows") AND CMAKE_CROSSCOMPILING) COMMENT "Create zip file with windows binaries" BYPRODUCT LAMMPS-Win10-amd64.zip WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") +elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") AND NOT LAMMPS_GUI_USE_PLUGIN) install(TARGETS lammps-gui DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/lammps-gui.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications/) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/lammps-input.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index f28625d9dc..ab03a110b5 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -15,11 +15,19 @@ #include "lammpsgui.h" +#include +#include +#include #include +#include +#include #include +#include +#include #include #include #include +#include #include using namespace QtCharts; @@ -288,7 +296,7 @@ void ChartViewer::add_data(int step, double data) if (last_step < step) { last_step = step; series->append(step, data); - auto points = series->pointsVector(); + auto points = series->points(); qreal xmin = 1.0e100; qreal xmax = -1.0e100; @@ -309,7 +317,7 @@ void ChartViewer::add_data(int step, double data) void ChartViewer::reset_zoom() { - auto points = series->pointsVector(); + auto points = series->points(); qreal xmin = 1.0e100; qreal xmax = -1.0e100; diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 248fdad7bb..0954f4a9a8 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -14,16 +14,17 @@ #ifndef CHARTVIEWER_H #define CHARTVIEWER_H +#include #include #include #include -#include class QAction; class QMenuBar; class QMenu; -class QComboBox; +namespace QtCharts { class ChartViewer; +} class ChartWindow : public QWidget { Q_OBJECT @@ -64,12 +65,18 @@ private: QAction *closeAct, *stopAct, *quitAct; QString filename; - QList charts; + QList charts; }; /* -------------------------------------------------------------------- */ -class ChartViewer : public QtCharts::QChartView { +#include +#include +#include +#include + +namespace QtCharts { +class ChartViewer : public QChartView { Q_OBJECT public: @@ -86,11 +93,12 @@ public: private: int last_step, index; - QtCharts::QChart *chart; - QtCharts::QLineSeries *series; - QtCharts::QValueAxis *xaxis; - QtCharts::QValueAxis *yaxis; + QChart *chart; + QLineSeries *series; + QValueAxis *xaxis; + QValueAxis *yaxis; }; +} // namespace QtCharts #endif // Local Variables: diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index ba080dbec3..e0bcb38dc6 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -69,8 +70,10 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : // enforce using the plain ASCII C locale within the GUI. QLocale::setDefault(QLocale("C")); - // register QList +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + // register QList only needed for Qt5 qRegisterMetaTypeStreamOperators>("QList"); +#endif ui->setupUi(this); this->setCentralWidget(ui->textEdit); @@ -588,7 +591,8 @@ void LammpsGui::open_file(const QString &fileName) if (!file.open(QIODevice::ReadOnly | QFile::Text)) { QMessageBox::warning(this, "Warning", "Cannot open file " + path.absoluteFilePath() + ": " + - file.errorString() + ".\nWill create new file on saving editor buffer."); + file.errorString() + + ".\nWill create new file on saving editor buffer."); ui->textEdit->document()->setPlainText(QString()); } else { QTextStream in(&file); @@ -1039,9 +1043,9 @@ void LammpsGui::do_run(bool use_buffer) logwindow->document()->setDefaultFont(text_font); logwindow->setLineWrapMode(LogWindow::NoWrap); logwindow->setMinimumSize(400, 300); - QShortcut *shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), logwindow); + QShortcut *shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), logwindow); QObject::connect(shortcut, &QShortcut::activated, logwindow, &LogWindow::close); - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Slash), logwindow); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), logwindow); QObject::connect(shortcut, &QShortcut::activated, this, &LammpsGui::stop_run); if (settings.value("viewlog", true).toBool()) logwindow->show(); @@ -1058,9 +1062,9 @@ void LammpsGui::do_run(bool use_buffer) .arg(run_counter)); chartwindow->setWindowIcon(QIcon(":/icons/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), chartwindow); QObject::connect(shortcut, &QShortcut::activated, chartwindow, &ChartWindow::close); - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Slash), chartwindow); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), chartwindow); QObject::connect(shortcut, &QShortcut::activated, this, &LammpsGui::stop_run); if (settings.value("viewchart", true).toBool()) chartwindow->show(); diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index 0c622f0285..0dd34f2c49 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -16,8 +16,10 @@ #include +#include #include #include +#include #include #include From 506de7015df9c6049033f9084a6cf62420ef2b5e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 05:13:30 -0400 Subject: [PATCH 197/417] document support for building LAMMPS GUI with Qt6 --- doc/src/Tools.rst | 15 +++++++++++---- tools/lammps-gui/TODO.md | 1 - 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index a42e7c56a5..49022a4ee9 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -702,11 +702,15 @@ Prerequisites and portability LAMMPS GUI is programmed in C++ based on the C++11 standard and using the `Qt GUI framework `_. Currently, Qt version 5.12 or later is required; Qt 5.15LTS is -recommended; Qt 6.x not (yet) supported. Building LAMMPS with CMake is -required. The LAMMPS GUI has been successfully compiled and tested on: +recommended; support for Qt version 6.x is under active development and +thus far only tested with Qt 6.5LTS on Linux. Building LAMMPS with +CMake is required. + +The LAMMPS GUI has been successfully compiled and tested on: - Ubuntu Linux 20.04LTS x86_64 using GCC 9, Qt version 5.12 - Fedora Linux 38 x86\_64 using GCC 13 and Clang 16, Qt version 5.15LTS +- Fedora Linux 38 x86\_64 using GCC 13, Qt version 6.5LTS - Apple macOS 12 (Monterey) and macOS 13 (Ventura) with Xcode on arm64 and x86\_64, Qt version 5.15LTS - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.36, Qt version 5.15LTS - Windows 10 and 11 x86_64 with MinGW / GCC 10.0 cross-compiler on Fedora 38, Qt version 5.15LTS @@ -717,7 +721,7 @@ required. The LAMMPS GUI has been successfully compiled and tested on: Pre-compiled executables ^^^^^^^^^^^^^^^^^^^^^^^^ -Pre-compiled LAMMPS executables including the GUI are currently +Pre-compiled LAMMPS executable packages that include the GUI are currently available from https://download.lammps.org/static or https://github.com/lammps/lammps/releases. You can unpack the archives (or mount the macOS disk image) and run the GUI directly in place. The @@ -742,7 +746,10 @@ stored in a location where CMake can find them without additional help. Otherwise, the location of the Qt library installation must be indicated by setting ``-D Qt5_DIR=/path/to/qt5/lib/cmake/Qt5``, which is a path to a folder inside the Qt installation that contains the file -``Qt5Config.cmake``. +``Qt5Config.cmake``. Similarly, for Qt6 the location of the Qt library +installation can be indicated by setting ``-D Qt6_DIR=/path/to/qt6/lib/cmake/Qt6``, +if necessary. When both, Qt5 and Qt6 are available, Qt6 will be preferred +unless ``-D LAMMPS_GUI_USE_QT5=yes`` is set. It should be possible to build the LAMMPS GUI as a standalone compilation (e.g. when LAMMPS has been compiled with traditional make), diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index e4ca44ba3d..ee05e67225 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -23,7 +23,6 @@ LAMMPS-GUI TODO list: # Long term ideas (v2.x) - rewrite entire application to build the App and its layout manually -- port to Qt6 (with compatibility to Qt5?) - also a rewrite should establish consistent naming conventions. now we have a mix of LAMMPS style, Qt style, and others. - add option to attach a debugger to the running program (highly non-portable, need customization support in preferences) - write a "wizard" dialog that can be used for beginners to create an input file template for a few typical use scenarios From 6195be5af72baea2a7cd8870b3c0bdb615401da7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 05:59:20 -0400 Subject: [PATCH 198/417] make keyboard shortcut handling consistent across the entire app --- tools/lammps-gui/chartviewer.cpp | 7 ++++--- tools/lammps-gui/imageviewer.cpp | 5 +++-- tools/lammps-gui/logwindow.cpp | 32 +++++++++++++++++++++++++++----- tools/lammps-gui/logwindow.h | 1 + tools/lammps-gui/slideshow.cpp | 7 ++++--- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index ab03a110b5..ee29ab9540 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -61,13 +62,13 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : file->addSeparator(); stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); stopAct->setIcon(QIcon(":/icons/process-stop.png")); - stopAct->setShortcut(QKeySequence::fromString("Ctrl+/")); + stopAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash)); closeAct = file->addAction("&Close", this, &QWidget::close); closeAct->setIcon(QIcon(":/icons/window-close.png")); - closeAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + closeAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_W)); quitAct = file->addAction("&Quit", this, &ChartWindow::quit); quitAct->setIcon(QIcon(":/icons/application-exit.png")); - quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); + quitAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); auto *layout = new QVBoxLayout; layout->addLayout(top); setLayout(layout); diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index ee81f61253..7406f1860a 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -558,10 +559,10 @@ void ImageViewer::createActions() fileMenu->addSeparator(); QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); exitAct->setIcon(QIcon(":/icons/window-close.png")); - exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + exitAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_W)); QAction *quitAct = fileMenu->addAction("&Quit", this, &ImageViewer::quit); quitAct->setIcon(QIcon(":/icons/application-exit.png")); - quitAct->setShortcut(QKeySequence::fromString("Ctrl+Q")); + quitAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); } void ImageViewer::updateActions() diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index ab1886f1bd..374c4c89b1 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -35,12 +35,14 @@ LogWindow::LogWindow(const QString &_filename, QWidget *parent) : QSettings settings; resize(settings.value("logx", 500).toInt(), settings.value("logy", 320).toInt()); - auto action = new QShortcut(QKeySequence::fromString("Ctrl+S"), this); + auto action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_S), this); connect(action, &QShortcut::activated, this, &LogWindow::save_as); - action = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q), this); connect(action, &QShortcut::activated, this, &LogWindow::quit); - action = new QShortcut(QKeySequence(Qt::Key_Slash, Qt::CTRL), this); + action = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), this); connect(action, &QShortcut::activated, this, &LogWindow::stop_run); + + installEventFilter(this); } void LogWindow::closeEvent(QCloseEvent *event) @@ -99,15 +101,35 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) menu->addSeparator(); auto action = menu->addAction(QString("Save Log to File ...")); action->setIcon(QIcon(":/icons/document-save-as.png")); - action->setShortcut(QKeySequence::fromString("Ctrl+S")); + action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_S)); connect(action, &QAction::triggered, this, &LogWindow::save_as); action = menu->addAction("&Close Window", this, &QWidget::close); action->setIcon(QIcon(":/icons/window-close.png")); - action->setShortcut(QKeySequence::fromString("Ctrl+W")); + action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_W)); menu->exec(event->globalPos()); delete menu; } +// event filter to handle "Ambiguous shortcut override" issues +bool LogWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::ShortcutOverride) { + QKeyEvent *keyEvent = dynamic_cast(event); + if (!keyEvent) return QWidget::eventFilter(watched, event); + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == '/') { + stop_run(); + event->accept(); + return true; + } + if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == 'W') { + close(); + event->accept(); + return true; + } + } + return QWidget::eventFilter(watched, event); +} + // Local Variables: // c-basic-offset: 4 // End: diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 8923e35ee5..ad0691d0cc 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -30,6 +30,7 @@ private slots: protected: void closeEvent(QCloseEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: QString filename; diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index de7742f22f..92eca9a530 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -50,11 +51,11 @@ SlideShow::SlideShow(const QString &fileName, QWidget *parent) : imageName->setAlignment(Qt::AlignCenter); imageName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - auto *shortcut = new QShortcut(QKeySequence::fromString("Ctrl+W"), this); + auto *shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), this); QObject::connect(shortcut, &QShortcut::activated, this, &QWidget::close); - shortcut = new QShortcut(QKeySequence::fromString("Ctrl+/"), this); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Slash), this); QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::stop_run); - shortcut = new QShortcut(QKeySequence::fromString("Ctrl+Q"), this); + shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q), this); QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::quit); buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); From 3ebcb0f6f18cf68c38ae89a4c0b65911fda5c90d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:00:29 -0400 Subject: [PATCH 199/417] store settings to different locations for different Qt versions --- tools/lammps-gui/lammpsgui.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index e0bcb38dc6..11f2554b55 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -84,9 +84,13 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : // use $HOME if we get dropped to "/" like on macOS if (current_dir == "/") current_dir = QDir::homePath(); +#define stringify(x) myxstr(x) +#define myxstr(x) #x QCoreApplication::setOrganizationName("The LAMMPS Developers"); QCoreApplication::setOrganizationDomain("lammps.org"); - QCoreApplication::setApplicationName("LAMMPS GUI"); + QCoreApplication::setApplicationName("LAMMPS GUI - QT" stringify(QT_VERSION_MAJOR)); +#undef stringify +#undef myxstr // restore and initialize settings QSettings settings; From d29ae7af92a2d6716cb106eb02b4296000b5886e Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Fri, 13 Oct 2023 12:05:28 +0200 Subject: [PATCH 200/417] upd ML-PACE.cmake and Install.py (new version v.2023.10.04 and checksum) that should fix build issues with KOKOKOS --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- lib/pace/Install.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 30aa433a58..ce8f02f5f4 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.10.04.pre.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.10.04.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "61ba11a37ee00de8365b18b521d394a6" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "70ff79f4e59af175e55d24f3243ad1ff" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) GetFallbackURL(PACELIB_URL PACELIB_FALLBACK) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 2a8cd2f1f3..8d31852e44 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum, getfallback # settings thisdir = fullpath('.') -version ='v.2023.10.04.pre' +version ='v.2023.10.04' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2023.10.04.pre': '61ba11a37ee00de8365b18b521d394a6' + 'v.2023.10.04': '70ff79f4e59af175e55d24f3243ad1ff' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") From 262913695824a407091b16a493cd1165f0fff591 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:18:34 -0400 Subject: [PATCH 201/417] avoid uninitialized data access and segfaults when calling main widget functions --- tools/lammps-gui/chartviewer.cpp | 8 ++++---- tools/lammps-gui/imageviewer.cpp | 4 ++-- tools/lammps-gui/logwindow.cpp | 8 ++++---- tools/lammps-gui/preferences.cpp | 4 ++-- tools/lammps-gui/slideshow.cpp | 8 ++++---- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index ee29ab9540..c981b2777d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -124,10 +124,10 @@ void ChartWindow::add_data(int step, double data, int index) void ChartWindow::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void ChartWindow::reset_zoom() @@ -138,10 +138,10 @@ void ChartWindow::reset_zoom() void ChartWindow::stop_run() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->stop_run(); + if (main) main->stop_run(); } void ChartWindow::saveAs() diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 7406f1860a..00b08f3f47 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -533,10 +533,10 @@ void ImageViewer::copy() {} void ImageViewer::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void ImageViewer::saveFile(const QString &fileName) diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 374c4c89b1..73ec81d06c 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -57,18 +57,18 @@ void LogWindow::closeEvent(QCloseEvent *event) void LogWindow::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void LogWindow::stop_run() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->stop_run(); + if (main) main->stop_run(); } void LogWindow::save_as() diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index c760e6610b..f7fe9ec025 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -286,12 +286,12 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa void GeneralTab::updatefonts(const QFont &all, const QFont &text) { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); QApplication::setFont(all); - main->ui->textEdit->document()->setDefaultFont(text); + if (main) main->ui->textEdit->document()->setDefaultFont(text); } void GeneralTab::newallfont() diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index 92eca9a530..140c703ca3 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -199,18 +199,18 @@ void SlideShow::loadImage(int idx) void SlideShow::quit() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->quit(); + if (main) main->quit(); } void SlideShow::stop_run() { - LammpsGui *main; + LammpsGui *main = nullptr; for (QWidget *widget : QApplication::topLevelWidgets()) if (widget->objectName() == "LammpsGui") main = dynamic_cast(widget); - main->stop_run(); + if (main) main->stop_run(); } void SlideShow::movie() From 926de1575c74d98cec2319c54ef4ddc2b75e4ad0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:18:56 -0400 Subject: [PATCH 202/417] avoid completion on empty lines --- tools/lammps-gui/codeeditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index b7a14871b7..f374b098e2 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -568,6 +568,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) if (automatic_completion) { auto cursor = textCursor(); auto line = cursor.block().text(); + if (line.isEmpty()) return; // QTextCursor::WordUnderCursor is unusable here since recognizes '/' as word boundary. // Work around it by manually searching for the location of the beginning of the word. From 3db7e1f9cf3b370da126dbe9b4d667d108833735 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:50:06 -0400 Subject: [PATCH 203/417] avoid invalid data accesses --- tools/lammps-gui/chartviewer.cpp | 5 ++++- tools/lammps-gui/chartviewer.h | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index c981b2777d..fbd888f1cd 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -85,7 +85,10 @@ int ChartWindow::get_step() const { if (charts.size() > 0) { auto *v = charts[0]; - return (int)v->get_step(v->get_count() - 1); + if (v) + return (int)v->get_step(v->get_count() - 1); + else + return -1; } else { return -1; } diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index 0954f4a9a8..da0468eaf8 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -88,8 +88,8 @@ public: int get_index() const { return index; }; int get_count() const { return series->count(); } const char *get_title() const { return series->name().toLocal8Bit(); } - double get_step(int index) const { return series->at(index).x(); } - double get_data(int index) const { return series->at(index).y(); } + double get_step(int index) const { return (index < 0) ? 0.0 : series->at(index).x(); } + double get_data(int index) const { return (index < 0) ? 0.0 : series->at(index).y(); } private: int last_step, index; From 50d2ebc27d7fd96cc94153540d953a02d9abd5bf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:50:52 -0400 Subject: [PATCH 204/417] auto-detect OpenMP support also when compiling a standalone binary --- tools/lammps-gui/CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 83d5dc3216..edfeeb1128 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -13,6 +13,41 @@ option(LAMMPS_GUI_USE_PLUGIN "Load LAMMPS library dynamically at runtime" OFF) mark_as_advanced(LAMMPS_GUI_USE_PLUGIN) option(LAMMPS_GUI_USE_QT5 "Prefer using Qt5 over Qt6" OFF) +include(CheckIncludeFileCXX) +# helper function to check for usable omp.h header +function(check_omp_h_include) + find_package(OpenMP COMPONENTS CXX QUIET) + if(OpenMP_CXX_FOUND) + set(CMAKE_REQUIRED_FLAGS ${OpenMP_CXX_FLAGS}) + set(CMAKE_REQUIRED_INCLUDES ${OpenMP_CXX_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LINK_OPTIONS ${OpenMP_CXX_FLAGS}) + set(CMAKE_REQUIRED_LIBRARIES ${OpenMP_CXX_LIBRARIES}) + check_include_file_cxx(omp.h _have_omp_h) + else() + set(_have_omp_h FALSE) + endif() + set(HAVE_OMP_H_INCLUDE ${_have_omp_h} PARENT_SCOPE) +endfunction() + +# detect if we may enable OpenMP support by default +set(BUILD_OMP_DEFAULT OFF) +find_package(OpenMP COMPONENTS CXX QUIET) +if(OpenMP_CXX_FOUND) + check_omp_h_include() + if(HAVE_OMP_H_INCLUDE) + set(BUILD_OMP_DEFAULT ON) + endif() +endif() + +option(BUILD_OMP "Build with OpenMP support" ${BUILD_OMP_DEFAULT}) +if(BUILD_OMP) + find_package(OpenMP COMPONENTS CXX REQUIRED) + check_omp_h_include() + if(NOT HAVE_OMP_H_INCLUDE) + message(FATAL_ERROR "Cannot find the 'omp.h' header file required for full OpenMP support") + endif() +endif() + # checks # when this file is included as subdirectory in the LAMMPS build, many settings are directly imported if(LAMMPS_DIR) From 2f6782636382e25eb832292606951ac387d2a3e7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 06:59:06 -0400 Subject: [PATCH 205/417] indicate whether multi-thread is available in preferences --- tools/lammps-gui/preferences.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index f7fe9ec025..fd01bb5046 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -410,11 +410,19 @@ AcceleratorTab::AcceleratorTab(QSettings *_settings, LammpsWrapper *_lammps, QWi #endif auto *choices = new QFrame; auto *choiceLayout = new QVBoxLayout; +#if defined(_OPENMP) auto *ntlabel = new QLabel(QString("Number of threads (max %1):").arg(maxthreads)); auto *ntchoice = new QLineEdit(settings->value("nthreads", maxthreads).toString()); +#else + auto *ntlabel = new QLabel(QString("Number of threads (OpenMP not available):")); + auto *ntchoice = new QLineEdit("1"); +#endif auto *intval = new QIntValidator(1, maxthreads, this); ntchoice->setValidator(intval); ntchoice->setObjectName("nthreads"); +#if !defined(_OPENMP) + ntchoice->setEnabled(false); +#endif choiceLayout->addWidget(ntlabel); choiceLayout->addWidget(ntchoice); From ae8791c6820ca858b809237aef7a229ae815ffbb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 08:17:10 -0400 Subject: [PATCH 206/417] avoid out of bounds access to string under cursor --- tools/lammps-gui/codeeditor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index f374b098e2..e95f576be0 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -572,7 +572,8 @@ void CodeEditor::keyPressEvent(QKeyEvent *event) // QTextCursor::WordUnderCursor is unusable here since recognizes '/' as word boundary. // Work around it by manually searching for the location of the beginning of the word. - int begin = cursor.positionInBlock(); + int begin = qMin(cursor.positionInBlock(), line.length() - 1); + while (begin >= 0) { if (line[begin].isSpace()) break; --begin; @@ -749,7 +750,7 @@ void CodeEditor::runCompletion() // QTextCursor::WordUnderCursor is unusable here since it recognizes '/' as word boundary. // Work around it by manually searching for the beginning and end position of the word // under the cursor and then using that substring. - int begin = cursor.positionInBlock(); + int begin = qMin(cursor.positionInBlock(), line.length() - 1); line = cursor.block().text(); while (begin >= 0) { if (line[begin].isSpace()) break; From d8e6b432fa537efde99ac561cd3e66a3fb8f1482 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 13 Oct 2023 10:48:37 -0600 Subject: [PATCH 207/417] Port recent changes --- src/KOKKOS/pair_yukawa_colloid_kokkos.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.h b/src/KOKKOS/pair_yukawa_colloid_kokkos.h index 060b621a8a..83ce58e898 100644 --- a/src/KOKKOS/pair_yukawa_colloid_kokkos.h +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.h @@ -96,19 +96,21 @@ class PairYukawaColloidKokkos : public PairYukawaColloid { int nlocal,nall,eflag,vflag; void allocate() override; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend struct PairComputeFunctor; + friend struct PairComputeFunctor; + friend struct PairComputeFunctor; friend struct PairComputeFunctor; friend struct PairComputeFunctor; - friend EV_FLOAT pair_compute_neighlist( + friend EV_FLOAT pair_compute_neighlist(PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairYukawaColloidKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( PairYukawaColloidKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( + friend EV_FLOAT pair_compute_neighlist( PairYukawaColloidKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute_neighlist( - PairYukawaColloidKokkos*,NeighListKokkos*); - friend EV_FLOAT pair_compute( + friend EV_FLOAT pair_compute( PairYukawaColloidKokkos*,NeighListKokkos*); friend void pair_virial_fdotr_compute(PairYukawaColloidKokkos*); From 41a7f648474cb2ef34550323d0f030c53dba7f70 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 13 Oct 2023 10:58:14 -0600 Subject: [PATCH 208/417] Update dependency --- src/Depend.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Depend.sh b/src/Depend.sh index b88c527b55..dbffb2dba0 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -64,6 +64,7 @@ fi if (test $1 = "COLLOID") then depend GPU + depend KOKKOS depend OPENMP fi From 6c6f35dd690a7b5bc5e276035f0889555051035b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 14:39:20 -0400 Subject: [PATCH 209/417] modernize loops over fixes --- src/KOKKOS/atom_kokkos.cpp | 42 +++++++++++------------------- src/KOKKOS/fix_dt_reset_kokkos.cpp | 2 +- src/KOKKOS/neigh_bond_kokkos.cpp | 5 ++-- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index f118b2a204..e97213cb4b 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -132,27 +132,20 @@ void AtomKokkos::init() void AtomKokkos::update_property_atom() { - nprop_atom = 0; - for (int ifix = 0; ifix < modify->nfix; ifix++) { - if (modify->fix[ifix] && utils::strmatch(modify->fix[ifix]->style, "^property/atom")) { - auto fix_i = modify->fix[ifix]; - if (!fix_i->kokkosable) - error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); + std::vector prop_atom_fixes; + for (auto &ifix : modify->get_fix_by_style("^property/atom")) { + if (!ifix->kokkosable) + error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); - memory->grow(prop_atom,nprop_atom+1,"atom::prop_atom"); - prop_atom[nprop_atom++] = ifix; - } + prop_atom_fixes.push_back(ifix); } - delete [] fix_prop_atom; - fix_prop_atom = new FixPropertyAtomKokkos*[nprop_atom]; + delete[] fix_prop_atom; + fix_prop_atom = new FixPropertyAtomKokkos *[prop_atom_fixes.size()]; - for (int n = 0; n < nprop_atom; n++) { - auto fix_n = dynamic_cast(modify->fix[prop_atom[n]]); - fix_prop_atom[n] = fix_n; - } - - memory->destroy(prop_atom); + int n = 0; + for (auto &ifix : prop_atom_fixes) + fix_prop_atom[n++] = dynamic_cast(ifix); } /* ---------------------------------------------------------------------- */ @@ -161,13 +154,11 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) { if (space == Device && lmp->kokkos->auto_sync) { avecKK->modified(Host, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->modified(Host, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->modified(Host, mask); } avecKK->sync(space, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->sync(space, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->sync(space, mask); } /* ---------------------------------------------------------------------- */ @@ -175,13 +166,11 @@ void AtomKokkos::sync(const ExecutionSpace space, unsigned int mask) void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) { avecKK->modified(space, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->modified(space, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->modified(space, mask); if (space == Device && lmp->kokkos->auto_sync) { avecKK->sync(Host, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->sync(Host, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->sync(Host, mask); } } @@ -190,8 +179,7 @@ void AtomKokkos::modified(const ExecutionSpace space, unsigned int mask) void AtomKokkos::sync_overlapping_device(const ExecutionSpace space, unsigned int mask) { avecKK->sync_overlapping_device(space, mask); - for (int n = 0; n < nprop_atom; n++) - fix_prop_atom[n]->sync_overlapping_device(space, mask); + for (int n = 0; n < nprop_atom; n++) fix_prop_atom[n]->sync_overlapping_device(space, mask); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/fix_dt_reset_kokkos.cpp b/src/KOKKOS/fix_dt_reset_kokkos.cpp index f3435e711e..4c7545cee0 100644 --- a/src/KOKKOS/fix_dt_reset_kokkos.cpp +++ b/src/KOKKOS/fix_dt_reset_kokkos.cpp @@ -113,7 +113,7 @@ void FixDtResetKokkos::end_of_step() update->dt = dt; update->dt_default = 0; if (force->pair) force->pair->reset_dt(); - for (int i = 0; i < modify->nfix; i++) modify->fix[i]->reset_dt(); + for (auto &ifix : modify->get_fix_list()) ifix->reset_dt(); output->reset_dt(); } diff --git a/src/KOKKOS/neigh_bond_kokkos.cpp b/src/KOKKOS/neigh_bond_kokkos.cpp index 4cfe440b1f..b749590779 100644 --- a/src/KOKKOS/neigh_bond_kokkos.cpp +++ b/src/KOKKOS/neigh_bond_kokkos.cpp @@ -112,9 +112,8 @@ void NeighBondKokkos::init_topology_kk() { int i,m; int bond_off = 0; int angle_off = 0; - for (i = 0; i < modify->nfix; i++) - if ((strcmp(modify->fix[i]->style,"shake") == 0) - || (strcmp(modify->fix[i]->style,"rattle") == 0)) + for (const auto &ifix : modify->get_fix_list()) + if (utils::strmatch(ifix->style,"^shake") || utils::strmatch(ifix->style,"^rattle")) bond_off = angle_off = 1; if (force->bond && force->bond_match("quartic")) bond_off = 1; From 69d82b9bc6dbbbfed3a31e9f55891f906d33f22e Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 13 Oct 2023 12:47:46 -0600 Subject: [PATCH 210/417] Remove unused variable --- src/KOKKOS/atom_kokkos.cpp | 1 - src/KOKKOS/atom_kokkos.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index e97213cb4b..554afec210 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -46,7 +46,6 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) h_tag_max = Kokkos::subview(h_tag_min_max,1); nprop_atom = 0; - prop_atom = nullptr; fix_prop_atom = nullptr; } diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index 26ea7da296..21a9aeebbd 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -27,7 +27,6 @@ class AtomKokkos : public Atom { public: bool sort_classic; int nprop_atom; - int* prop_atom; FixPropertyAtomKokkos** fix_prop_atom; DAT::tdual_tagint_1d k_tag; From 65bd04260bc73ba2472b0ec59f96c98cbff72296 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Oct 2023 14:50:03 -0400 Subject: [PATCH 211/417] bugfix for modernization --- src/KOKKOS/atom_kokkos.cpp | 5 +++-- src/KOKKOS/atom_kokkos.h | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index e97213cb4b..bc393b29d8 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -46,7 +46,6 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) h_tag_max = Kokkos::subview(h_tag_min_max,1); nprop_atom = 0; - prop_atom = nullptr; fix_prop_atom = nullptr; } @@ -132,16 +131,18 @@ void AtomKokkos::init() void AtomKokkos::update_property_atom() { + nprop_atom = 0; std::vector prop_atom_fixes; for (auto &ifix : modify->get_fix_by_style("^property/atom")) { if (!ifix->kokkosable) error->all(FLERR, "KOKKOS package requires a Kokkos-enabled version of fix property/atom"); + ++nprop_atom; prop_atom_fixes.push_back(ifix); } delete[] fix_prop_atom; - fix_prop_atom = new FixPropertyAtomKokkos *[prop_atom_fixes.size()]; + fix_prop_atom = new FixPropertyAtomKokkos *[nprop_atom]; int n = 0; for (auto &ifix : prop_atom_fixes) diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index 26ea7da296..21a9aeebbd 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -27,7 +27,6 @@ class AtomKokkos : public Atom { public: bool sort_classic; int nprop_atom; - int* prop_atom; FixPropertyAtomKokkos** fix_prop_atom; DAT::tdual_tagint_1d k_tag; From f93ff98728ae788f1a2254d6f25271c0ce826dcb Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 11:20:06 -0600 Subject: [PATCH 212/417] Fix issues with trim lists --- src/KOKKOS/neighbor_kokkos.cpp | 3 ++- src/KOKKOS/npair_trim_kokkos.cpp | 12 ++++++------ src/npair_trim.cpp | 8 ++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp index 0b40bce841..efb1247560 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -308,7 +308,8 @@ void NeighborKokkos::build_kokkos(int topoflag) for (i = 0; i < npair_perpetual; i++) { m = plist[i]; if (!lists[m]->kokkos) atomKK->sync(Host,ALL_MASK); - if (!lists[m]->copy) lists[m]->grow(nlocal,nall); + if (!lists[m]->copy || lists[m]->trim || lists[m]->kk2cpu) + lists[m]->grow(nlocal,nall); neigh_pair[m]->build_setup(); neigh_pair[m]->build(lists[m]); } diff --git a/src/KOKKOS/npair_trim_kokkos.cpp b/src/KOKKOS/npair_trim_kokkos.cpp index 97931bf250..d04d8676d7 100644 --- a/src/KOKKOS/npair_trim_kokkos.cpp +++ b/src/KOKKOS/npair_trim_kokkos.cpp @@ -62,8 +62,8 @@ void NPairTrimKokkos::trim_to_kokkos(NeighList *list) d_ilist_copy = k_list_copy->d_ilist; d_numneigh_copy = k_list_copy->d_numneigh; d_neighbors_copy = k_list_copy->d_neighbors; - int inum_copy = list->listcopy->inum; - if (list->ghost) inum_copy += list->listcopy->gnum; + int inum_trim = list->listcopy->inum; + if (list->ghost) inum_trim += list->listcopy->gnum; NeighListKokkos* k_list = static_cast*>(list); k_list->maxneighs = k_list_copy->maxneighs; // simple, but could be made more memory efficient @@ -75,7 +75,7 @@ void NPairTrimKokkos::trim_to_kokkos(NeighList *list) // loop over parent list and trim copymode = 1; - Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_copy),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_trim),*this); copymode = 0; list->inum = k_list_copy->inum; @@ -132,8 +132,8 @@ void NPairTrimKokkos::trim_to_cpu(NeighList *list) int inum = listcopy->inum; int gnum = listcopy->gnum; - int inum_all = inum; - if (list->ghost) inum_all += gnum; + int inum_trim = inum; + if (list->ghost) inum_trim += gnum; auto h_ilist = listcopy_kk->k_ilist.h_view; auto h_numneigh = Kokkos::create_mirror_view_and_copy(LMPHostType(),listcopy_kk->d_numneigh); auto h_neighbors = Kokkos::create_mirror_view_and_copy(LMPHostType(),listcopy_kk->d_neighbors); @@ -151,7 +151,7 @@ void NPairTrimKokkos::trim_to_cpu(NeighList *list) MyPage *ipage = list->ipage; ipage->reset(); - for (int ii = 0; ii < inum_all; ii++) { + for (int ii = 0; ii < inum_trim; ii++) { int n = 0; neighptr = ipage->vget(); diff --git a/src/npair_trim.cpp b/src/npair_trim.cpp index 14974d72ab..a4b6c1c6a1 100644 --- a/src/npair_trim.cpp +++ b/src/npair_trim.cpp @@ -50,11 +50,15 @@ void NPairTrim::build(NeighList *list) int *numneigh_copy = listcopy->numneigh; int **firstneigh_copy = listcopy->firstneigh; int inum = listcopy->inum; + int gnum = listcopy->gnum; list->inum = inum; - list->gnum = listcopy->gnum; + list->gnum = gnum; - for (ii = 0; ii < inum; ii++) { + int inum_trim = inum; + if (list->ghost) inum_trim += gnum; + + for (ii = 0; ii < inum_trim; ii++) { n = 0; neighptr = ipage->vget(); From 902e996f2ab23553312753e813613007b94b414b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 16 Oct 2023 13:51:16 -0400 Subject: [PATCH 213/417] restore neighbor list trimming support to REBO family of pair styles --- src/MANYBODY/pair_airebo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index e34283f71c..129b9d2218 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -59,7 +59,6 @@ PairAIREBO::PairAIREBO(LAMMPS *lmp) nextra = 3; pvector = new double[nextra]; - trim_flag = 0; // workaround maxlocal = 0; REBO_numneigh = nullptr; REBO_firstneigh = nullptr; From ad1400ac71ba8b6f305275e97817539c04e054c6 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 12:33:21 -0600 Subject: [PATCH 214/417] Fix broken example --- examples/mliap/in.mliap.quadratic.compute | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mliap/in.mliap.quadratic.compute b/examples/mliap/in.mliap.quadratic.compute index 929dbf3824..cc9ad331b5 100644 --- a/examples/mliap/in.mliap.quadratic.compute +++ b/examples/mliap/in.mliap.quadratic.compute @@ -65,7 +65,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_100 equal c_db[2][100] +variable db_2_100 equal C_db[2][100] # test output: 1: total potential energy # 2: xy component of stress tensor From 462a3935fea188aea0863f300a65fad0b8e35b1b Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 14:07:42 -0600 Subject: [PATCH 215/417] Port bugfix to Kokkos --- src/KOKKOS/npair_halffull_kokkos.cpp | 17 +++ src/KOKKOS/npair_halffull_kokkos.h | 4 +- src/KOKKOS/npair_kokkos.cpp | 164 ++++++++++++++++++++------- src/KOKKOS/npair_kokkos.h | 6 +- 4 files changed, 143 insertions(+), 48 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index ec17cec844..bc2549aa8d 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -18,6 +18,7 @@ #include "atom_masks.h" #include "atom_vec.h" #include "domain.h" +#include "force.h" #include "neigh_list_kokkos.h" #include @@ -66,6 +67,9 @@ void NPairHalffullKokkos::build(NeighList *list) d_numneigh = k_list->d_numneigh; d_neighbors = k_list->d_neighbors; + delta = 0.01 * force->angstrom; + triclinic = domain->triclinic; + // loop over parent full list copymode = 1; @@ -92,6 +96,11 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom } // loop over full neighbor list + // use i < j < nlocal to eliminate half the local/local interactions + // for triclinic, must use delta to eliminate half the local/ghost interactions + // cannot use I/J exact coord comparision as for orthog + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon const int jnum = d_numneigh_full(i); const AtomNeighbors neighbors_i = AtomNeighbors(&d_neighbors(i,0),d_numneigh(i), @@ -103,6 +112,14 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom if (NEWTON) { if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } else { if (x(j,2) < ztmp) continue; if (x(j,2) == ztmp) { diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index c5a09f0b62..1249a9ce8a 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -257,8 +257,8 @@ class NPairHalffullKokkos : public NPair { void operator()(TagNPairHalffullCompute, const int&) const; private: - int nlocal; - double cutsq_custom; + int nlocal,triclinic; + double cutsq_custom,delta; typename AT::t_x_array_randomread x; diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 06567cbeb6..8201ae028b 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -155,6 +155,8 @@ void NPairKokkos::build(NeighList *list_) list->grow(nall); + const double delta = 0.01 * force->angstrom; + NeighborKokkosExecute data(*list, k_cutneighsq.view(), @@ -176,7 +178,7 @@ void NPairKokkos::build(NeighList *list_) atomKK->molecular, nbinx,nbiny,nbinz,mbinx,mbiny,mbinz,mbinxlo,mbinylo,mbinzlo, bininvx,bininvy,bininvz, - exclude, nex_type, + delta, exclude, nex_type, k_ex1_type.view(), k_ex2_type.view(), k_ex_type.view(), @@ -239,7 +241,7 @@ void NPairKokkos::build(NeighList *list_) if (GHOST) { // assumes newton off - NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); // temporarily disable team policy for ghost due to known bug @@ -261,7 +263,7 @@ void NPairKokkos::build(NeighList *list_) //#endif } else { if (SIZE) { - NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 7 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU if (ExecutionSpaceFromDevice::space == Device) { int team_size = atoms_per_bin*factor; @@ -279,7 +281,7 @@ void NPairKokkos::build(NeighList *list_) Kokkos::parallel_for(nall, f); #endif } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctor f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU if (ExecutionSpaceFromDevice::space == Device) { int team_size = atoms_per_bin*factor; @@ -414,6 +416,7 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); + const tagint itag = tag(i); const int ibin = c_atom2bin(i); @@ -484,13 +487,29 @@ void NeighborKokkosExecute:: if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = tag(j); + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -568,8 +587,9 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic size_t sharedsize) const { auto* sharedmem = static_cast(dev.team_shmem().get_shmem(sharedsize)); - /* loop over atoms in i's bin, - */ + + // loop over atoms in i's bin + const int atoms_per_bin = c_bins.extent(1); const int BINS_PER_TEAM = dev.team_size()/atoms_per_bin <1?1:dev.team_size()/atoms_per_bin; const int TEAMS_PER_BIN = atoms_per_bin/dev.team_size()<1?1:atoms_per_bin/dev.team_size(); @@ -579,15 +599,14 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 5*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[4 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[5 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; for (int kk = 0; kk < TEAMS_PER_BIN; kk++) { const int MY_II = dev.team_rank()%atoms_per_bin+kk*dev.team_size(); const int i = MY_II < bincount_current ? c_bins(ibin, MY_II) : -1; - /* if necessary, goto next page and add pages */ int n = 0; @@ -608,6 +627,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; + other_x[MY_II + 4 * atoms_per_bin] = itag; } other_id[MY_II] = i; @@ -695,6 +715,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -708,13 +729,29 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = other_x[m + 4 * atoms_per_bin]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -794,6 +831,7 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); + const tagint itag = tag(i); const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; @@ -905,6 +943,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team size_t sharedsize) const { auto* sharedmem = static_cast(dev.team_shmem().get_shmem(sharedsize)); + // loop over atoms in i's bin const int atoms_per_bin = c_bins.extent(1); @@ -916,8 +955,8 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 5*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[4 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[5 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; @@ -944,6 +983,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; + other_x[MY_II + 4 * atoms_per_bin] = itag; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -999,6 +1039,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -1084,6 +1125,7 @@ void NeighborKokkosExecute:: const X_FLOAT ztmp = x(i, 2); const X_FLOAT radi = radius(i); const int itype = type(i); + const tagint itag = tag(i); const int ibin = c_atom2bin(i); @@ -1167,13 +1209,29 @@ void NeighborKokkosExecute:: if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = tag(j); + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -1245,8 +1303,9 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP size_t sharedsize) const { auto* sharedmem = static_cast(dev.team_shmem().get_shmem(sharedsize)); - /* loop over atoms in i's bin, - */ + + // loop over atoms in i's bin + const int atoms_per_bin = c_bins.extent(1); const int BINS_PER_TEAM = dev.team_size()/atoms_per_bin <1?1:dev.team_size()/atoms_per_bin; const int TEAMS_PER_BIN = atoms_per_bin/dev.team_size()<1?1:atoms_per_bin/dev.team_size(); @@ -1256,15 +1315,14 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[5 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 7*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[6 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; for (int kk = 0; kk < TEAMS_PER_BIN; kk++) { const int MY_II = dev.team_rank()%atoms_per_bin+kk*dev.team_size(); const int i = MY_II < bincount_current ? c_bins(ibin, MY_II) : -1; - /* if necessary, goto next page and add pages */ int n = 0; @@ -1288,7 +1346,8 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = radi; + other_x[MY_II + 4 * atoms_per_bin] = itag; + other_x[MY_II + 5 * atoms_per_bin] = radi; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -1323,7 +1382,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { @@ -1380,7 +1439,8 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = radius(j); + other_x[MY_II + 4 * atoms_per_bin] = tag(j); + other_x[MY_II + 5 * atoms_per_bin] = radius(j); } other_id[MY_II] = j; @@ -1394,13 +1454,29 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP if (HalfNeigh && !Newton && j <= i) continue; if (!HalfNeigh && j == i) continue; + + // for triclinic, bin stencil is full in all 3 dims + // must use itag/jtag to eliminate half the I/J interactions + // cannot use I/J exact coord comparision + // b/c transforming orthog -> lambda -> orthog for ghost atoms + // with an added PBC offset can shift all 3 coords by epsilon + if (HalfNeigh && Newton && Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; + if (j <= i) continue; + if (j >= nlocal) { + const tagint jtag = other_x[m + 4 * atoms_per_bin]; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (fabs(x(j,2)-ztmp) > delta) { + if (x(j,2) < ztmp) continue; + } else if (fabs(x(j,1)-ytmp) > delta) { + if (x(j,1) < ytmp) continue; + } else { + if (x(j,0) < xtmp) continue; + } } } } @@ -1412,7 +1488,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 4427012926..fe5484a771 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -189,6 +189,8 @@ class NeighborKokkosExecute public: NeighListKokkos neigh_list; + const double delta; + // data from Neighbor class const typename AT::t_xfloat_2d_randomread cutneighsq; @@ -282,7 +284,7 @@ class NeighborKokkosExecute const int & _mbinx,const int & _mbiny,const int & _mbinz, const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo, const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz, - const int & _exclude,const int & _nex_type, + const double &_delta,const int & _exclude,const int & _nex_type, const typename AT::t_int_1d_const & _ex1_type, const typename AT::t_int_1d_const & _ex2_type, const typename AT::t_int_2d_const & _ex_type, @@ -301,7 +303,7 @@ class NeighborKokkosExecute 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),exclude(_exclude), + neigh_list(_neigh_list), cutneighsq(_cutneighsq),delta(_delta),exclude(_exclude), nex_type(_nex_type),ex1_type(_ex1_type),ex2_type(_ex2_type), ex_type(_ex_type),nex_group(_nex_group), ex1_bit(_ex1_bit),ex2_bit(_ex2_bit), From 8c7493d02a9ce2f2f9171ac9a26fd155703f7a5f Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 15:11:37 -0600 Subject: [PATCH 216/417] Fix more broken examples --- examples/mliap/in.mliap.snap.compute | 2 +- examples/snap/in.grid.snap | 2 +- examples/snap/in.grid.tri | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/mliap/in.mliap.snap.compute b/examples/mliap/in.mliap.snap.compute index 4cfccedbdf..c49365f55f 100644 --- a/examples/mliap/in.mliap.snap.compute +++ b/examples/mliap/in.mliap.snap.compute @@ -65,7 +65,7 @@ compute bsum2 snapgroup2 reduce sum c_b[*] # fix bsum2 all ave/time 1 1 1 c_bsum2 file bsum2.dat mode vector compute vbsum all reduce sum c_vb[*] # fix vbsum all ave/time 1 1 1 c_vbsum file vbsum.dat mode vector -variable db_2_25 equal c_db[2][25] +variable db_2_25 equal C_db[2][25] thermo 100 diff --git a/examples/snap/in.grid.snap b/examples/snap/in.grid.snap index 08c95a004f..d37b6ffde4 100644 --- a/examples/snap/in.grid.snap +++ b/examples/snap/in.grid.snap @@ -67,7 +67,7 @@ compute mygridlocal all sna/grid/local grid ${ngrid} ${ngrid} ${ngrid} & # define output -variable B5atom equal c_b[2][5] +variable B5atom equal C_b[2][5] variable B5grid equal c_mygrid[8][8] variable rmse_global equal "sqrt( & diff --git a/examples/snap/in.grid.tri b/examples/snap/in.grid.tri index 5283957eb8..b34c9dba30 100644 --- a/examples/snap/in.grid.tri +++ b/examples/snap/in.grid.tri @@ -87,7 +87,7 @@ compute mygridlocal all sna/grid/local grid ${ngridx} ${ngridy} ${ngridz} & # define output -variable B5atom equal c_b[7][5] +variable B5atom equal C_b[7][5] variable B5grid equal c_mygrid[13][8] # do not compare x,y,z because assignment of ids From dc67f2527061b036da95c8fd151eb25da57abde3 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 16 Oct 2023 15:17:46 -0600 Subject: [PATCH 217/417] Another tweak --- examples/snap/in.grid.snap | 10 +++++----- examples/snap/in.grid.tri | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/snap/in.grid.snap b/examples/snap/in.grid.snap index d37b6ffde4..da48957d97 100644 --- a/examples/snap/in.grid.snap +++ b/examples/snap/in.grid.snap @@ -74,11 +74,11 @@ variable rmse_global equal "sqrt( & (c_mygrid[8][1] - x[2])^2 + & (c_mygrid[8][2] - y[2])^2 + & (c_mygrid[8][3] - z[2])^2 + & - (c_mygrid[8][4] - c_b[2][1])^2 + & - (c_mygrid[8][5] - c_b[2][2])^2 + & - (c_mygrid[8][6] - c_b[2][3])^2 + & - (c_mygrid[8][7] - c_b[2][4])^2 + & - (c_mygrid[8][8] - c_b[2][5])^2 & + (c_mygrid[8][4] - C_b[2][1])^2 + & + (c_mygrid[8][5] - C_b[2][2])^2 + & + (c_mygrid[8][6] - C_b[2][3])^2 + & + (c_mygrid[8][7] - C_b[2][4])^2 + & + (c_mygrid[8][8] - C_b[2][5])^2 & )" thermo_style custom step v_B5atom v_B5grid v_rmse_global diff --git a/examples/snap/in.grid.tri b/examples/snap/in.grid.tri index b34c9dba30..95a14f3bb4 100644 --- a/examples/snap/in.grid.tri +++ b/examples/snap/in.grid.tri @@ -94,11 +94,11 @@ variable B5grid equal c_mygrid[13][8] # to atoms is not unnique for different processor grids variable rmse_global equal "sqrt( & - (c_mygrid[13][4] - c_b[7][1])^2 + & - (c_mygrid[13][5] - c_b[7][2])^2 + & - (c_mygrid[13][6] - c_b[7][3])^2 + & - (c_mygrid[13][7] - c_b[7][4])^2 + & - (c_mygrid[13][8] - c_b[7][5])^2 & + (c_mygrid[13][4] - C_b[7][1])^2 + & + (c_mygrid[13][5] - C_b[7][2])^2 + & + (c_mygrid[13][6] - C_b[7][3])^2 + & + (c_mygrid[13][7] - C_b[7][4])^2 + & + (c_mygrid[13][8] - C_b[7][5])^2 & )" thermo_style custom step v_B5atom v_B5grid v_rmse_global From 4ae0fc83124eff9e400ea43166fc21b4d1ac1ca1 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 16 Oct 2023 15:47:42 -0600 Subject: [PATCH 218/417] Fix GPU compile --- src/KOKKOS/npair_kokkos.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 8201ae028b..83e60768cd 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -614,6 +614,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic X_FLOAT ytmp; X_FLOAT ztmp; int itype; + tagint itag; const int index = (i >= 0 && i < nlocal) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -623,6 +624,7 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); + itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; @@ -970,6 +972,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team X_FLOAT ytmp; X_FLOAT ztmp; int itype; + tagint itag; const int index = (i >= 0 && i < nall) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -979,6 +982,7 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); + itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; @@ -1331,6 +1335,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP X_FLOAT ztmp; X_FLOAT radi; int itype; + tagint itag; const int index = (i >= 0 && i < nlocal) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -1342,6 +1347,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP ztmp = x(i, 2); radi = radius(i); itype = type(i); + itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; From 3b4fff4164a4dc73433b11f9e7fac65c279a2fb2 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Oct 2023 12:01:01 -0600 Subject: [PATCH 219/417] Need to sync tag, add template param --- src/KOKKOS/npair_halffull_kokkos.cpp | 41 +++-- src/KOKKOS/npair_halffull_kokkos.h | 249 +++++++++++++++++++-------- src/KOKKOS/npair_kokkos.cpp | 37 ++-- 3 files changed, 223 insertions(+), 104 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index bc2549aa8d..ddd7362c4e 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -27,8 +27,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -template -NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : NPair(lmp) { +template +NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : NPair(lmp) { atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; } @@ -42,13 +42,19 @@ NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : if ghost, also store neighbors of ghost atoms & set inum,gnum correctly ------------------------------------------------------------------------- */ -template -void NPairHalffullKokkos::build(NeighList *list) +template +void NPairHalffullKokkos::build(NeighList *list) { if (NEWTON || TRIM) { x = atomKK->k_x.view(); atomKK->sync(execution_space,X_MASK); } + + if (TRI) { + tag = atomKK->k_tag.view(); + atomKK->sync(execution_space,TAG_MASK); + } + nlocal = atom->nlocal; cutsq_custom = cutoff_custom*cutoff_custom; @@ -68,7 +74,6 @@ void NPairHalffullKokkos::build(NeighList *list) d_neighbors = k_list->d_neighbors; delta = 0.01 * force->angstrom; - triclinic = domain->triclinic; // loop over parent full list @@ -82,9 +87,9 @@ void NPairHalffullKokkos::build(NeighList *list) k_list->k_ilist.template modify(); } -template +template KOKKOS_INLINE_FUNCTION -void NPairHalffullKokkos::operator()(TagNPairHalffullCompute, const int &ii) const { +void NPairHalffullKokkos::operator()(TagNPairHalffullCompute, const int &ii) const { int n = 0; const int i = d_ilist_full(ii); @@ -112,7 +117,7 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom if (NEWTON) { if (j < nlocal) { if (i > j) continue; - } else if (triclinic) { + } else if (TRI) { if (fabs(x(j,2)-ztmp) > delta) { if (x(j,2) < ztmp) continue; } else if (fabs(x(j,1)-ytmp) > delta) { @@ -158,14 +163,18 @@ void NPairHalffullKokkos::operator()(TagNPairHalffullCom } namespace LAMMPS_NS { -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; #ifdef LMP_KOKKOS_GPU -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; -template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; #endif } diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index 1249a9ce8a..7e6c28aaba 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -16,53 +16,79 @@ // Trim off -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/kk/device, NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); + NP_ORTHO | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/skip/kk/device, NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/skip/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_SKIP | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/skip/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/skip/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/kk/device, NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/skip/kk/device, NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/skip/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | @@ -70,166 +96,244 @@ NPairStyle(halffull/newtoff/skip/kk/host, //************ Ghost ************** -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/ghost/kk/device, - NPairKokkosHalffullNewtonGhostDevice, + NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_GHOST | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/ghost/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); + NP_ORTHO | NP_GHOST | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/skip/ghost/kk/device, - NPairKokkosHalffullNewtonGhostDevice, + NPairKokkosHalffullNewtonDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; NPairStyle(halffull/newton/skip/ghost/kk/host, NPairKokkosHalffullNewtonHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/ghost/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/ghost/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriDevice; +NPairStyle(halffull/newton/tri/skip/ghost/kk/device, + NPairKokkosHalffullNewtonTriDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriHost; +NPairStyle(halffull/newton/tri/skip/ghost/kk/host, + NPairKokkosHalffullNewtonTriHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/ghost/kk/device, - NPairKokkosHalffullNewtoffGhostDevice, + NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/ghost/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; NPairStyle(halffull/newtoff/skip/ghost/kk/device, - NPairKokkosHalffullNewtoffGhostDevice, + NPairKokkosHalffullNewtoffDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; NPairStyle(halffull/newtoff/skip/ghost/kk/host, NPairKokkosHalffullNewtoffHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST); - //************ Trim ************** -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; NPairStyle(halffull/newton/trim/kk/device, NPairKokkosHalffullNewtonTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | - NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_DEVICE); + NP_ORTHO | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; NPairStyle(halffull/newton/trim/kk/host, NPairKokkosHalffullNewtonTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRIM | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +NPairStyle(halffull/newton/trim/skip/kk/device, + NPairKokkosHalffullNewtonTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +NPairStyle(halffull/newton/trim/skip/kk/host, + NPairKokkosHalffullNewtonTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/kk/device, + NPairKokkosHalffullNewtonTriTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; -NPairStyle(halffull/newton/skip/trim/kk/device, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/skip/kk/device, NPairKokkosHalffullNewtonTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; -NPairStyle(halffull/newton/skip/trim/kk/host, - NPairKokkosHalffullNewtonTrimHost, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/skip/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; NPairStyle(halffull/newtoff/trim/kk/device, NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; NPairStyle(halffull/newtoff/trim/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; -NPairStyle(halffull/newtoff/skip/trim/kk/device, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +NPairStyle(halffull/newtoff/trim/skip/kk/device, NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; -NPairStyle(halffull/newtoff/skip/trim/kk/host, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +NPairStyle(halffull/newtoff/trim/skip/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); //************ Ghost ************** -// Newton +// Newton, no triclinic -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostTrimDevice; -NPairStyle(halffull/newton/ghost/trim/kk/device, - NPairKokkosHalffullNewtonGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +NPairStyle(halffull/newton/tri/trim/ghost/kk/device, + NPairKokkosHalffullNewtonTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +NPairStyle(halffull/newton/trim/ghost/kk/host, + NPairKokkosHalffullNewtonTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_TRIM | NP_KOKKOS_HOST); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimDevice; +NPairStyle(halffull/newton/trim/skip/ghost/kk/device, + NPairKokkosHalffullNewtonTrimDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; +NPairStyle(halffull/newton/trim/skip/ghost/kk/host, + NPairKokkosHalffullNewtonTrimHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); + +// Newton, triclinic + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/ghost/kk/device, + NPairKokkosHalffullNewtonTriTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; -NPairStyle(halffull/newton/ghost/trim/kk/host, - NPairKokkosHalffullNewtonTrimHost, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/ghost/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostTrimDevice; -NPairStyle(halffull/newton/skip/ghost/trim/kk/device, - NPairKokkosHalffullNewtonGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimDevice; +NPairStyle(halffull/newton/tri/trim/skip/ghost/kk/device, + NPairKokkosHalffullNewtonTriTrimDevice, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTrimHost; -NPairStyle(halffull/newton/skip/ghost/trim/kk/host, - NPairKokkosHalffullNewtonTrimHost, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonTriTrimHost; +NPairStyle(halffull/newton/tri/trim/skip/ghost/kk/host, + NPairKokkosHalffullNewtonTriTrimHost, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); -// Newtoff +// Newtoff (can be triclinic but template param always set to 0) -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostTrimDevice; -NPairStyle(halffull/newtoff/ghost/trim/kk/device, - NPairKokkosHalffullNewtoffGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +NPairStyle(halffull/newtoff/trim/ghost/kk/device, + NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; -NPairStyle(halffull/newtoff/ghost/trim/kk/host, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +NPairStyle(halffull/newtoff/trim/ghost/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_KOKKOS_HOST); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostTrimDevice; -NPairStyle(halffull/newtoff/skip/ghost/trim/kk/device, - NPairKokkosHalffullNewtoffGhostTrimDevice, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimDevice; +NPairStyle(halffull/newtoff/trim/skip/ghost/kk/device, + NPairKokkosHalffullNewtoffTrimDevice, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_DEVICE); -typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; -NPairStyle(halffull/newtoff/skip/ghost/trim/kk/host, +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffTrimHost; +NPairStyle(halffull/newtoff/trim/skip/ghost/kk/host, NPairKokkosHalffullNewtoffTrimHost, NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_TRIM | NP_KOKKOS_HOST); + // clang-format on #else @@ -244,7 +348,7 @@ namespace LAMMPS_NS { struct TagNPairHalffullCompute{}; -template +template class NPairHalffullKokkos : public NPair { public: typedef DeviceType device_type; @@ -261,6 +365,7 @@ class NPairHalffullKokkos : public NPair { double cutsq_custom,delta; typename AT::t_x_array_randomread x; + typename AT::t_tagint_1d_randomread tag; typename AT::t_neighbors_2d_const d_neighbors_full; typename AT::t_int_1d_const d_ilist_full; diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 83e60768cd..4e992fb2d7 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -219,6 +219,8 @@ void NPairKokkos::build(NeighList *list_) atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK); } + if (HALF && NEWTON && TRI) atomKK->sync(Device,TAG_MASK); + data.special_flag[0] = special_flag[0]; data.special_flag[1] = special_flag[1]; data.special_flag[2] = special_flag[2]; @@ -241,7 +243,7 @@ void NPairKokkos::build(NeighList *list_) if (GHOST) { // assumes newton off - NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); // temporarily disable team policy for ghost due to known bug @@ -416,7 +418,8 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); - const tagint itag = tag(i); + tagint itag; + if (HalfNeigh && Newton && Tri) itag = tag(i); const int ibin = c_atom2bin(i); @@ -624,12 +627,14 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); - itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = itag; + if (HalfNeigh && Newton && Tri) { + itag = tag(i); + other_x[MY_II + 4 * atoms_per_bin] = itag; + } } other_id[MY_II] = i; @@ -717,7 +722,8 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = tag(j); + if (HalfNeigh && Newton && Tri) + other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -833,7 +839,6 @@ void NeighborKokkosExecute:: const X_FLOAT ytmp = x(i, 1); const X_FLOAT ztmp = x(i, 2); const int itype = type(i); - const tagint itag = tag(i); const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; @@ -957,8 +962,8 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team if (ibin >= mbins) return; - X_FLOAT* other_x = sharedmem + 6*atoms_per_bin*MY_BIN; - int* other_id = (int*) &other_x[5 * atoms_per_bin]; + X_FLOAT* other_x = sharedmem + 5*atoms_per_bin*MY_BIN; + int* other_id = (int*) &other_x[4 * atoms_per_bin]; int bincount_current = c_bincount[ibin]; @@ -972,7 +977,6 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team X_FLOAT ytmp; X_FLOAT ztmp; int itype; - tagint itag; const int index = (i >= 0 && i < nall) ? i : 0; const AtomNeighbors neighbors_i = neigh_transpose ? neigh_list.get_neighbors_transpose(index) : neigh_list.get_neighbors(index); @@ -982,12 +986,10 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team ytmp = x(i, 1); ztmp = x(i, 2); itype = type(i); - itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = itag; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -1043,7 +1045,6 @@ void NeighborKokkosExecute::build_ItemGhostGPU(typename Kokkos::Team other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -1129,7 +1130,8 @@ void NeighborKokkosExecute:: const X_FLOAT ztmp = x(i, 2); const X_FLOAT radi = radius(i); const int itype = type(i); - const tagint itag = tag(i); + tagint itag; + if (HalfNeigh && Newton && Tri) itag = tag(i); const int ibin = c_atom2bin(i); @@ -1347,12 +1349,14 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP ztmp = x(i, 2); radi = radius(i); itype = type(i); - itag = tag(i); other_x[MY_II] = xtmp; other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; - other_x[MY_II + 4 * atoms_per_bin] = itag; + if (HalfNeigh && Newton && Tri) { + itag = tag(i); + other_x[MY_II + 4 * atoms_per_bin] = itag; + } other_x[MY_II + 5 * atoms_per_bin] = radi; } other_id[MY_II] = i; @@ -1445,7 +1449,8 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = tag(j); + if (HalfNeigh && Newton && Tri) + other_x[MY_II + 4 * atoms_per_bin] = tag(j); other_x[MY_II + 5 * atoms_per_bin] = radius(j); } From 750957d585ede258dc025a9091d86cde28ce8c60 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Oct 2023 12:27:35 -0600 Subject: [PATCH 220/417] Remove unused var --- src/KOKKOS/npair_halffull_kokkos.cpp | 5 ----- src/KOKKOS/npair_halffull_kokkos.h | 1 - 2 files changed, 6 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp index ddd7362c4e..c8c4d57fc9 100644 --- a/src/KOKKOS/npair_halffull_kokkos.cpp +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -50,11 +50,6 @@ void NPairHalffullKokkos::build(NeighList *list) atomKK->sync(execution_space,X_MASK); } - if (TRI) { - tag = atomKK->k_tag.view(); - atomKK->sync(execution_space,TAG_MASK); - } - nlocal = atom->nlocal; cutsq_custom = cutoff_custom*cutoff_custom; diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index 7e6c28aaba..98526c7fee 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -365,7 +365,6 @@ class NPairHalffullKokkos : public NPair { double cutsq_custom,delta; typename AT::t_x_array_randomread x; - typename AT::t_tagint_1d_randomread tag; typename AT::t_neighbors_2d_const d_neighbors_full; typename AT::t_int_1d_const d_ilist_full; From bd1794f142a6ad1fde680f41b539772494874489 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 17 Oct 2023 12:59:10 -0600 Subject: [PATCH 221/417] Remove debug output --- src/KOKKOS/kokkos.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 9eee432969..0c9a028f28 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -266,18 +266,10 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) #ifdef KOKKOS_ENABLE_CUDA gpu_aware_flag = 1; #elif defined(KOKKOS_ENABLE_HIP) && defined(OMPI_HAVE_MPI_EXT_ROCM) && OMPI_HAVE_MPI_EXT_ROCM - if(have_gpu_aware == 1) - { + if (have_gpu_aware == 1) gpu_aware_flag = MPIX_Query_rocm_support(); - if(gpu_aware_flag && me == 0) - { - error->warning(FLERR,"ROCm-aware OpenMPI is supported and enabled (debug msg, remove it later)"); - } - } else - { gpu_aware_flag = 0; - } #else gpu_aware_flag = 0; #endif From c051a4cf2df46de7437e7805e4b5598fded4ca27 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Oct 2023 14:18:16 -0600 Subject: [PATCH 222/417] Fix perf regression --- src/KOKKOS/npair_kokkos.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 4e992fb2d7..f677b3a1bf 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -1353,11 +1353,11 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = ytmp; other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; + other_x[MY_II + 4 * atoms_per_bin] = radi; if (HalfNeigh && Newton && Tri) { itag = tag(i); - other_x[MY_II + 4 * atoms_per_bin] = itag; + other_x[MY_II + 5 * atoms_per_bin] = itag; } - other_x[MY_II + 5 * atoms_per_bin] = radi; } other_id[MY_II] = i; #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) @@ -1392,7 +1392,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { @@ -1449,9 +1449,9 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + atoms_per_bin] = x(j, 1); other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = radius(j); if (HalfNeigh && Newton && Tri) - other_x[MY_II + 4 * atoms_per_bin] = tag(j); - other_x[MY_II + 5 * atoms_per_bin] = radius(j); + other_x[MY_II + 5 * atoms_per_bin] = tag(j); } other_id[MY_II] = j; @@ -1475,7 +1475,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP if (HalfNeigh && Newton && Tri) { if (j <= i) continue; if (j >= nlocal) { - const tagint jtag = other_x[m + 4 * atoms_per_bin]; + const tagint jtag = other_x[m + 5 * atoms_per_bin]; if (itag > jtag) { if ((itag+jtag) % 2 == 0) continue; } else if (itag < jtag) { @@ -1499,7 +1499,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; - const X_FLOAT radsum = radi + other_x[m + 5 * atoms_per_bin]; + const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if (rsq <= cutsq) { From 6b184e8079bb33310cd3bf441cff59f82a7305b9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 19:39:31 -0400 Subject: [PATCH 223/417] copy-and-paste bugfix from @stanmoore1 --- src/balance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/balance.cpp b/src/balance.cpp index 3bd083e2b9..6f28081f13 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -473,7 +473,7 @@ void Balance::options(int iarg, int narg, char **arg, int sortflag_default) } iarg += 2+nopt; - } else if (strcmp(arg[iarg+1],"sort") == 0) { + } else if (strcmp(arg[iarg],"sort") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "balance sort", error); sortflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; From dbd5f93ed475333e61d5fa2914eb3345ffe27eba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 19:41:00 -0400 Subject: [PATCH 224/417] whitespace --- src/KOKKOS/npair_halffull_kokkos.h | 2 +- src/KOKKOS/npair_kokkos.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h index 98526c7fee..3eee19b8c3 100644 --- a/src/KOKKOS/npair_halffull_kokkos.h +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -16,7 +16,7 @@ // Trim off -// Newton, no triclinic +// Newton, no triclinic typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; NPairStyle(halffull/newton/kk/device, diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index f677b3a1bf..45ec83e90e 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -1354,7 +1354,7 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + 2 * atoms_per_bin] = ztmp; other_x[MY_II + 3 * atoms_per_bin] = itype; other_x[MY_II + 4 * atoms_per_bin] = radi; - if (HalfNeigh && Newton && Tri) { + if (HalfNeigh && Newton && Tri) { itag = tag(i); other_x[MY_II + 5 * atoms_per_bin] = itag; } From ea69d77b790f28632d6ae345eca6b6a143f010bf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 20:02:01 -0400 Subject: [PATCH 225/417] fix issues with Qt library detection --- tools/lammps-gui/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index edfeeb1128..e83db05fdd 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -110,14 +110,15 @@ endif() # we require Qt 5 and at least version 5.12 at that. if(NOT LAMMPS_GUI_USE_QT5) - find_package(Qt6 6.2 COMPONENTS Widgets Charts) + find_package(Qt6 6.2 QUIET COMPONENTS Widgets Charts) endif() if(NOT Qt6_FOUND) find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) - set(QT_VERSION_MAJOR "5") + set(QT_VERSION_MAJOR 5) else() - set(QT_VERSION_MAJOR "6") + set(QT_VERSION_MAJOR 6) endif() +message(STATUS "Using Qt version ${Qt${QT_VERSION_MAJOR}_VERSION} for LAMMPS GUI") set(PROJECT_SOURCES main.cpp @@ -188,7 +189,7 @@ else() endif() target_include_directories(lammps-gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(lammps-gui PRIVATE LAMMPS_GUI_VERSION="${PROJECT_VERSION}") -target_link_libraries(lammps-gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${VERSION_MAJOR}::Charts) +target_link_libraries(lammps-gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Charts) if(BUILD_OMP) find_package(OpenMP COMPONENTS CXX REQUIRED) target_link_libraries(lammps-gui PRIVATE OpenMP::OpenMP_CXX) From 4c980eec91457763153b530a45095aa066cc96d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Oct 2023 20:52:13 -0400 Subject: [PATCH 226/417] correct table formatting --- doc/src/variable.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index f1a316da1f..3407b48156 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1183,7 +1183,7 @@ table: +--------+------------+------------------------------------------+ | vector | c_ID | global vector | | vector | c_ID[I] | column of global array | ----------+------------+------------------------------------------+ ++--------+------------+------------------------------------------+ | atom | c_ID | per-atom vector | | atom | c_ID[I] | column of per-atom array | +--------+------------+------------------------------------------+ @@ -1247,7 +1247,7 @@ and atom-style variables are listed in the following table: +--------+------------+------------------------------------------+ | vector | f_ID | global vector | | vector | f_ID[I] | column of global array | ----------+------------+------------------------------------------+ ++--------+------------+------------------------------------------+ | atom | f_ID | per-atom vector | | atom | f_ID[I] | column of per-atom array | +--------+------------+------------------------------------------+ From 87fdff5874cb02347832da8d9a02eadf71ef109b Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Tue, 17 Oct 2023 23:41:52 -0600 Subject: [PATCH 227/417] No variable transfer --- src/ML-IAP/mliap_data.cpp | 4 ++++ src/ML-IAP/mliap_data.h | 1 + src/ML-IAP/mliap_model_python_couple.pyx | 4 +++- src/ML-IAP/mliap_unified.cpp | 9 +++++++-- src/ML-IAP/mliap_unified_couple.pyx | 17 +++++++++++------ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index 1c817bd3bd..954b12d795 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -23,6 +23,7 @@ #include "mliap_descriptor.h" #include "mliap_model.h" #include "neigh_list.h" +#include using namespace LAMMPS_NS; @@ -115,6 +116,9 @@ void MLIAPData::generate_neighdata(NeighList *list_in, int eflag_in, int vflag_i int **firstneigh = list->firstneigh; int nall = atom->nlocal + atom->nghost; + std::cout << "nall value data: " << nall << std::endl; + int nlocalunified = atom->nlocal + 1; + std::cout << "nlocal value data: " << nlocalunified << std::endl; ntotal = nall; // grow nmax gradforce, elems arrays if necessary diff --git a/src/ML-IAP/mliap_data.h b/src/ML-IAP/mliap_data.h index dc468b99cb..c17f14d1ad 100644 --- a/src/ML-IAP/mliap_data.h +++ b/src/ML-IAP/mliap_data.h @@ -60,6 +60,7 @@ class MLIAPData : protected Pointers { int ntotal; // total number of owned and ghost atoms on this proc int nlistatoms; // current number of atoms in local atom lists + int nlocalunified; int nlistatoms_max; // allocated size of descriptor array int natomneigh; // current number of atoms and ghosts in atom neighbor arrays int natomneigh_max; // allocated size of atom neighbor arrays diff --git a/src/ML-IAP/mliap_model_python_couple.pyx b/src/ML-IAP/mliap_model_python_couple.pyx index 1f5b739092..ef2857f544 100644 --- a/src/ML-IAP/mliap_model_python_couple.pyx +++ b/src/ML-IAP/mliap_model_python_couple.pyx @@ -18,6 +18,7 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": cdef cppclass MLIAPData: # Array shapes int nlistatoms + int nlocalunified int ndescriptors # Input data @@ -103,7 +104,8 @@ cdef public void MLIAPPY_compute_gradients(MLIAPModelPython * c_model, MLIAPData model = retrieve(c_model) n_d = data.ndescriptors - n_a = data.nlistatoms + #n_a = data.nlistatoms + n_a = data.nlocalunified # Make numpy arrays from pointers beta_np = np.asarray( &data.betas[0][0]) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index a3727976de..4976112882 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -28,6 +28,7 @@ #include "pair_mliap.h" #include "python_compat.h" #include "utils.h" +#include using namespace LAMMPS_NS; @@ -194,6 +195,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat char *coefffilename) { lmp->python->init(); + std::cout << "nlocalunified at build_unified: " << data->nlocalunified << std::endl; PyGILState_STATE gstate = PyGILState_Ensure(); PyObject *pyMain = PyImport_AddModule("__main__"); @@ -267,15 +269,18 @@ void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { - const auto nlistatoms = data->nlistatoms; + //Bugfix: need to account for Null atoms in local atoms + //const auto nlistatoms = data->nlistatoms; + const auto nlocalunified = data->nlocalunified; double **f = data->f; + std::cout << "nlocal value: " << data->nlocalunified << std::endl; for (int ii = 0; ii < data->npairs; ii++) { int ii3 = ii * 3; int i = data->pair_i[ii]; int j = data->jatoms[ii]; // must not count any contribution where i is not a local atom - if (i < nlistatoms) { + if (i < nlocalunified) { f[i][0] += fij[ii3]; f[i][1] += fij[ii3 + 1]; f[i][2] += fij[ii3 + 2]; diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 25852a1c5f..4fd360fc22 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -54,6 +54,7 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": int ntotal # total number of owned and ghost atoms on this proc int nlistatoms # current number of atoms in local atom lists + int nlocalunified int natomneigh # current number of atoms and ghosts in atom neighbor arrays int * numneighs # neighbors count for each atom int * iatoms # index of each atom @@ -144,7 +145,7 @@ cdef class MLIAPDataPy: def betas(self, value): if self.data.betas is NULL: raise ValueError("attempt to set NULL betas") - cdef double[:, :] betas_view = &self.data.betas[0][0] + cdef double[:, :] betas_view = &self.data.betas[0][0] cdef double[:, :] value_view = value betas_view[:] = value_view @@ -152,7 +153,7 @@ cdef class MLIAPDataPy: def descriptors(self, value): if self.data.descriptors is NULL: raise ValueError("attempt to set NULL descriptors") - cdef double[:, :] descriptors_view = &self.data.descriptors[0][0] + cdef double[:, :] descriptors_view = &self.data.descriptors[0][0] cdef double[:, :] value_view = value descriptors_view[:] = value_view @@ -160,7 +161,7 @@ cdef class MLIAPDataPy: def eatoms(self, value): if self.data.eatoms is NULL: raise ValueError("attempt to set NULL eatoms") - cdef double[:] eatoms_view = &self.data.eatoms[0] + cdef double[:] eatoms_view = &self.data.eatoms[0] cdef double[:] value_view = value eatoms_view[:] = value_view @@ -190,19 +191,19 @@ cdef class MLIAPDataPy: def gamma(self): if self.data.gamma is NULL: return None - return np.asarray( &self.data.gamma[0][0]) + return np.asarray( &self.data.gamma[0][0]) @property def gamma_row_index(self): if self.data.gamma_row_index is NULL: return None - return np.asarray( &self.data.gamma_row_index[0][0]) + return np.asarray( &self.data.gamma_row_index[0][0]) @property def gamma_col_index(self): if self.data.gamma_col_index is NULL: return None - return np.asarray( &self.data.gamma_col_index[0][0]) + return np.asarray( &self.data.gamma_col_index[0][0]) @property def egradient(self): @@ -226,6 +227,10 @@ cdef class MLIAPDataPy: @property def nlistatoms(self): return self.data.nlistatoms + + @property + def nlocalunified(self): + return self.data.nlocalunified @property def natomneigh(self): From 0f1026935727104e95617e6d000926474bac7810 Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Tue, 17 Oct 2023 23:45:52 -0600 Subject: [PATCH 228/417] cleaning --- src/ML-IAP/mliap_data.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index 954b12d795..ae78d32d74 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -117,7 +117,7 @@ void MLIAPData::generate_neighdata(NeighList *list_in, int eflag_in, int vflag_i int nall = atom->nlocal + atom->nghost; std::cout << "nall value data: " << nall << std::endl; - int nlocalunified = atom->nlocal + 1; + int nlocalunified = atom->nlocal; std::cout << "nlocal value data: " << nlocalunified << std::endl; ntotal = nall; From 302e3be66978f81205d63a16b60d4eb5d9b5a34a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 07:51:25 -0400 Subject: [PATCH 229/417] make sure itag is initialized --- src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp index 7faa210107..1c6d025fab 100644 --- a/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_old_newton_tri_omp.cpp @@ -87,6 +87,7 @@ void NPairHalfSizeMultiOldNewtonTriOmp::build(NeighList *list) n = 0; neighptr = ipage.vget(); + itag = tag[i]; itype = type[i]; xtmp = x[i][0]; ytmp = x[i][1]; From 5cfd8b3c63d12051c988b1fe30c289d1d35a9bc5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 07:56:50 -0400 Subject: [PATCH 230/417] silence coverity scan warning --- src/fix_property_atom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 3a53110839..9613523059 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -46,6 +46,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : rmass_flag = 0; temperature_flag = 0; heatflow_flag = 0; + nmax_old = 0; nvalue = 0; values_peratom = 0; @@ -212,7 +213,6 @@ void FixPropertyAtom::post_constructor() { // perform initial allocation of atom-based array - nmax_old = 0; grow_arrays(atom->nmax); } From a5f61c5d4405a8af7c9c6962936a21c0622864b2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 07:59:22 -0400 Subject: [PATCH 231/417] address bugs and issues flagged by static code analysis with coverity scan --- src/fix_press_langevin.cpp | 30 +++++++++++++++++------------- src/fix_press_langevin.h | 7 +++---- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index d8b90d8b49..2f6e765cd5 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -46,7 +46,8 @@ enum { ISO, ANISO, TRICLINIC }; /* ---------------------------------------------------------------------- */ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), id_press(nullptr), pflag(0), random(nullptr), irregular(nullptr) + Fix(lmp, narg, arg), id_temp(nullptr), id_press(nullptr), temperature(nullptr), + pressure(nullptr), irregular(nullptr), random(nullptr) { if (narg < 5) utils::missing_cmd_args(FLERR, "fix press/langevin", error); @@ -62,6 +63,9 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : allremap = 1; pre_exchange_flag = 0; flipflag = 1; + seed = 111111; + pflag = 0; + kspace_flag = 0; p_ltime = 0.0; @@ -239,7 +243,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : t_start = utils::numeric(FLERR, arg[iarg + 1], false, lmp); t_stop = utils::numeric(FLERR, arg[iarg + 2], false, lmp); seed = utils::numeric(FLERR, arg[iarg + 3], false, lmp); - if (seed <= 0.0) error->all(FLERR, "Fix press/langevin temp seed must be > 0"); + if (seed <= 0) error->all(FLERR, "Fix press/langevin temp seed must be > 0"); iarg += 4; } @@ -349,7 +353,7 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : // Kinetic contribution will be added by the fix style id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); + pressure = modify->add_compute(fmt::format("{} all pressure NULL virial", id_press)); pflag = 1; // p_fric is alpha coeff from GJF @@ -482,7 +486,7 @@ void FixPressLangevin::initial_integrate(int /* vflag */) if (delta != 0.0) delta /= update->endstep - update->beginstep; t_target = t_start + delta * (t_stop - t_start); - couple_beta(t_target); + couple_beta(); dt = update->dt; @@ -492,11 +496,12 @@ void FixPressLangevin::initial_integrate(int /* vflag */) displacement = dt * p_deriv[i] * gjfb[i]; displacement += 0.5 * dt * dt * f_piston[i] * gjfb[i] / p_mass[i]; displacement += 0.5 * dt * fran[i] * gjfb[i] / p_mass[i]; - dl = domain->boxhi[i] - domain->boxlo[i]; - if (i < 3) + if (i < 3) { + dl = domain->boxhi[i] - domain->boxlo[i]; dilation[i] = (dl + displacement) / dl; - else + } else { dilation[i] = displacement; + } } } } @@ -527,7 +532,7 @@ void FixPressLangevin::post_force(int /*vflag*/) } couple_pressure(); - couple_kinetic(t_target); + couple_kinetic(); for (int i = 0; i < 6; i++) { if (p_flag[i]) { @@ -594,10 +599,9 @@ void FixPressLangevin::couple_pressure() } /* ---------------------------------------------------------------------- */ -void FixPressLangevin::couple_kinetic(double t_target) +void FixPressLangevin::couple_kinetic() { double pk, volume; - nktv2p = force->nktv2p; // kinetic part @@ -607,7 +611,7 @@ void FixPressLangevin::couple_kinetic(double t_target) volume = domain->xprd * domain->yprd; pk = atom->natoms * force->boltz * t_target / volume; - pk *= nktv2p; + pk *= force->nktv2p; p_current[0] += pk; p_current[1] += pk; @@ -616,7 +620,7 @@ void FixPressLangevin::couple_kinetic(double t_target) /* ---------------------------------------------------------------------- */ -void FixPressLangevin::couple_beta(double t_target) +void FixPressLangevin::couple_beta() { double gamma[6]; int me = comm->me; @@ -812,7 +816,7 @@ int FixPressLangevin::modify_param(int narg, char **arg) id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); - if (pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); + if (!pressure) error->all(FLERR, "Could not find fix_modify pressure compute ID: {}", arg[1]); if (pressure->pressflag == 0) error->all(FLERR, "Fix_modify pressure compute {} does not compute pressure", arg[1]); return 2; diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index fc9f39c434..868993b1f4 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -40,10 +40,9 @@ class FixPressLangevin : public Fix { int modify_param(int, char **) override; protected: - int dimension, which; + int dimension; int pstyle, pcouple, allremap; int p_flag[6]; // 1 if control P on this dim, 0 if not - double nktv2p; double t_start, t_stop, t_target; double p_fric[6], p_ltime; // Friction and Langevin charac. time double p_alpha[6]; @@ -68,8 +67,8 @@ class FixPressLangevin : public Fix { int seed; void couple_pressure(); - void couple_kinetic(double); - void couple_beta(double); + void couple_kinetic(); + void couple_beta(); void remap(); }; From 54ff01d86daa134e48feeef503da52b750cf9ffc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Oct 2023 08:01:41 -0400 Subject: [PATCH 232/417] assign code owner to fix press/langevin --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f99a336dbb..9b316fbeb9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -135,6 +135,7 @@ src/timer.* @akohlmey src/utils.* @akohlmey @rbberger src/verlet.* @sjplimp @stanmoore1 src/math_eigen_impl.h @jewettaij +src/fix_press_langevin.* @Bibobu # tools tools/coding_standard/* @akohlmey @rbberger From 45d2a91c6289466f3940571e5845aad527b912a8 Mon Sep 17 00:00:00 2001 From: Maria-Lesniewski Date: Wed, 18 Oct 2023 13:13:37 -0400 Subject: [PATCH 233/417] Barostat fix - see lammps PR 879 and 942 --- src/BOCS/fix_bocs.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index d17884855a..52ca948657 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -1024,7 +1024,10 @@ void FixBocs::final_integrate() if (pstat_flag) { if (pstyle == ISO) pressure->compute_scalar(); - else pressure->compute_vector(); + else { + temperature->compute_vector(); + pressure->compute_vector(); + } couple(); pressure->addstep(update->ntimestep+1); } @@ -1961,7 +1964,7 @@ void FixBocs::nhc_press_integrate() int ich,i,pdof; double expfac,factor_etap,kecurrent; double kt = boltz * t_target; - + double lkt_press; // Update masses, to preserve initial freq, if flag set if (omega_mass_flag) { @@ -2006,7 +2009,8 @@ void FixBocs::nhc_press_integrate() } } - double lkt_press = pdof * kt; + if (pstyle == ISO) lkt_press = kt; + else lkt_press = pdof * kt; etap_dotdot[0] = (kecurrent - lkt_press)/etap_mass[0]; double ncfac = 1.0/nc_pchain; From 791f7d1d882fc4f994891e5cb59efaafd884c912 Mon Sep 17 00:00:00 2001 From: vladgl Date: Wed, 18 Oct 2023 22:14:42 +0300 Subject: [PATCH 234/417] Add dynamic check for CUDA --- src/KOKKOS/kokkos.cpp | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 0c9a028f28..787f75fd47 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -37,7 +37,7 @@ // for detecting GPU-aware MPI support: // the variable int have_gpu_aware -// - is 1 if GPU-aware MPI support is available +// - is 1 if GPU-aware MPI support is potentially available // - is 0 if GPU-aware MPI support is unavailable // - is -1 if GPU-aware MPI support is unknown @@ -48,24 +48,20 @@ GPU_AWARE_UNKNOWN #elif defined(KOKKOS_ENABLE_CUDA) // OpenMPI supports detecting GPU-aware MPI as of version 2.0.0 - #if (OPEN_MPI) #if (OMPI_MAJOR_VERSION >= 2) - #include - #if defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT +// May have CUDA-aware enabled: below we will check dynamically with MPIX_Query_cuda_support() static int have_gpu_aware = 1; #elif defined(MPIX_CUDA_AWARE_SUPPORT) && !MPIX_CUDA_AWARE_SUPPORT static int have_gpu_aware = 0; #else GPU_AWARE_UNKNOWN #endif // defined(MPIX_CUDA_AWARE_SUPPORT) - #else // old OpenMPI GPU_AWARE_UNKNOWN #endif // (OMPI_MAJOR_VERSION >=2) - #else // unknown MPI library GPU_AWARE_UNKNOWN #endif // OPEN_MPI @@ -76,10 +72,10 @@ GPU_AWARE_UNKNOWN #if (OPEN_MPI) #if (OMPI_MAJOR_VERSION >= 5) #include -#if defined(OMPI_HAVE_MPI_EXT_ROCM) && OMPI_HAVE_MPI_EXT_ROCM -// May have rocm enabled: below we will check dynamically with MPIX_Query_rocm_support() +#if defined(MPIX_ROCM_AWARE_SUPPORT ) && MPIX_ROCM_AWARE_SUPPORT +// May have ROCm-aware enabled: below we will check dynamically with MPIX_Query_rocm_support() static int have_gpu_aware = 1; -#elif defined(OMPI_HAVE_MPI_EXT_ROCM) && !OMPI_HAVE_MPI_EXT_ROCM +#elif defined(MPIX_ROCM_AWARE_SUPPORT) && !MPIX_ROCM_AWARE_SUPPORT static int have_gpu_aware = 0; #else GPU_AWARE_UNKNOWN @@ -263,13 +259,10 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) // default settings for package kokkos command binsize = 0.0; -#ifdef KOKKOS_ENABLE_CUDA - gpu_aware_flag = 1; -#elif defined(KOKKOS_ENABLE_HIP) && defined(OMPI_HAVE_MPI_EXT_ROCM) && OMPI_HAVE_MPI_EXT_ROCM - if (have_gpu_aware == 1) - gpu_aware_flag = MPIX_Query_rocm_support(); - else - gpu_aware_flag = 0; +#if defined(KOKKOS_ENABLE_CUDA) && defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT + gpu_aware_flag = MPIX_Query_cuda_support(); +#elif defined(KOKKOS_ENABLE_HIP) && defined(MPIX_ROCM_AWARE_SUPPORT) && MPIX_ROCM_AWARE_SUPPORT + gpu_aware_flag = MPIX_Query_rocm_support(); #else gpu_aware_flag = 0; #endif From 0501674724d64301fc4747e25a7953cbb9d1d625 Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Wed, 18 Oct 2023 23:07:21 -0600 Subject: [PATCH 235/417] Commit before cleaning changes --- src/ML-IAP/compute_mliap.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ML-IAP/compute_mliap.cpp b/src/ML-IAP/compute_mliap.cpp index 4fa88abad1..3416b42dc0 100644 --- a/src/ML-IAP/compute_mliap.cpp +++ b/src/ML-IAP/compute_mliap.cpp @@ -36,7 +36,7 @@ #include "neighbor.h" #include "pair.h" #include "update.h" - +#include #include using namespace LAMMPS_NS; @@ -120,6 +120,7 @@ ComputeMLIAP::ComputeMLIAP(LAMMPS *lmp, int narg, char **arg) : map[i] = i-1; data = new MLIAPData(lmp, gradgradflag, map, model, descriptor); + std::cout << "nlocalunified in compute_mliap.cpp: " << data->nlocalunified << std::endl; size_array_rows = data->size_array_rows; size_array_cols = data->size_array_cols; From e188407566383559704673180fd66eabc7021b97 Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Wed, 18 Oct 2023 23:17:25 -0600 Subject: [PATCH 236/417] Cleaned fix --- src/ML-IAP/compute_mliap.cpp | 3 +-- src/ML-IAP/mliap_data.cpp | 3 +-- src/ML-IAP/mliap_data.h | 2 +- src/ML-IAP/mliap_model_python_couple.pyx | 5 ++--- src/ML-IAP/mliap_unified.cpp | 6 ++---- src/ML-IAP/mliap_unified_couple.pyx | 18 +++++++++--------- 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/ML-IAP/compute_mliap.cpp b/src/ML-IAP/compute_mliap.cpp index 3416b42dc0..4fa88abad1 100644 --- a/src/ML-IAP/compute_mliap.cpp +++ b/src/ML-IAP/compute_mliap.cpp @@ -36,7 +36,7 @@ #include "neighbor.h" #include "pair.h" #include "update.h" -#include + #include using namespace LAMMPS_NS; @@ -120,7 +120,6 @@ ComputeMLIAP::ComputeMLIAP(LAMMPS *lmp, int narg, char **arg) : map[i] = i-1; data = new MLIAPData(lmp, gradgradflag, map, model, descriptor); - std::cout << "nlocalunified in compute_mliap.cpp: " << data->nlocalunified << std::endl; size_array_rows = data->size_array_rows; size_array_cols = data->size_array_cols; diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index ae78d32d74..b220939538 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -116,8 +116,7 @@ void MLIAPData::generate_neighdata(NeighList *list_in, int eflag_in, int vflag_i int **firstneigh = list->firstneigh; int nall = atom->nlocal + atom->nghost; - std::cout << "nall value data: " << nall << std::endl; - int nlocalunified = atom->nlocal; + nlocal = atom->nlocal; std::cout << "nlocal value data: " << nlocalunified << std::endl; ntotal = nall; diff --git a/src/ML-IAP/mliap_data.h b/src/ML-IAP/mliap_data.h index c17f14d1ad..9746b4da5e 100644 --- a/src/ML-IAP/mliap_data.h +++ b/src/ML-IAP/mliap_data.h @@ -60,7 +60,7 @@ class MLIAPData : protected Pointers { int ntotal; // total number of owned and ghost atoms on this proc int nlistatoms; // current number of atoms in local atom lists - int nlocalunified; + int nlocal; int nlistatoms_max; // allocated size of descriptor array int natomneigh; // current number of atoms and ghosts in atom neighbor arrays int natomneigh_max; // allocated size of atom neighbor arrays diff --git a/src/ML-IAP/mliap_model_python_couple.pyx b/src/ML-IAP/mliap_model_python_couple.pyx index ef2857f544..3beffc77bb 100644 --- a/src/ML-IAP/mliap_model_python_couple.pyx +++ b/src/ML-IAP/mliap_model_python_couple.pyx @@ -18,7 +18,7 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": cdef cppclass MLIAPData: # Array shapes int nlistatoms - int nlocalunified + int nlocal int ndescriptors # Input data @@ -104,8 +104,7 @@ cdef public void MLIAPPY_compute_gradients(MLIAPModelPython * c_model, MLIAPData model = retrieve(c_model) n_d = data.ndescriptors - #n_a = data.nlistatoms - n_a = data.nlocalunified + n_a = data.nlistatoms # Make numpy arrays from pointers beta_np = np.asarray( &data.betas[0][0]) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 4976112882..7bb89fe0b4 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -28,7 +28,6 @@ #include "pair_mliap.h" #include "python_compat.h" #include "utils.h" -#include using namespace LAMMPS_NS; @@ -195,7 +194,6 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat char *coefffilename) { lmp->python->init(); - std::cout << "nlocalunified at build_unified: " << data->nlocalunified << std::endl; PyGILState_STATE gstate = PyGILState_Ensure(); PyObject *pyMain = PyImport_AddModule("__main__"); @@ -271,7 +269,7 @@ void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { //Bugfix: need to account for Null atoms in local atoms //const auto nlistatoms = data->nlistatoms; - const auto nlocalunified = data->nlocalunified; + const auto nlocalunified = data->nlocal; double **f = data->f; std::cout << "nlocal value: " << data->nlocalunified << std::endl; for (int ii = 0; ii < data->npairs; ii++) { @@ -280,7 +278,7 @@ void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) int j = data->jatoms[ii]; // must not count any contribution where i is not a local atom - if (i < nlocalunified) { + if (i < nlocal) { f[i][0] += fij[ii3]; f[i][1] += fij[ii3 + 1]; f[i][2] += fij[ii3 + 2]; diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 4fd360fc22..63a414ecbb 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -54,7 +54,7 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": int ntotal # total number of owned and ghost atoms on this proc int nlistatoms # current number of atoms in local atom lists - int nlocalunified + int nlocal int natomneigh # current number of atoms and ghosts in atom neighbor arrays int * numneighs # neighbors count for each atom int * iatoms # index of each atom @@ -145,7 +145,7 @@ cdef class MLIAPDataPy: def betas(self, value): if self.data.betas is NULL: raise ValueError("attempt to set NULL betas") - cdef double[:, :] betas_view = &self.data.betas[0][0] + cdef double[:, :] betas_view = &self.data.betas[0][0] cdef double[:, :] value_view = value betas_view[:] = value_view @@ -153,7 +153,7 @@ cdef class MLIAPDataPy: def descriptors(self, value): if self.data.descriptors is NULL: raise ValueError("attempt to set NULL descriptors") - cdef double[:, :] descriptors_view = &self.data.descriptors[0][0] + cdef double[:, :] descriptors_view = &self.data.descriptors[0][0] cdef double[:, :] value_view = value descriptors_view[:] = value_view @@ -161,7 +161,7 @@ cdef class MLIAPDataPy: def eatoms(self, value): if self.data.eatoms is NULL: raise ValueError("attempt to set NULL eatoms") - cdef double[:] eatoms_view = &self.data.eatoms[0] + cdef double[:] eatoms_view = &self.data.eatoms[0] cdef double[:] value_view = value eatoms_view[:] = value_view @@ -191,19 +191,19 @@ cdef class MLIAPDataPy: def gamma(self): if self.data.gamma is NULL: return None - return np.asarray( &self.data.gamma[0][0]) + return np.asarray( &self.data.gamma[0][0]) @property def gamma_row_index(self): if self.data.gamma_row_index is NULL: return None - return np.asarray( &self.data.gamma_row_index[0][0]) + return np.asarray( &self.data.gamma_row_index[0][0]) @property def gamma_col_index(self): if self.data.gamma_col_index is NULL: return None - return np.asarray( &self.data.gamma_col_index[0][0]) + return np.asarray( &self.data.gamma_col_index[0][0]) @property def egradient(self): @@ -229,8 +229,8 @@ cdef class MLIAPDataPy: return self.data.nlistatoms @property - def nlocalunified(self): - return self.data.nlocalunified + def nlocal(self): + return self.data.nlocal @property def natomneigh(self): From 4602c8c8498cde69844c12bed96a1bd1b26d7771 Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Wed, 18 Oct 2023 23:22:16 -0600 Subject: [PATCH 237/417] First null atom fix pass --- src/ML-IAP/mliap_unified.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 7bb89fe0b4..043cbf873d 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -245,7 +245,8 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { double e_total = 0.0; - const auto nlistatoms = data->nlistatoms; + //const auto nlistatoms = data->nlistatoms; + const auto nlocal = data->nlocal; for (int ii = 0; ii < nlistatoms; ii++) data->eatoms[ii] = 0; for (int ii = 0; ii < data->npairs; ii++) { @@ -253,7 +254,7 @@ void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) double e = 0.5 * eij[ii]; // must not count any contribution where i is not a local atom - if (i < nlistatoms) { + if (i < nlocal) { data->eatoms[i] += e; e_total += e; } @@ -269,9 +270,9 @@ void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { //Bugfix: need to account for Null atoms in local atoms //const auto nlistatoms = data->nlistatoms; - const auto nlocalunified = data->nlocal; + const auto nlocal = data->nlocal; double **f = data->f; - std::cout << "nlocal value: " << data->nlocalunified << std::endl; + std::cout << "nlocal value: " << nlocal << std::endl; for (int ii = 0; ii < data->npairs; ii++) { int ii3 = ii * 3; int i = data->pair_i[ii]; From bcc93c2dc560bd1b416d3f1795c39610815f72fb Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Thu, 19 Oct 2023 00:19:02 -0600 Subject: [PATCH 238/417] Initial working Null atom fix --- src/ML-IAP/mliap_data.cpp | 2 +- src/ML-IAP/mliap_unified.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index b220939538..3fb06ee66d 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -117,7 +117,7 @@ void MLIAPData::generate_neighdata(NeighList *list_in, int eflag_in, int vflag_i int nall = atom->nlocal + atom->nghost; nlocal = atom->nlocal; - std::cout << "nlocal value data: " << nlocalunified << std::endl; + std::cout << "nlocal value data: " << nlocal << std::endl; ntotal = nall; // grow nmax gradforce, elems arrays if necessary diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 043cbf873d..49c9660098 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -29,6 +29,8 @@ #include "python_compat.h" #include "utils.h" +#include + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -245,7 +247,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { double e_total = 0.0; - //const auto nlistatoms = data->nlistatoms; + const auto nlistatoms = data->nlistatoms; const auto nlocal = data->nlocal; for (int ii = 0; ii < nlistatoms; ii++) data->eatoms[ii] = 0; From 27e0a7184954c9b5a2d9c5b3b68c700022c7c050 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 19 Oct 2023 07:44:44 -0600 Subject: [PATCH 239/417] whitespace --- src/BOCS/fix_bocs.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index 52ca948657..17bb1af002 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -1025,8 +1025,8 @@ void FixBocs::final_integrate() if (pstat_flag) { if (pstyle == ISO) pressure->compute_scalar(); else { - temperature->compute_vector(); - pressure->compute_vector(); + temperature->compute_vector(); + pressure->compute_vector(); } couple(); pressure->addstep(update->ntimestep+1); @@ -1965,6 +1965,7 @@ void FixBocs::nhc_press_integrate() double expfac,factor_etap,kecurrent; double kt = boltz * t_target; double lkt_press; + // Update masses, to preserve initial freq, if flag set if (omega_mass_flag) { From 0fc9b194dc36176e2eb2dd472cc50087c9e7e1da Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Oct 2023 10:01:10 -0400 Subject: [PATCH 240/417] quote strings with special characters in keyword lists --- src/EXTRA-DUMP/dump_yaml.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/EXTRA-DUMP/dump_yaml.cpp b/src/EXTRA-DUMP/dump_yaml.cpp index 3ca5c59edf..6c21c24f77 100644 --- a/src/EXTRA-DUMP/dump_yaml.cpp +++ b/src/EXTRA-DUMP/dump_yaml.cpp @@ -24,6 +24,8 @@ using namespace LAMMPS_NS; +static constexpr char special_chars[] = "{}[],&:*#?|-<>=!%@\\"; + /* ---------------------------------------------------------------------- */ DumpYAML::DumpYAML(class LAMMPS *_lmp, int narg, char **args) : DumpCustom(_lmp, narg, args), thermo(false) @@ -67,7 +69,12 @@ void DumpYAML::write_header(bigint ndump) const auto &fields = th->get_fields(); thermo_data += "thermo:\n - keywords: [ "; - for (int i = 0; i < nfield; ++i) thermo_data += fmt::format("{}, ", keywords[i]); + for (int i = 0; i < nfield; ++i) { + if (keywords[i].find_first_of(special_chars) == std::string::npos) + thermo_data += fmt::format("{}, ", keywords[i]); + else + thermo_data += fmt::format("'{}', ", keywords[i]); + } thermo_data += "]\n - data: [ "; for (int i = 0; i < nfield; ++i) { @@ -107,7 +114,12 @@ void DumpYAML::write_header(bigint ndump) if (domain->triclinic) fmt::print(fp, " - [ {}, {}, {} ]\n", boxxy, boxxz, boxyz); fmt::print(fp, "keywords: [ "); - for (const auto &item : utils::split_words(columns)) fmt::print(fp, "{}, ", item); + for (const auto &item : utils::split_words(columns)) { + if (item.find_first_of(special_chars) == std::string::npos) + fmt::print(fp, "{}, ", item); + else + fmt::print(fp, "'{}', ", item); + } fputs(" ]\ndata:\n", fp); } else // reset so that the remainder of the output is not multi-proc filewriter = 0; From 62ea874d9df5727a97d90bf922291b0eebd103fc Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 19 Oct 2023 08:02:11 -0600 Subject: [PATCH 241/417] Add more error checks to Kokkos minimize --- src/KOKKOS/min_kokkos.cpp | 3 +++ src/min.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/KOKKOS/min_kokkos.cpp b/src/KOKKOS/min_kokkos.cpp index 4e1c3967ff..bbb9a0bd6e 100644 --- a/src/KOKKOS/min_kokkos.cpp +++ b/src/KOKKOS/min_kokkos.cpp @@ -59,6 +59,9 @@ void MinKokkos::init() { Min::init(); + if (!fix_minimize->kokkosable) + error->all(FLERR,"KOKKOS package requires fix minimize/kk"); + fix_minimize_kk = (FixMinimizeKokkos*) fix_minimize; } diff --git a/src/min.cpp b/src/min.cpp index 5a469a788b..acc7d17654 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -215,6 +215,9 @@ void Min::setup(int flag) } update->setupflag = 1; + if (lmp->kokkos) + error->all(FLERR,"KOKKOS package requires Kokkos-enabled min_style"); + // setup extra global dof due to fixes // cannot be done in init() b/c update init() is before modify init() From 2401cba84a5e9b07f50fe3a71a4cb6ec1048b025 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 19 Oct 2023 12:15:01 -0700 Subject: [PATCH 242/417] Fix bug in Kokkos SNAP on GPUs --- src/KOKKOS/pair_snap_kokkos_impl.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 91f432dbaf..68303f9b33 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -63,10 +63,6 @@ PairSNAPKokkos::PairSNAPKokkos(LAMMPS *lmp datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - k_cutsq = tdual_fparams("PairSNAPKokkos::cutsq",atom->ntypes+1,atom->ntypes+1); - auto d_cutsq = k_cutsq.template view(); - rnd_cutsq = d_cutsq; - host_flag = (execution_space == Host); } @@ -101,6 +97,8 @@ void PairSNAPKokkos::init_style() if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); + + // neighbor list request for KOKKOS neighflag = lmp->kokkos->neighflag; @@ -546,6 +544,9 @@ void PairSNAPKokkos::allocate() int n = atom->ntypes; MemKK::realloc_kokkos(d_map,"PairSNAPKokkos::map",n+1); + + MemKK::realloc_kokkos(k_cutsq,"PairSNAPKokkos::cutsq",n+1,n+1); + rnd_cutsq = k_cutsq.template view(); } From 1de15c38bf9375a77768c7b4530fc999a2ebd8a8 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 19 Oct 2023 12:16:26 -0700 Subject: [PATCH 243/417] whitespace --- src/KOKKOS/pair_snap_kokkos_impl.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 68303f9b33..7b9fda60db 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -97,8 +97,6 @@ void PairSNAPKokkos::init_style() if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); - - // neighbor list request for KOKKOS neighflag = lmp->kokkos->neighflag; From d93d4f8b5cb62635b9068b3436d8eb50255caac2 Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Thu, 19 Oct 2023 17:32:21 -0600 Subject: [PATCH 244/417] normal complete, kokkos in development --- src/KOKKOS/mliap_data_kokkos.cpp | 1 + src/KOKKOS/mliap_data_kokkos.h | 4 +++- src/KOKKOS/mliap_model_python_couple_kokkos.pyx | 1 + src/KOKKOS/mliap_unified_couple_kokkos.pyx | 5 +++++ src/KOKKOS/mliap_unified_kokkos.cpp | 10 +++++----- src/ML-IAP/mliap_data.cpp | 2 -- src/ML-IAP/mliap_unified_couple.pyx | 4 ++-- 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/KOKKOS/mliap_data_kokkos.cpp b/src/KOKKOS/mliap_data_kokkos.cpp index d0da48a282..e5b34ecaa0 100644 --- a/src/KOKKOS/mliap_data_kokkos.cpp +++ b/src/KOKKOS/mliap_data_kokkos.cpp @@ -85,6 +85,7 @@ void MLIAPDataKokkos::generate_neighdata(class NeighList *list_in, i // clear gradforce and elems arrays int nall = atom->nlocal + atom->nghost; + nlocal = atom->nlocal; ntotal = nall; if (gradgradflag > -1){ auto d_gradforce = k_gradforce.template view(); diff --git a/src/KOKKOS/mliap_data_kokkos.h b/src/KOKKOS/mliap_data_kokkos.h index de05545f67..92af3ca75c 100644 --- a/src/KOKKOS/mliap_data_kokkos.h +++ b/src/KOKKOS/mliap_data_kokkos.h @@ -118,6 +118,7 @@ public: egradient(nullptr), ntotal(base.ntotal), nlistatoms(base.nlistatoms), + nlocal(base.nlocal), natomneigh(base.natomneigh), numneighs(base.numneighs), iatoms(base.k_iatoms.d_view.data()), @@ -171,6 +172,7 @@ public: // Neighborlist stuff const int ntotal; const int nlistatoms; + const int nlocal; const int natomneigh; int *numneighs; int *iatoms; @@ -191,7 +193,7 @@ public: int dev; #ifdef LMP_KOKKOS_GPU - MLIAPDataKokkosDevice(MLIAPDataKokkos &base) : ndescriptors(-1),nparams(-1),nelements(-1),ntotal(-1),nlistatoms(-1),natomneigh(-1), + MLIAPDataKokkosDevice(MLIAPDataKokkos &base) : ndescriptors(-1),nparams(-1),nelements(-1),ntotal(-1),nlistatoms(-1),nlocal(-1),natomneigh(-1), nneigh_max(-1),npairs(-1) { // It cannot get here, but needed for compilation diff --git a/src/KOKKOS/mliap_model_python_couple_kokkos.pyx b/src/KOKKOS/mliap_model_python_couple_kokkos.pyx index 6dec8cdbfe..010830f7fd 100644 --- a/src/KOKKOS/mliap_model_python_couple_kokkos.pyx +++ b/src/KOKKOS/mliap_model_python_couple_kokkos.pyx @@ -25,6 +25,7 @@ cdef extern from "mliap_data_kokkos.h" namespace "LAMMPS_NS": cdef cppclass MLIAPDataKokkosDevice: # Array shapes int nlistatoms + int nlocal int ndescriptors # Input data diff --git a/src/KOKKOS/mliap_unified_couple_kokkos.pyx b/src/KOKKOS/mliap_unified_couple_kokkos.pyx index bd94b79eb4..0142c5eda2 100644 --- a/src/KOKKOS/mliap_unified_couple_kokkos.pyx +++ b/src/KOKKOS/mliap_unified_couple_kokkos.pyx @@ -59,6 +59,7 @@ cdef extern from "mliap_data_kokkos.h" namespace "LAMMPS_NS": int ntotal # total number of owned and ghost atoms on this proc int nlistatoms # current number of atoms in local atom lists + int nlocal int natomneigh # current number of atoms and ghosts in atom neighbor arrays int * numneighs # neighbors count for each atom int * iatoms # index of each atom @@ -290,6 +291,10 @@ cdef class MLIAPDataPy: @property def nlistatoms(self): return self.data.nlistatoms + + @property + def nlocal(self): + return self.data.nlocal @property def natomneigh(self): diff --git a/src/KOKKOS/mliap_unified_kokkos.cpp b/src/KOKKOS/mliap_unified_kokkos.cpp index deb9cbc346..612bc42dfe 100644 --- a/src/KOKKOS/mliap_unified_kokkos.cpp +++ b/src/KOKKOS/mliap_unified_kokkos.cpp @@ -294,7 +294,7 @@ void LAMMPS_NS::update_pair_energy(MLIAPDataKokkosDevice *data, double *eij) void LAMMPS_NS::update_pair_forces(MLIAPDataKokkosDevice *data, double *fij) { - const auto nlistatoms = data->nlistatoms; + const auto nlocal = data->nlocal; auto *f = data->f; auto pair_i = data->pair_i; auto j_atoms = data->jatoms; @@ -315,7 +315,7 @@ void LAMMPS_NS::update_pair_forces(MLIAPDataKokkosDevice *data, double *fij) int i = pair_i[ii]; int j = j_atoms[ii]; // must not count any contribution where i is not a local atom - if (i < nlistatoms) { + if (i < nlocal) { Kokkos::atomic_add(&f[i*3+0], fij[ii3+0]); Kokkos::atomic_add(&f[i*3+1], fij[ii3+1]); Kokkos::atomic_add(&f[i*3+2], fij[ii3+2]); @@ -378,12 +378,12 @@ void LAMMPS_NS::update_pair_forces(MLIAPDataKokkosDevice *data, double *fij) void LAMMPS_NS::update_atom_energy(MLIAPDataKokkosDevice *data, double *ei) { auto d_eatoms = data->eatoms; - const auto nlistatoms = data->nlistatoms; + const auto nlocal = data->nlocal; - Kokkos::parallel_reduce(nlistatoms, KOKKOS_LAMBDA(int i, double &local_sum){ + Kokkos::parallel_reduce(nlocal, KOKKOS_LAMBDA(int i, double &local_sum){ double e = ei[i]; // must not count any contribution where i is not a local atom - if (i < nlistatoms) { + if (i < nlocal) { d_eatoms[i] = e; local_sum += e; } diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index 3fb06ee66d..b40fefd3ba 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -23,7 +23,6 @@ #include "mliap_descriptor.h" #include "mliap_model.h" #include "neigh_list.h" -#include using namespace LAMMPS_NS; @@ -117,7 +116,6 @@ void MLIAPData::generate_neighdata(NeighList *list_in, int eflag_in, int vflag_i int nall = atom->nlocal + atom->nghost; nlocal = atom->nlocal; - std::cout << "nlocal value data: " << nlocal << std::endl; ntotal = nall; // grow nmax gradforce, elems arrays if necessary diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 63a414ecbb..422b8bbcee 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -53,8 +53,8 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": # only neighbors strictly inside descriptor cutoff int ntotal # total number of owned and ghost atoms on this proc - int nlistatoms # current number of atoms in local atom lists - int nlocal + int nlistatoms # current number of non-NULL atoms in local atom lists + int nlocal # current number of NULL and normal atoms in local atom lists int natomneigh # current number of atoms and ghosts in atom neighbor arrays int * numneighs # neighbors count for each atom int * iatoms # index of each atom From 0f11a9dd70b8e839110b8c65554c3f0a91dc09ba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Oct 2023 23:21:18 -0400 Subject: [PATCH 245/417] require version newer than 2 Aug 2023 for LAMMPS GUI 1.5.9 --- tools/lammps-gui/lammpsgui.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 11f2554b55..37b8aebf88 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -1432,12 +1432,12 @@ void LammpsGui::start_lammps() lammps.open(narg, args); lammpsstatus->show(); - // must have at least 2 August 2023 version of LAMMPS + // must have a version newer than the 2 August 2023 release of LAMMPS // TODO: must update this check before next feature release - if (lammps.version() < 20230802) { + if (lammps.version() <= 20230802) { QMessageBox::critical(this, "Incompatible LAMMPS Version", "LAMMPS-GUI version " LAMMPS_GUI_VERSION " requires\n" - "LAMMPS version 2 August 2023 or later"); + "a LAMMPS version more recent than 2 August 2023"); exit(1); } From 1300999c22c04ac1d0c552afc29122fc1c49cfed Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 20 Oct 2023 13:24:08 +0300 Subject: [PATCH 246/417] Enable definition of cone region using equal variables --- src/region_cone.cpp | 273 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 250 insertions(+), 23 deletions(-) diff --git a/src/region_cone.cpp b/src/region_cone.cpp index 76bedf4c92..8eb140211d 100644 --- a/src/region_cone.cpp +++ b/src/region_cone.cpp @@ -19,17 +19,22 @@ #include "domain.h" #include "error.h" +#include "input.h" +#include "variable.h" #include #include using namespace LAMMPS_NS; +enum { CONSTANT, VARIABLE }; + static constexpr double BIG = 1.0e20; /* ---------------------------------------------------------------------- */ -RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo(0.0), hi(0.0) +RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo(0.0), hi(0.0), + c1str(nullptr), c2str(nullptr), rlostr(nullptr), rhistr(nullptr), lostr(nullptr), histr(nullptr) { options(narg - 9, &arg[9]); @@ -44,22 +49,133 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo axis = arg[2][0]; if (axis == 'x') { - c1 = yscale * utils::numeric(FLERR, arg[3], false, lmp); - c2 = zscale * utils::numeric(FLERR, arg[4], false, lmp); - radiuslo = yscale * utils::numeric(FLERR, arg[5], false, lmp); - radiushi = yscale * utils::numeric(FLERR, arg[6], false, lmp); + if (utils::strmatch(arg[3], "^v_")) { + c1str = utils::strdup(arg[3] + 2); + c1 = 0.0; + c1style = VARIABLE; + varshape = 1; + } else { + c1 = yscale * utils::numeric(FLERR, arg[3], false, lmp); + c1style = CONSTANT; + } + + if (utils::strmatch(arg[4], "^v_")) { + c2str = utils::strdup(arg[4] + 2); + c2 = 0.0; + c2style = VARIABLE; + varshape = 1; + } else { + c2 = zscale * utils::numeric(FLERR, arg[4], false, lmp); + c2style = CONSTANT; + } + + if (utils::strmatch(arg[5], "^v_")) { + rlostr = utils::strdup(arg[5] + 2); + radiuslo = 0.0; + rlostyle = VARIABLE; + varshape = 1; + } else { + radiuslo = yscale * utils::numeric(FLERR, arg[5], false, lmp); + rlostyle = CONSTANT; + } + + if (utils::strmatch(arg[6], "^v_")) { + rhistr = utils::strdup(arg[6] + 2); + radiushi = 0.0; + rhistyle = VARIABLE; + varshape = 1; + } else { + radiushi = yscale * utils::numeric(FLERR, arg[6], false, lmp); + rhistyle = CONSTANT; + } + } else if (axis == 'y') { - c1 = xscale * utils::numeric(FLERR, arg[3], false, lmp); - c2 = zscale * utils::numeric(FLERR, arg[4], false, lmp); - radiuslo = xscale * utils::numeric(FLERR, arg[5], false, lmp); - radiushi = xscale * utils::numeric(FLERR, arg[6], false, lmp); + + if (utils::strmatch(arg[3], "^v_")) { + c1str = utils::strdup(arg[3] + 2); + c1 = 0.0; + c1style = VARIABLE; + varshape = 1; + } else { + c1 = xscale * utils::numeric(FLERR, arg[3], false, lmp); + c1style = CONSTANT; + } + + if (utils::strmatch(arg[4], "^v_")) { + c2str = utils::strdup(arg[4] + 2); + c2 = 0.0; + c2style = VARIABLE; + varshape = 1; + } else { + c2 = zscale * utils::numeric(FLERR, arg[4], false, lmp); + c2style = CONSTANT; + } + + if (utils::strmatch(arg[5], "^v_")) { + rlostr = utils::strdup(arg[5] + 2); + radiuslo = 0.0; + rlostyle = VARIABLE; + varshape = 1; + } else { + radiuslo = xscale * utils::numeric(FLERR, arg[5], false, lmp); + rlostyle = CONSTANT; + } + + if (utils::strmatch(arg[6], "^v_")) { + rhistr = utils::strdup(arg[6] + 2); + radiushi = 0.0; + rhistyle = VARIABLE; + varshape = 1; + } else { + radiushi = xscale * utils::numeric(FLERR, arg[6], false, lmp); + rhistyle = CONSTANT; + } + } else if (axis == 'z') { - c1 = xscale * utils::numeric(FLERR, arg[3], false, lmp); - c2 = yscale * utils::numeric(FLERR, arg[4], false, lmp); - radiuslo = xscale * utils::numeric(FLERR, arg[5], false, lmp); - radiushi = xscale * utils::numeric(FLERR, arg[6], false, lmp); + + if (utils::strmatch(arg[3], "^v_")) { + c1str = utils::strdup(arg[3] + 2); + c1 = 0.0; + c1style = VARIABLE; + varshape = 1; + } else { + c1 = xscale * utils::numeric(FLERR, arg[3], false, lmp); + c1style = CONSTANT; + } + + if (utils::strmatch(arg[4], "^v_")) { + c2str = utils::strdup(arg[4] + 2); + c2 = 0.0; + c2style = VARIABLE; + varshape = 1; + } else { + c2 = yscale * utils::numeric(FLERR, arg[4], false, lmp); + c2style = CONSTANT; + } + + if (utils::strmatch(arg[5], "^v_")) { + rlostr = utils::strdup(arg[5] + 2); + radiuslo = 0.0; + rlostyle = VARIABLE; + varshape = 1; + } else { + radiuslo = xscale * utils::numeric(FLERR, arg[5], false, lmp); + rlostyle = CONSTANT; + } + + if (utils::strmatch(arg[6], "^v_")) { + rhistr = utils::strdup(arg[6] + 2); + radiushi = 0.0; + rhistyle = VARIABLE; + varshape = 1; + } else { + radiushi = xscale * utils::numeric(FLERR, arg[6], false, lmp); + rhistyle = CONSTANT; + } + } + lostyle = CONSTANT; if (strcmp(arg[7], "INF") == 0 || strcmp(arg[7], "EDGE") == 0) { if (domain->box_exist == 0) error->all(FLERR, "Cannot use region INF or EDGE when box does not exist"); @@ -87,6 +203,11 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo else lo = domain->boxlo_bound[2]; } + } else if (utils::strmatch(arg[7], "^v_")) { + lostr = utils::strdup(arg[7] + 2); + lo = 0.0; + lostyle = VARIABLE; + varshape = 1; } else { if (axis == 'x') lo = xscale * utils::numeric(FLERR, arg[7], false, lmp); if (axis == 'y') lo = yscale * utils::numeric(FLERR, arg[7], false, lmp); @@ -119,26 +240,32 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo else hi = domain->boxhi_bound[2]; } + } else if (utils::strmatch(arg[8], "^v_")) { + histr = utils::strdup(arg[8] + 2); + hi = 0.0; + histyle = VARIABLE; + varshape = 1; } else { if (axis == 'x') hi = xscale * utils::numeric(FLERR, arg[8], false, lmp); if (axis == 'y') hi = yscale * utils::numeric(FLERR, arg[8], false, lmp); if (axis == 'z') hi = zscale * utils::numeric(FLERR, arg[8], false, lmp); } + if (varshape) { + variable_check(); + RegCone::shape_update(); + } + // error check if (radiuslo < 0.0) error->all(FLERR, "Illegal radius in region cone command"); if (radiushi < 0.0) error->all(FLERR, "Illegal radius in region cone command"); if (radiuslo == 0.0 && radiushi == 0.0) error->all(FLERR, "Illegal radius in region cone command"); - if (hi == lo) error->all(FLERR, "Illegal cone length in region cone command"); + if (hi <= lo) error->all(FLERR, "Illegal cone length in region cone command"); // extent of cone - - if (radiuslo > radiushi) - maxradius = radiuslo; - else - maxradius = radiushi; + maxradius = ( (radiuslo > radiushi) ? radiuslo : radiushi); if (interior) { bboxflag = 1; @@ -174,10 +301,7 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo cmax = 3; contact = new Contact[cmax]; - if (interior) - tmax = 2; - else - tmax = 1; + tmax = (interior ? 2 : 1); } /* ---------------------------------------------------------------------- */ @@ -187,6 +311,14 @@ RegCone::~RegCone() delete[] contact; } +/* ---------------------------------------------------------------------- */ + +void RegCone::init() +{ + Region::init(); + if (varshape) variable_check(); +} + /* ---------------------------------------------------------------------- inside = 1 if x,y,z is inside or on surface inside = 0 if x,y,z is outside and not on surface @@ -622,6 +754,101 @@ int RegCone::surface_exterior(double *x, double cutoff) } } +/* ---------------------------------------------------------------------- + change region shape via variable evaluation +------------------------------------------------------------------------- */ + +void RegCone::shape_update() +{ + if (c1style == VARIABLE) c1 = input->variable->compute_equal(c1var); + if (c2style == VARIABLE) c2 = input->variable->compute_equal(c2var); + if (rlostyle == VARIABLE) { + radiuslo = input->variable->compute_equal(rlovar); + if (radiuslo < 0.0) error->one(FLERR, "Variable evaluation in region gave bad value"); + } + if (rhistyle == VARIABLE) { + radiushi = input->variable->compute_equal(rhivar); + if (radiushi < 0.0) error->one(FLERR, "Variable evaluation in region gave bad value"); + } + if (lostyle == VARIABLE) lo = input->variable->compute_equal(lovar); + if (histyle == VARIABLE) hi = input->variable->compute_equal(hivar); + + if (radiuslo == 0.0 && radiushi == 0.0) + error->all(FLERR, "dtion in region gave bad value"); + + if (axis == 'x') { + if (c1style == VARIABLE) c1 *= yscale; + if (c2style == VARIABLE) c2 *= zscale; + if (rlostyle == VARIABLE) radiuslo *= yscale; + if (rhistyle == VARIABLE) radiushi *= yscale; + if (lostyle == VARIABLE) lo *= xscale; + if (histyle == VARIABLE) hi *= xscale; + } else if (axis == 'y') { + if (c1style == VARIABLE) c1 *= xscale; + if (c2style == VARIABLE) c2 *= zscale; + if (rlostyle == VARIABLE) radiuslo *= xscale; + if (rhistyle == VARIABLE) radiushi *= xscale; + if (lostyle == VARIABLE) lo *= yscale; + if (histyle == VARIABLE) hi *= yscale; + } else { + if (c1style == VARIABLE) c1 *= xscale; + if (c2style == VARIABLE) c2 *= yscale; + if (rlostyle == VARIABLE) radiuslo *= xscale; + if (rhistyle == VARIABLE) radiushi *= xscale; + if (lostyle == VARIABLE) lo *= zscale; + if (histyle == VARIABLE) hi *= zscale; + } +} + +/* ---------------------------------------------------------------------- + error check on existence of variable +------------------------------------------------------------------------- */ + +void RegCone::variable_check() +{ + if (c1style == VARIABLE) { + c1var = input->variable->find(c1str); + if (c1var < 0) error->all(FLERR, "Variable {} for region cone does not exist", c1str); + if (!input->variable->equalstyle(c1var)) + error->all(FLERR, "Variable {} for region cone is invalid style", c1str); + } + + if (c2style == VARIABLE) { + c2var = input->variable->find(c2str); + if (c2var < 0) error->all(FLERR, "Variable {} for region cone does not exist", c2str); + if (!input->variable->equalstyle(c2var)) + error->all(FLERR, "Variable {} for region cone is invalid style", c2str); + } + + if (rlostyle == VARIABLE) { + rlovar = input->variable->find(rlostr); + if (rlovar < 0) error->all(FLERR, "Variable {} for region cone does not exist", rlostr); + if (!input->variable->equalstyle(rlovar)) + error->all(FLERR, "Variable {} for region cone is invalid style", rlostr); + } + + if (rhistyle == VARIABLE) { + rhivar = input->variable->find(rhistr); + if (rhivar < 0) error->all(FLERR, "Variable {} for region cone does not exist", rhistr); + if (!input->variable->equalstyle(rhivar)) + error->all(FLERR, "Variable {} for region cone is invalid style", rhistr); + } + + if (lostyle == VARIABLE) { + lovar = input->variable->find(lostr); + if (lovar < 0) error->all(FLERR, "Variable {} for region cone does not exist", lostr); + if (!input->variable->equalstyle(lovar)) + error->all(FLERR, "Variable {} for region cone is invalid style", lostr); + } + + if (histyle == VARIABLE) { + hivar = input->variable->find(histr); + if (hivar < 0) error->all(FLERR, "Variable {} for region cone does not exist", histr); + if (!input->variable->equalstyle(hivar)) + error->all(FLERR, "Variable {} for region cone is invalid style", histr); + } +} + /* ---------------------------------------------------------------------- */ double RegCone::closest(double *x, double *near, double *nearest, double dsq) From c180f3d8255429246538dea2b847418795846319 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 20 Oct 2023 13:31:48 +0300 Subject: [PATCH 247/417] Include method & variable definitions in region_cone.h --- src/region_cone.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/region_cone.h b/src/region_cone.h index 25fdcc9713..81288d26b8 100644 --- a/src/region_cone.h +++ b/src/region_cone.h @@ -28,9 +28,11 @@ class RegCone : public Region { public: RegCone(class LAMMPS *, int, char **); ~RegCone() override; + void init() override; int inside(double, double, double) override; int surface_interior(double *, double) override; int surface_exterior(double *, double) override; + void shape_update() override; private: char axis; @@ -39,7 +41,12 @@ class RegCone : public Region { double lo, hi; double maxradius; + int c1style, c2style, rlostyle, rhistyle, lostyle, histyle; + int c1var, c2var, rlovar, rhivar, lovar, hivar; + char *c1str, *c2str, *rlostr, *rhistr, *lostr, *histr; + double closest(double *, double *, double *, double); + void variable_check(); }; } // namespace LAMMPS_NS From b22d0afd9779a21a6f12f7a6c660de2fe63c2fd4 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 20 Oct 2023 13:41:00 +0300 Subject: [PATCH 248/417] Update region.rst --- doc/src/region.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/src/region.rst b/doc/src/region.rst index 36c7c799dc..9d2af01de1 100644 --- a/doc/src/region.rst +++ b/doc/src/region.rst @@ -24,6 +24,7 @@ Syntax c1,c2 = coords of cone axis in other 2 dimensions (distance units) radlo,radhi = cone radii at lo and hi end (distance units) lo,hi = bounds of cone in dim (distance units) + c1,c2,radlo,radhi,lo,hi can be a variable (see below) *cylinder* args = dim c1 c2 radius lo hi dim = *x* or *y* or *z* = axis of cylinder c1,c2 = coords of cylinder axis in other 2 dimensions (distance units) @@ -206,7 +207,8 @@ equal-style :doc:`variable `. Likewise, for style *sphere* and *ellipsoid* the x-, y-, and z- coordinates of the center of the sphere/ellipsoid can be specified as an equal-style variable. And for style *cylinder* the two center positions c1 and c2 for the location -of the cylinder axes can be specified as a equal-style variable. +of the cylinder axes can be specified as a equal-style variable. For style *cone* +all properties can be defined via equal-style variables. If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be From 61371bba5e7d05c9179a1c6e956b2e95122381af Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 20 Oct 2023 13:44:35 +0300 Subject: [PATCH 249/417] remove whitespace from region_cone.cpp --- src/region_cone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/region_cone.cpp b/src/region_cone.cpp index 8eb140211d..1a0f31563f 100644 --- a/src/region_cone.cpp +++ b/src/region_cone.cpp @@ -141,7 +141,7 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo } else { c1 = xscale * utils::numeric(FLERR, arg[3], false, lmp); c1style = CONSTANT; - } + } if (utils::strmatch(arg[4], "^v_")) { c2str = utils::strdup(arg[4] + 2); From ccbe907defc3dd7c808560a99430802f34ce0205 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 20 Oct 2023 14:24:45 +0300 Subject: [PATCH 250/417] avoid memory leak --- src/region_cone.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/region_cone.cpp b/src/region_cone.cpp index 1a0f31563f..64f0495dd6 100644 --- a/src/region_cone.cpp +++ b/src/region_cone.cpp @@ -308,6 +308,12 @@ RegCone::RegCone(LAMMPS *lmp, int narg, char **arg) : Region(lmp, narg, arg), lo RegCone::~RegCone() { + delete[] c1str; + delete[] c2str; + delete[] rlostr; + delete[] rhistr; + delete[] lostr; + delete[] histr; delete[] contact; } From 291defb45378eb759470347c97610335a26c9efb Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 20 Oct 2023 12:57:19 -0600 Subject: [PATCH 251/417] update refs on fix srd doc page --- doc/src/fix_srd.rst | 51 +++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index 8bfbcf2387..c15a566563 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -61,25 +61,30 @@ Description Treat a group of particles as stochastic rotation dynamics (SRD) particles that serve as a background solvent when interacting with big (colloidal) particles in groupbig-ID. The SRD formalism is described -in :ref:`(Hecht) `. The key idea behind using SRD particles as a -cheap coarse-grained solvent is that SRD particles do not interact -with each other, but only with the solute particles, which in LAMMPS -can be spheroids, ellipsoids, or line segments, or triangles, or rigid -bodies containing multiple spheroids or ellipsoids or line segments -or triangles. The collision and rotation properties of the model -imbue the SRD particles with fluid-like properties, including an -effective viscosity. Thus simulations with large solute particles can -be run more quickly, to measure solute properties like diffusivity -and viscosity in a background fluid. The usual LAMMPS fixes for such -simulations, such as :doc:`fix deform `, -:doc:`fix viscosity `, and :doc:`fix nvt/sllod `, -can be used in conjunction with the SRD model. +in :ref:`(Hecht) `. The same methodology is also called +multi-particle collision dynamics (MPCD) in the literature. -For more details on how the SRD model is implemented in LAMMPS, -:ref:`(Petersen) ` describes the implementation and usage of -pure SRD fluids. See the ``examples/srd`` directory for sample input -scripts using SRD particles for that and for mixture systems (solute -particles in an SRD fluid). +The key idea behind using SRD particles as a cheap coarse-grained +solvent is that SRD particles do not interact with each other, but +only with the solute particles, which in LAMMPS can be spheroids, +ellipsoids, or line segments, or triangles, or rigid bodies containing +multiple spheroids or ellipsoids or line segments or triangles. The +collision and rotation properties of the model imbue the SRD particles +with fluid-like properties, including an effective viscosity. Thus +simulations with large solute particles can be run more quickly, to +measure solute properties like diffusivity and viscosity in a +background fluid. The usual LAMMPS fixes for such simulations, such +as :doc:`fix deform `, :doc:`fix viscosity +`, and :doc:`fix nvt/sllod `, can be +used in conjunction with the SRD model. + +These 3 papers give more details on how the SRD model is implemented +in LAMMPS. :ref:`(Petersen) ` describes pure SRD fluid +systems. :ref:`(Bolintineanu1) ` describes models +where pure SRD fluids :ref:interact with boundary walls. +:ref:`(Bolintineanu2) :ref:` describes mixture models +where large colloidal particles are solvated by an SRD fluid. See the +``examples/srd`` :ref:directory for sample input scripts. This fix does two things: @@ -404,3 +409,13 @@ no, and rescale = yes. **(Petersen)** Petersen, Lechman, Plimpton, Grest, in' t Veld, Schunk, J Chem Phys, 132, 174106 (2010). + +.. _Bolintineanu1: + +**(Bolintineanu1)** +Bolintineanu, Lechman, Plimpton, Grest, Phys Rev E, 86, 066703 (2012). + +.. _Bolintineanu2: + +**(Bolintineanu2)** Bolintineanu, Grest, Lechman, Pierce, Plimpton, +Schunk, Comp Particle Mechanics, 1, 321-356 (2014). From 654a410b8c90840003c0dbaed27ae8672cccff27 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 20 Oct 2023 12:59:36 -0600 Subject: [PATCH 252/417] update refs on fix srd doc page --- doc/src/fix_srd.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index c15a566563..59044a6e3b 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -82,8 +82,8 @@ These 3 papers give more details on how the SRD model is implemented in LAMMPS. :ref:`(Petersen) ` describes pure SRD fluid systems. :ref:`(Bolintineanu1) ` describes models where pure SRD fluids :ref:interact with boundary walls. -:ref:`(Bolintineanu2) :ref:` describes mixture models -where large colloidal particles are solvated by an SRD fluid. See the +:ref:`(Bolintineanu2) ` describes mixture models where +large colloidal particles are solvated by an SRD fluid. See the ``examples/srd`` :ref:directory for sample input scripts. This fix does two things: From e1d876b7fe384868584ff5a34eca9a8aa5ac9a47 Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Fri, 20 Oct 2023 18:41:46 -0600 Subject: [PATCH 253/417] kokkos working --- src/KOKKOS/pair_mliap_kokkos.cpp | 9 ++++++++- src/ML-IAP/pair_mliap.cpp | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/pair_mliap_kokkos.cpp b/src/KOKKOS/pair_mliap_kokkos.cpp index 2061de308b..41f1d0170b 100644 --- a/src/KOKKOS/pair_mliap_kokkos.cpp +++ b/src/KOKKOS/pair_mliap_kokkos.cpp @@ -31,6 +31,7 @@ #include "lammps.h" #include "kokkos.h" #include "pointers.h" +#include using namespace LAMMPS_NS; @@ -138,6 +139,7 @@ template void PairMLIAPKokkos::allocate() { int n = atom->ntypes; + std::cout << "cutsq size: " << n+1 << std::endl; memoryKK->destroy_kokkos(k_map, map); memoryKK->destroy_kokkos(k_cutsq, cutsq); memoryKK->destroy_kokkos(k_setflag, setflag); @@ -272,10 +274,15 @@ void PairMLIAPKokkos::coeff(int narg, char **arg) { model->init(); descriptor->init(); + std::cout << "atom ntypes: " << atom->ntypes << std::endl; + auto h_cutsq=k_cutsq.template view(); for (int itype=1; itype <= atom->ntypes; ++itype) for (int jtype=1; jtype <= atom->ntypes; ++jtype) - h_cutsq(itype,jtype) = descriptor->cutsq[map[itype]][map[jtype]]; + // do not set cuts for NULL atoms + if (map[itype] >= 0 && map[jtype] >=0) { + h_cutsq(itype,jtype) = descriptor->cutsq[map[itype]][map[jtype]]; + } k_cutsq.modify(); k_cutsq.sync(); constexpr int gradgradflag = -1; diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 66e8b848cd..18f4054373 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -37,6 +37,7 @@ #include #include +#include using namespace LAMMPS_NS; @@ -120,7 +121,7 @@ void PairMLIAP::allocate() { allocated = 1; int n = atom->ntypes; - + std::cout << "cutsq size: " << n+1 << std::endl; memory->create(setflag,n+1,n+1,"pair:setflag"); memory->create(cutsq,n+1,n+1,"pair:cutsq"); memory->create(cutghost,n+1,n+1,"pair:cutghost"); From fd05acec2fc0fc8756a2e8564a45a276f8f2e3c2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Oct 2023 20:54:05 -0400 Subject: [PATCH 254/417] fix spelling --- doc/src/compute.rst | 2 +- doc/src/compute_voronoi_atom.rst | 2 +- doc/src/fix.rst | 2 +- doc/src/fix_ave_histo.rst | 4 ++-- doc/src/thermo_style.rst | 2 +- doc/src/variable.rst | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/src/compute.rst b/doc/src/compute.rst index cc26d9acc9..6737203618 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -74,7 +74,7 @@ Global, per-atom, local, and per-grid quantities can also be of three for each atom, each local entity, or each grid cell. Note that a single compute can produce any combination of global, -per-atom, local, or per-grid values. Likewise it can prouduce any +per-atom, local, or per-grid values. Likewise it can produce any combination of scalar, vector, or array output for each style. The exception is that for per-atom, local, and per-grid output, either a vector or array can be produced, but not both. The doc page for each diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 37e5386341..9607401ccd 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -232,4 +232,4 @@ Related commands Default """"""" -The default for the neighobrs keyword is no. +The default for the neighbors keyword is no. diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 3dd7e224e7..0889fe281f 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -106,7 +106,7 @@ Global, per-atom, local, and per-grid quantities can also be of three for each atom, each local entity, or each grid cell. Note that a single fix can produce any combination of global, -per-atom, local, or per-grid values. Likewise it can prouduce any +per-atom, local, or per-grid values. Likewise it can produce any combination of scalar, vector, or array output for each style. The exception is that for per-atom, local, and per-grid output, either a vector or array can be produced, but not both. The doc page for each diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index 31e5476f9e..9699e4238c 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -106,7 +106,7 @@ attributes are per-atom vector values. See the page for individual generate. Note that a compute or fix can produce multiple kinds of data (global, -per-atom, local). If LAMMPS cannot unambiguosly determine which kind +per-atom, local). If LAMMPS cannot unambiguously determine which kind of data to use, the optional *kind* keyword discussed below can force the desired disambiguation. @@ -263,7 +263,7 @@ 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 used if any of the specfied input +The *kind* keyword only needs to be used if any of the specified input computes or fixes produce more than one kind of output (global, per-atom, local). If not, LAMMPS will determine the kind of data all the inputs produce and verify it is all the same kind. If not, an diff --git a/doc/src/thermo_style.rst b/doc/src/thermo_style.rst index c3c607a479..89a2c0b740 100644 --- a/doc/src/thermo_style.rst +++ b/doc/src/thermo_style.rst @@ -442,7 +442,7 @@ equal-style and vector-style variables can be referenced; the latter requires a bracketed term to specify the Ith element of the vector calculated by the variable. However, an equal-style variable can use an atom-style variable in its formula indexed by the ID of an -individual atom. This is a way to output a speciic atom's per-atom +individual atom. This is a way to output a specific atom's per-atom coordinates or other per-atom properties in thermo output. See the :doc:`variable ` command for details. Note that variables of style *equal* and *vector* and *atom* define a formula which can diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 3407b48156..92a78ee3c1 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -1167,7 +1167,7 @@ variables), or global vectors of values. The latter can also be a column of a global array. Atom-style variables can use scalar values (same as for equal-style -varaibles), or per-atom vectors of values. The latter can also be a +variables), or per-atom vectors of values. The latter can also be a column of a per-atom array. The various allowed compute references in the variable formulas for @@ -1232,7 +1232,7 @@ variables), or global vectors of values. The latter can also be a column of a global array. Atom-style variables can use scalar values (same as for equal-style -varaibles), or per-atom vectors of values. The latter can also be a +variables), or per-atom vectors of values. The latter can also be a column of a per-atom array. The allowed fix references in variable formulas for equal-, vector-, From 1064c82c00c826f5159eef864b0716f40fdf81dc Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Fri, 20 Oct 2023 18:56:20 -0600 Subject: [PATCH 255/417] Cleaned of print statements --- src/KOKKOS/pair_mliap_kokkos.cpp | 5 +---- src/ML-IAP/mliap_unified.cpp | 3 --- src/ML-IAP/pair_mliap.cpp | 3 +-- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/KOKKOS/pair_mliap_kokkos.cpp b/src/KOKKOS/pair_mliap_kokkos.cpp index 41f1d0170b..d991a93420 100644 --- a/src/KOKKOS/pair_mliap_kokkos.cpp +++ b/src/KOKKOS/pair_mliap_kokkos.cpp @@ -31,7 +31,6 @@ #include "lammps.h" #include "kokkos.h" #include "pointers.h" -#include using namespace LAMMPS_NS; @@ -139,7 +138,7 @@ template void PairMLIAPKokkos::allocate() { int n = atom->ntypes; - std::cout << "cutsq size: " << n+1 << std::endl; + memoryKK->destroy_kokkos(k_map, map); memoryKK->destroy_kokkos(k_cutsq, cutsq); memoryKK->destroy_kokkos(k_setflag, setflag); @@ -274,8 +273,6 @@ void PairMLIAPKokkos::coeff(int narg, char **arg) { model->init(); descriptor->init(); - std::cout << "atom ntypes: " << atom->ntypes << std::endl; - auto h_cutsq=k_cutsq.template view(); for (int itype=1; itype <= atom->ntypes; ++itype) for (int jtype=1; jtype <= atom->ntypes; ++jtype) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 49c9660098..de1d0bcb7d 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -29,8 +29,6 @@ #include "python_compat.h" #include "utils.h" -#include - using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -274,7 +272,6 @@ void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) //const auto nlistatoms = data->nlistatoms; const auto nlocal = data->nlocal; double **f = data->f; - std::cout << "nlocal value: " << nlocal << std::endl; for (int ii = 0; ii < data->npairs; ii++) { int ii3 = ii * 3; int i = data->pair_i[ii]; diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 18f4054373..79efc1f156 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -37,7 +37,6 @@ #include #include -#include using namespace LAMMPS_NS; @@ -121,7 +120,7 @@ void PairMLIAP::allocate() { allocated = 1; int n = atom->ntypes; - std::cout << "cutsq size: " << n+1 << std::endl; + memory->create(setflag,n+1,n+1,"pair:setflag"); memory->create(cutsq,n+1,n+1,"pair:cutsq"); memory->create(cutghost,n+1,n+1,"pair:cutghost"); From 3d480a01a5d400d6451c1f5e0831de0b75ce3663 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Fri, 20 Oct 2023 23:41:06 -0400 Subject: [PATCH 256/417] add the missing dividing by np in compute t_prim --- src/REPLICA/fix_pimd_langevin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index c091075f7c..a28bc9506b 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -1347,7 +1347,7 @@ void FixPIMDLangevin::compute_tote() void FixPIMDLangevin::compute_t_prim() { - t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy; + t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy / np; } /* ---------------------------------------------------------------------- */ From 80f72e7a1d560d0a555cea4048417d52e924199f Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Sat, 21 Oct 2023 00:28:33 -0400 Subject: [PATCH 257/417] use times inverse_np instead --- src/REPLICA/fix_pimd_langevin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index a28bc9506b..cffaf327e4 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -1347,7 +1347,7 @@ void FixPIMDLangevin::compute_tote() void FixPIMDLangevin::compute_t_prim() { - t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy / np; + t_prim = 1.5 * atom->natoms * np * force->boltz * temp - total_spring_energy * inverse_np; } /* ---------------------------------------------------------------------- */ From a7fb81c68eaf0e29679c94872cc8f4d0d4be4ab6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Oct 2023 06:28:14 -0400 Subject: [PATCH 258/417] must initialize deleted pointers to null since the following commands may fail --- src/force.cpp | 10 ++++++++++ src/update.cpp | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/force.cpp b/src/force.cpp index 14d48d1a73..67187f8dd6 100644 --- a/src/force.cpp +++ b/src/force.cpp @@ -336,6 +336,8 @@ void Force::create_bond(const std::string &style, int trysuffix) { delete[] bond_style; if (bond) delete bond; + bond_style = nullptr; + bond = nullptr; int sflag; bond = new_bond(style, trysuffix, sflag); @@ -404,6 +406,8 @@ void Force::create_angle(const std::string &style, int trysuffix) { delete[] angle_style; if (angle) delete angle; + angle_style = nullptr; + angle = nullptr; int sflag; angle = new_angle(style, trysuffix, sflag); @@ -472,6 +476,8 @@ void Force::create_dihedral(const std::string &style, int trysuffix) { delete[] dihedral_style; if (dihedral) delete dihedral; + dihedral_style = nullptr; + dihedral = nullptr; int sflag; dihedral = new_dihedral(style, trysuffix, sflag); @@ -540,6 +546,8 @@ void Force::create_improper(const std::string &style, int trysuffix) { delete[] improper_style; if (improper) delete improper; + improper_style = nullptr; + improper = nullptr; int sflag; improper = new_improper(style, trysuffix, sflag); @@ -608,6 +616,8 @@ void Force::create_kspace(const std::string &style, int trysuffix) { delete[] kspace_style; if (kspace) delete kspace; + kspace_style = nullptr; + kspace = nullptr; int sflag; kspace = new_kspace(style, trysuffix, sflag); diff --git a/src/update.cpp b/src/update.cpp index 04d3f7e1e6..1704e7c439 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -332,6 +332,8 @@ void Update::create_integrate(int narg, char **arg, int trysuffix) delete[] integrate_style; delete integrate; + integrate_style = nullptr; + integrate = nullptr; int sflag; @@ -400,6 +402,8 @@ void Update::create_minimize(int narg, char **arg, int trysuffix) delete[] minimize_style; delete minimize; + minimize_style = nullptr; + minimize = nullptr; // temporarily assign the style name without suffix (for error messages during creation) minimize_style = arg[0]; From 08edd193e20400d8686471d4bc713e4b6aee6eff Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Oct 2023 06:28:35 -0400 Subject: [PATCH 259/417] programming style updates --- src/atom.cpp | 5 +---- src/update.cpp | 10 +++------- src/update.h | 22 +++++++++++----------- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/atom.cpp b/src/atom.cpp index c4521a244e..c22556ff9d 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -89,7 +89,7 @@ are updated by the AtomVec class as needed. * * \param _lmp pointer to the base LAMMPS class */ -Atom::Atom(LAMMPS *_lmp) : Pointers(_lmp) +Atom::Atom(LAMMPS *_lmp) : Pointers(_lmp), atom_style(nullptr), avec(nullptr), avec_map(nullptr) { natoms = 0; nlocal = nghost = nmax = 0; @@ -272,9 +272,6 @@ Atom::Atom(LAMMPS *_lmp) : Pointers(_lmp) unique_tags = nullptr; reset_image_flag[0] = reset_image_flag[1] = reset_image_flag[2] = false; - atom_style = nullptr; - avec = nullptr; - avec_map = new AtomVecCreatorMap(); #define ATOM_CLASS diff --git a/src/update.cpp b/src/update.cpp index 1704e7c439..13ff7c872a 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -46,7 +46,9 @@ template static Min *minimize_creator(LAMMPS *lmp) /* ---------------------------------------------------------------------- */ -Update::Update(LAMMPS *lmp) : Pointers(lmp) +Update::Update(LAMMPS *lmp) : + Pointers(lmp), unit_style(nullptr), integrate(nullptr), integrate_style(nullptr), + minimize(nullptr), minimize_style(nullptr), integrate_map(nullptr), minimize_map(nullptr) { char *str; @@ -67,14 +69,8 @@ Update::Update(LAMMPS *lmp) : Pointers(lmp) dt_default = 1; dt = 0.0; - unit_style = nullptr; set_units("lj"); - integrate_style = nullptr; - integrate = nullptr; - minimize_style = nullptr; - minimize = nullptr; - integrate_map = new IntegrateCreatorMap(); #define INTEGRATE_CLASS diff --git a/src/update.h b/src/update.h index 7ed61ba296..3848eb3a1e 100644 --- a/src/update.h +++ b/src/update.h @@ -22,6 +22,17 @@ namespace LAMMPS_NS { class Update : protected Pointers { public: + Update(class LAMMPS *); + ~Update() override; + void init(); + void set_units(const char *); + void create_integrate(int, char **, int); + void create_minimize(int, char **, int); + void reset_timestep(int, char **); + void reset_timestep(bigint, bool); + void update_time(); + double memory_usage(); + double dt; // timestep double etol, ftol; // minimizer tolerances on energy/force bigint ntimestep; // current step (dynamics or min iterations) @@ -58,17 +69,6 @@ class Update : protected Pointers { IntegrateCreatorMap *integrate_map; MinimizeCreatorMap *minimize_map; - Update(class LAMMPS *); - ~Update() override; - void init(); - void set_units(const char *); - void create_integrate(int, char **, int); - void create_minimize(int, char **, int); - void reset_timestep(int, char **); - void reset_timestep(bigint, bool); - void update_time(); - double memory_usage(); - private: void new_integrate(char *, int, char **, int, int &); void new_minimize(char *, int, char **, int, int &); From b5a01e84e127cf89912c3e6017fe6e24ae6d6eb1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Oct 2023 18:09:11 -0400 Subject: [PATCH 260/417] consolidate dump file field enumerators into reader.h header for consistency --- src/ADIOS/reader_adios.cpp | 5 -- src/MOLFILE/reader_molfile.cpp | 1 - src/read_dump.cpp | 137 ++++++++++++++++----------------- src/reader.h | 3 + src/reader_native.cpp | 5 -- src/reader_xyz.cpp | 2 - 6 files changed, 71 insertions(+), 82 deletions(-) diff --git a/src/ADIOS/reader_adios.cpp b/src/ADIOS/reader_adios.cpp index 362192479e..ec87bc26cc 100644 --- a/src/ADIOS/reader_adios.cpp +++ b/src/ADIOS/reader_adios.cpp @@ -30,11 +30,6 @@ using namespace LAMMPS_NS; -// also in read_dump.cpp - -enum { ID, TYPE, X, Y, Z, VX, VY, VZ, Q, IX, IY, IZ, FX, FY, FZ }; -enum { UNSET, NOSCALE_NOWRAP, NOSCALE_WRAP, SCALE_NOWRAP, SCALE_WRAP }; - #define SMALL 1.0e-6 namespace LAMMPS_NS { diff --git a/src/MOLFILE/reader_molfile.cpp b/src/MOLFILE/reader_molfile.cpp index 49ed347e84..441a152ad9 100644 --- a/src/MOLFILE/reader_molfile.cpp +++ b/src/MOLFILE/reader_molfile.cpp @@ -29,7 +29,6 @@ using namespace LAMMPS_NS; typedef MolfileInterface MFI; using namespace MathConst; -enum{ID,TYPE,X,Y,Z,VX,VY,VZ}; #define SMALL 1.0e-6 // true if the difference between two floats is "small". diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 71ea0288e5..e4f31a712a 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -35,11 +35,7 @@ using namespace LAMMPS_NS; #define CHUNK 16384 -// also in reader_native.cpp - -enum{ID,TYPE,X,Y,Z,VX,VY,VZ,Q,IX,IY,IZ,FX,FY,FZ}; -enum{UNSET,NOSCALE_NOWRAP,NOSCALE_WRAP,SCALE_NOWRAP,SCALE_WRAP}; -enum{NOADD,YESADD,KEEPADD}; +enum { NOADD, YESADD, KEEPADD }; /* ---------------------------------------------------------------------- */ @@ -536,30 +532,30 @@ void ReadDump::header(int fieldinfo) int value = MAX(xflag,yflag); value = MAX(zflag,value); - if ((xflag != UNSET && xflag != value) || - (yflag != UNSET && yflag != value) || - (zflag != UNSET && zflag != value)) + if ((xflag != Reader::UNSET && xflag != value) || + (yflag != Reader::UNSET && yflag != value) || + (zflag != Reader::UNSET && zflag != value)) error->one(FLERR, "Read_dump xyz fields do not have consistent scaling/wrapping"); // set scaled/wrapped based on xyz flags - value = UNSET; - if (xflag != UNSET) value = xflag; - if (yflag != UNSET) value = yflag; - if (zflag != UNSET) value = zflag; + value = Reader::UNSET; + if (xflag != Reader::UNSET) value = xflag; + if (yflag != Reader::UNSET) value = yflag; + if (zflag != Reader::UNSET) value = zflag; - if (value == UNSET) { + if (value == Reader::UNSET) { scaled = wrapped = 0; - } else if (value == NOSCALE_NOWRAP) { + } else if (value == Reader::NOSCALE_NOWRAP) { scaled = wrapped = 0; - } else if (value == NOSCALE_WRAP) { + } else if (value == Reader::NOSCALE_WRAP) { scaled = 0; wrapped = 1; - } else if (value == SCALE_NOWRAP) { + } else if (value == Reader::SCALE_NOWRAP) { scaled = 1; wrapped = 0; - } else if (value == SCALE_WRAP) { + } else if (value == Reader::SCALE_WRAP) { scaled = wrapped = 1; } @@ -569,16 +565,16 @@ void ReadDump::header(int fieldinfo) if (scaled && triclinic == 1) { int flag = 0; - if (xflag == UNSET) flag = 1; - if (yflag == UNSET) flag = 1; - if (dimension == 3 && zflag == UNSET) flag = 1; + if (xflag == Reader::UNSET) flag = 1; + if (yflag == Reader::UNSET) flag = 1; + if (domain->dimension == 3 && zflag == Reader::UNSET) flag = 1; if (flag) error->one(FLERR,"All read_dump x,y,z fields must be specified for " "scaled, triclinic coords"); for (int i = 0; i < nfield; i++) { - if (fieldtype[i] == Y) yindex = i; - if (fieldtype[i] == Z) zindex = i; + if (fieldtype[i] == Reader::Y) yindex = i; + if (fieldtype[i] == Reader::Z) zindex = i; } } } @@ -864,43 +860,43 @@ void ReadDump::process_atoms() for (ifield = 1; ifield < nfield; ifield++) { switch (fieldtype[ifield]) { - case X: + case Reader::X: x[m][0] = xfield(i,ifield); break; - case Y: + case Reader::Y: x[m][1] = yfield(i,ifield); break; - case Z: + case Reader::Z: x[m][2] = zfield(i,ifield); break; - case VX: + case Reader::VX: v[m][0] = fields[i][ifield]; break; - case Q: + case Reader::Q: q[m] = fields[i][ifield]; break; - case VY: + case Reader::VY: v[m][1] = fields[i][ifield]; break; - case VZ: + case Reader::VZ: v[m][2] = fields[i][ifield]; break; - case IX: + case Reader::IX: xbox = static_cast (fields[i][ifield]); break; - case IY: + case Reader::IY: ybox = static_cast (fields[i][ifield]); break; - case IZ: + case Reader::IZ: zbox = static_cast (fields[i][ifield]); break; - case FX: + case Reader::FX: f[m][0] = fields[i][ifield]; break; - case FY: + case Reader::FY: f[m][1] = fields[i][ifield]; break; - case FZ: + case Reader::FZ: f[m][2] = fields[i][ifield]; break; } @@ -952,7 +948,7 @@ void ReadDump::process_atoms() int tflag = 0; for (ifield = 0; ifield < nfield; ifield++) - if (fieldtype[ifield] == TYPE) tflag = 1; + if (fieldtype[ifield] == Reader::TYPE) tflag = 1; if (!tflag) error->all(FLERR,"Cannot add atoms if dump file does not store atom type"); @@ -969,16 +965,16 @@ void ReadDump::process_atoms() one[0] = one[1] = one[2] = 0.0; for (ifield = 1; ifield < nfield; ifield++) { switch (fieldtype[ifield]) { - case TYPE: + case Reader::TYPE: itype = static_cast (fields[i][ifield]); break; - case X: + case Reader::X: one[0] = xfield(i,ifield); break; - case Y: + case Reader::Y: one[1] = yfield(i,ifield); break; - case Z: + case Reader::Z: one[2] = zfield(i,ifield); break; } @@ -1002,29 +998,29 @@ void ReadDump::process_atoms() for (ifield = 0; ifield < nfield; ifield++) { switch (fieldtype[ifield]) { - case ID: + case Reader::ID: if (addflag == KEEPADD) tag[m] = static_cast (fields[i][ifield]); break; - case VX: + case Reader::VX: v[m][0] = fields[i][ifield]; break; - case VY: + case Reader::VY: v[m][1] = fields[i][ifield]; break; - case VZ: + case Reader::VZ: v[m][2] = fields[i][ifield]; break; - case Q: + case Reader::Q: q[m] = fields[i][ifield]; break; - case IX: + case Reader::IX: xbox = static_cast (fields[i][ifield]); break; - case IY: + case Reader::IY: ybox = static_cast (fields[i][ifield]); break; - case IZ: + case Reader::IZ: zbox = static_cast (fields[i][ifield]); break; } @@ -1166,8 +1162,11 @@ int ReadDump::fields_and_keywords(int narg, char **arg) strcmp(arg[iarg+1],"keep") == 0)) break; nfield = 0; - fieldtype[nfield++] = ID; - if (iarg < narg) fieldtype[nfield++] = TYPE; + fieldtype[nfield++] = Reader::ID; + if (iarg < narg) { + if (comm->me == 0) utils::logmesg(lmp, "Adding 'type' field to requested per-atom fields"); + fieldtype[nfield++] = Reader::TYPE; + } // parse fields @@ -1175,7 +1174,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) while (iarg < narg) { int type = whichtype(arg[iarg]); if (type < 0) break; - if (type == Q && !atom->q_flag) + if (type == Reader::Q && !atom->q_flag) error->all(FLERR,"Read dump of atom property that isn't allocated"); fieldtype[nfield++] = type; iarg++; @@ -1183,13 +1182,13 @@ int ReadDump::fields_and_keywords(int narg, char **arg) // check for no fields - if (fieldtype[nfield-1] == ID || fieldtype[nfield-1] == TYPE) + if (fieldtype[nfield-1] == Reader::ID || fieldtype[nfield-1] == Reader::TYPE) error->all(FLERR,"Illegal read_dump command"); if (dimension == 2) { for (int i = 0; i < nfield; i++) - if (fieldtype[i] == Z || fieldtype[i] == VZ || - fieldtype[i] == IZ || fieldtype[i] == FZ) + if (fieldtype[i] == Reader::Z || fieldtype[i] == Reader::VZ || + fieldtype[i] == Reader::IZ || fieldtype[i] == Reader::FZ) error->all(FLERR,"Illegal read_dump command"); } @@ -1293,21 +1292,21 @@ int ReadDump::fields_and_keywords(int narg, char **arg) int ReadDump::whichtype(char *str) { int type = -1; - if (strcmp(str,"id") == 0) type = ID; - else if (strcmp(str,"type") == 0) type = TYPE; - else if (strcmp(str,"x") == 0) type = X; - else if (strcmp(str,"y") == 0) type = Y; - else if (strcmp(str,"z") == 0) type = Z; - else if (strcmp(str,"vx") == 0) type = VX; - else if (strcmp(str,"vy") == 0) type = VY; - else if (strcmp(str,"vz") == 0) type = VZ; - else if (strcmp(str,"q") == 0) type = Q; - else if (strcmp(str,"ix") == 0) type = IX; - else if (strcmp(str,"iy") == 0) type = IY; - else if (strcmp(str,"iz") == 0) type = IZ; - else if (strcmp(str,"fx") == 0) type = FX; - else if (strcmp(str,"fy") == 0) type = FY; - else if (strcmp(str,"fz") == 0) type = FZ; + if (strcmp(str,"id") == 0) type = Reader::ID; + else if (strcmp(str,"type") == 0) type = Reader::TYPE; + else if (strcmp(str,"x") == 0) type = Reader::X; + else if (strcmp(str,"y") == 0) type = Reader::Y; + else if (strcmp(str,"z") == 0) type = Reader::Z; + else if (strcmp(str,"vx") == 0) type = Reader::VX; + else if (strcmp(str,"vy") == 0) type = Reader::VY; + else if (strcmp(str,"vz") == 0) type = Reader::VZ; + else if (strcmp(str,"q") == 0) type = Reader::Q; + else if (strcmp(str,"ix") == 0) type = Reader::IX; + else if (strcmp(str,"iy") == 0) type = Reader::IY; + else if (strcmp(str,"iz") == 0) type = Reader::IZ; + else if (strcmp(str,"fx") == 0) type = Reader::FX; + else if (strcmp(str,"fy") == 0) type = Reader::FY; + else if (strcmp(str,"fz") == 0) type = Reader::FZ; return type; } diff --git a/src/reader.h b/src/reader.h index e8483b76cd..1dbd1253df 100644 --- a/src/reader.h +++ b/src/reader.h @@ -22,6 +22,9 @@ namespace LAMMPS_NS { class Reader : protected Pointers { public: + enum { ID, TYPE, X, Y, Z, VX, VY, VZ, Q, IX, IY, IZ, FX, FY, FZ }; + enum { UNSET, NOSCALE_NOWRAP, NOSCALE_WRAP, SCALE_NOWRAP, SCALE_WRAP }; + Reader(class LAMMPS *); ~Reader() override; diff --git a/src/reader_native.cpp b/src/reader_native.cpp index 3e7d01550d..92409389ef 100644 --- a/src/reader_native.cpp +++ b/src/reader_native.cpp @@ -26,11 +26,6 @@ using namespace LAMMPS_NS; #define MAXLINE 1024 // max line length in dump file -// also in read_dump.cpp - -enum{ID,TYPE,X,Y,Z,VX,VY,VZ,Q,IX,IY,IZ,FX,FY,FZ}; -enum{UNSET,NOSCALE_NOWRAP,NOSCALE_WRAP,SCALE_NOWRAP,SCALE_WRAP}; - /* ---------------------------------------------------------------------- */ ReaderNative::ReaderNative(LAMMPS *lmp) : Reader(lmp) diff --git a/src/reader_xyz.cpp b/src/reader_xyz.cpp index c11ec3a1a9..89257e9d36 100644 --- a/src/reader_xyz.cpp +++ b/src/reader_xyz.cpp @@ -25,8 +25,6 @@ using namespace LAMMPS_NS; #define MAXLINE 1024 // max line length in dump file -enum{ID,TYPE,X,Y,Z}; - /* ---------------------------------------------------------------------- */ ReaderXYZ::ReaderXYZ(LAMMPS *lmp) : Reader(lmp) From 1782008b28644241ff8619c6b37d82ef2170f2b7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Oct 2023 18:09:56 -0400 Subject: [PATCH 261/417] programming style updates --- src/read_dump.cpp | 112 ++++++++++++++++++++------------------------- src/read_dump.h | 5 -- src/reader_xyz.cpp | 2 +- 3 files changed, 50 insertions(+), 69 deletions(-) diff --git a/src/read_dump.cpp b/src/read_dump.cpp index e4f31a712a..893895f6f1 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -26,7 +26,7 @@ #include "irregular.h" #include "memory.h" #include "reader.h" -#include "style_reader.h" // IWYU pragma: keep +#include "style_reader.h" // IWYU pragma: keep #include "update.h" #include @@ -39,29 +39,16 @@ enum { NOADD, YESADD, KEEPADD }; /* ---------------------------------------------------------------------- */ -ReadDump::ReadDump(LAMMPS *lmp) : Command(lmp) +ReadDump::ReadDump(LAMMPS *lmp) : + Command(lmp), files(nullptr), readerstyle(nullptr), fieldtype(nullptr), fieldlabel(nullptr), + fields(nullptr), buf(nullptr), nsnapatoms(nullptr), readers(nullptr) { - MPI_Comm_rank(world,&me); - MPI_Comm_size(world,&nprocs); - - dimension = domain->dimension; - triclinic = domain->triclinic; - nfile = 0; - files = nullptr; - nnew = maxnew = 0; nfield = 0; - fieldtype = nullptr; - fieldlabel = nullptr; - fields = nullptr; - buf = nullptr; - readerstyle = utils::strdup("native"); nreader = 0; - readers = nullptr; - nsnapatoms = nullptr; clustercomm = MPI_COMM_NULL; filereader = 0; parallel = 0; @@ -71,19 +58,19 @@ ReadDump::ReadDump(LAMMPS *lmp) : Command(lmp) ReadDump::~ReadDump() { - for (int i = 0; i < nfile; i++) delete [] files[i]; - delete [] files; - for (int i = 0; i < nfield; i++) delete [] fieldlabel[i]; - delete [] fieldlabel; - delete [] fieldtype; - delete [] readerstyle; + for (int i = 0; i < nfile; i++) delete[] files[i]; + delete[] files; + for (int i = 0; i < nfield; i++) delete[] fieldlabel[i]; + delete[] fieldlabel; + delete[] fieldtype; + delete[] readerstyle; memory->destroy(fields); memory->destroy(buf); for (int i = 0; i < nreader; i++) delete readers[i]; - delete [] readers; - delete [] nsnapatoms; + delete[] readers; + delete[] nsnapatoms; MPI_Comm_free(&clustercomm); } @@ -108,7 +95,7 @@ void ReadDump::command(int narg, char **arg) // find the snapshot and read/bcast/process header info - if (me == 0) utils::logmesg(lmp,"Scanning dump file ...\n"); + if (comm->me == 0) utils::logmesg(lmp,"Scanning dump file ...\n"); bigint ntimestep = seek(nstep,1); if (ntimestep < 0) @@ -123,7 +110,7 @@ void ReadDump::command(int narg, char **arg) // read in the snapshot and reset system - if (me == 0) utils::logmesg(lmp,"Reading snapshot from dump file ...\n"); + if (comm->me == 0) utils::logmesg(lmp,"Reading snapshot from dump file ...\n"); bigint natoms_prev = atom->natoms; atoms(); @@ -153,7 +140,7 @@ void ReadDump::command(int narg, char **arg) domain->print_box(" "); - if (me == 0) + if (comm->me == 0) utils::logmesg(lmp," {} atoms before read\n" " {} atoms in snapshot\n" " {} atoms purged\n" @@ -202,14 +189,14 @@ void ReadDump::setup_reader(int narg, char **arg) nreader = 1; firstfile = -1; MPI_Comm_dup(world,&clustercomm); - } else if (multiproc_nfile >= nprocs) { - firstfile = static_cast ((bigint) me * multiproc_nfile/nprocs); - int lastfile = static_cast ((bigint) (me+1) * multiproc_nfile/nprocs); + } else if (multiproc_nfile >= comm->nprocs) { + firstfile = static_cast ((bigint) comm->me * multiproc_nfile/comm->nprocs); + int lastfile = static_cast ((bigint) (comm->me+1) * multiproc_nfile/comm->nprocs); nreader = lastfile - firstfile; - MPI_Comm_split(world,me,0,&clustercomm); - } else if (multiproc_nfile < nprocs) { + MPI_Comm_split(world,comm->me,0,&clustercomm); + } else if (multiproc_nfile < comm->nprocs) { nreader = 1; - int icluster = static_cast ((bigint) me * multiproc_nfile/nprocs); + int icluster = static_cast ((bigint) comm->me * multiproc_nfile/comm->nprocs); firstfile = icluster; MPI_Comm_split(world,icluster,0,&clustercomm); } @@ -272,7 +259,7 @@ bigint ReadDump::seek(bigint nrequest, int exact) // proc 0 finds the timestep in its first reader - if (me == 0 || parallel) { + if (comm->me == 0 || parallel) { // exit file loop when dump timestep >= nrequest // or files exhausted @@ -323,7 +310,7 @@ bigint ReadDump::seek(bigint nrequest, int exact) if (multiproc && filereader) { for (int i = 0; i < nreader; i++) { - if (me == 0 && i == 0) continue; // proc 0, reader 0 already found it + if (comm->me == 0 && i == 0) continue; // proc 0, reader 0 already found it std::string multiname = files[currentfile]; multiname.replace(multiname.find('%'),1,fmt::format("{}",firstfile+i)); readers[i]->open_file(multiname); @@ -361,7 +348,7 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip) // proc 0 finds the timestep in its first reader - if (me == 0 || parallel) { + if (comm->me == 0 || parallel) { // exit file loop when dump timestep matches all criteria // or files exhausted @@ -425,7 +412,7 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip) if (multiproc && filereader) { for (int i = 0; i < nreader; i++) { - if (me == 0 && i == 0) continue; + if (comm->me == 0 && i == 0) continue; std::string multiname = files[currentfile]; multiname.replace(multiname.find('%'),1,fmt::format("{}",firstfile+i)); readers[i]->open_file(multiname); @@ -459,10 +446,9 @@ void ReadDump::header(int fieldinfo) if (filereader) { for (int i = 0; i < nreader; i++) - nsnapatoms[i] = readers[i]->read_header(box,boxinfo,triclinic_snap,fieldinfo, - nfield,fieldtype,fieldlabel, - scaleflag,wrapflag,fieldflag, - xflag,yflag,zflag); + nsnapatoms[i] + = readers[i]->read_header(box, boxinfo, triclinic_snap, fieldinfo, nfield, fieldtype, + fieldlabel, scaleflag, wrapflag, fieldflag, xflag, yflag, zflag); } if (!parallel) { @@ -518,8 +504,8 @@ void ReadDump::header(int fieldinfo) if (boxflag) { if (!boxinfo) error->all(FLERR,"No box information in dump, must use 'box no'"); - else if ((triclinic_snap && !triclinic) || - (!triclinic_snap && triclinic)) + else if ((triclinic_snap && !domain->triclinic) || + (!triclinic_snap && domain->triclinic)) error->one(FLERR,"Read_dump triclinic status does not match simulation"); } @@ -563,7 +549,7 @@ void ReadDump::header(int fieldinfo) // set yindex,zindex = column index of Y and Z fields in fields array // needed for unscaling to absolute coords in xfield(), yfield(), zfield() - if (scaled && triclinic == 1) { + if (scaled && domain->triclinic == 1) { int flag = 0; if (xflag == Reader::UNSET) flag = 1; if (yflag == Reader::UNSET) flag = 1; @@ -606,12 +592,12 @@ void ReadDump::atoms() // migrate old owned atoms to new procs based on atom IDs // not necessary if purged all old atoms or if only 1 proc - if (!purgeflag && nprocs > 1) migrate_old_atoms(); + if (!purgeflag && comm->nprocs > 1) migrate_old_atoms(); // migrate new snapshot atoms to same new procs based on atom IDs // not necessary if purged all old atoms or if only 1 proc - if (!purgeflag && nprocs > 1) migrate_new_atoms(); + if (!purgeflag && comm->nprocs > 1) migrate_new_atoms(); // must build map if not a molecular system // this will be needed to match new atoms to old atoms @@ -653,13 +639,13 @@ void ReadDump::atoms() domain->boxhi[0] = xhi; domain->boxlo[1] = ylo; domain->boxhi[1] = yhi; - if (dimension == 3) { + if (domain->dimension == 3) { domain->boxlo[2] = zlo; domain->boxhi[2] = zhi; } - if (triclinic) { + if (domain->triclinic) { domain->xy = xy; - if (dimension == 3) { + if (domain->dimension == 3) { domain->xz = xz; domain->yz = yz; } @@ -693,7 +679,7 @@ void ReadDump::read_atoms() // each reading proc reads one file and splits data across cluster // cluster can be all procs or a subset - if (!parallel && (!multiproc || multiproc_nfile < nprocs)) { + if (!parallel && (!multiproc || multiproc_nfile < comm->nprocs)) { nsnap = nsnapatoms[0]; if (filereader) { @@ -765,7 +751,7 @@ void ReadDump::read_atoms() // every proc is a filereader, reads one or more files // each proc keeps all data it reads, no communication required - } else if (multiproc_nfile >= nprocs || parallel) { + } else if (multiproc_nfile >= comm->nprocs || parallel) { bigint sum = 0; for (int i = 0; i < nreader; i++) sum += nsnapatoms[i]; @@ -1072,7 +1058,7 @@ void ReadDump::migrate_old_atoms() int *procassign; memory->create(procassign,nlocal,"read_dump:procassign"); for (int i = 0; i < nlocal; i++) - procassign[i] = tag[i] % nprocs; + procassign[i] = tag[i] % comm->nprocs; auto irregular = new Irregular(lmp); irregular->migrate_atoms(1,1,procassign); @@ -1094,7 +1080,7 @@ void ReadDump::migrate_new_atoms() memory->create(procassign,nnew,"read_dump:procassign"); for (int i = 0; i < nnew; i++) { mtag = static_cast (fields[i][0]); - procassign[i] = mtag % nprocs; + procassign[i] = mtag % comm->nprocs; } auto irregular = new Irregular(lmp); @@ -1132,12 +1118,12 @@ void ReadDump::migrate_atoms_by_coords() int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); - if (triclinic) domain->x2lamda(atom->nlocal); + if (domain->triclinic) domain->x2lamda(atom->nlocal); domain->reset_box(); auto irregular = new Irregular(lmp); irregular->migrate_atoms(1); delete irregular; - if (triclinic) domain->lamda2x(atom->nlocal); + if (domain->triclinic) domain->lamda2x(atom->nlocal); } /* ---------------------------------------------------------------------- @@ -1164,7 +1150,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) nfield = 0; fieldtype[nfield++] = Reader::ID; if (iarg < narg) { - if (comm->me == 0) utils::logmesg(lmp, "Adding 'type' field to requested per-atom fields"); + if (comm->me == 0) utils::logmesg(lmp, "Adding 'type' field to requested per-atom fields\n"); fieldtype[nfield++] = Reader::TYPE; } @@ -1185,7 +1171,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) if (fieldtype[nfield-1] == Reader::ID || fieldtype[nfield-1] == Reader::TYPE) error->all(FLERR,"Illegal read_dump command"); - if (dimension == 2) { + if (domain->dimension == 2) { for (int i = 0; i < nfield; i++) if (fieldtype[i] == Reader::Z || fieldtype[i] == Reader::VZ || fieldtype[i] == Reader::IZ || fieldtype[i] == Reader::FZ) @@ -1263,7 +1249,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"format") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); - delete [] readerstyle; + delete[] readerstyle; readerstyle = utils::strdup(arg[iarg+1]); iarg += 2; break; @@ -1319,8 +1305,8 @@ int ReadDump::whichtype(char *str) double ReadDump::xfield(int i, int j) { if (!scaled) return fields[i][j]; - else if (!triclinic) return fields[i][j]*xprd + xlo; - else if (dimension == 2) + else if (!domain->triclinic) return fields[i][j]*xprd + xlo; + else if (domain->dimension == 2) return xprd*fields[i][j] + xy*fields[i][yindex] + xlo; return xprd*fields[i][j] + xy*fields[i][yindex] + xz*fields[i][zindex] + xlo; } @@ -1328,8 +1314,8 @@ double ReadDump::xfield(int i, int j) double ReadDump::yfield(int i, int j) { if (!scaled) return fields[i][j]; - else if (!triclinic) return fields[i][j]*yprd + ylo; - else if (dimension == 2) return yprd*fields[i][j] + ylo; + else if (!domain->triclinic) return fields[i][j]*yprd + ylo; + else if (domain->dimension == 2) return yprd*fields[i][j] + ylo; return yprd*fields[i][j] + yz*fields[i][zindex] + ylo; } diff --git a/src/read_dump.h b/src/read_dump.h index f9a9f0ba57..4676a1819d 100644 --- a/src/read_dump.h +++ b/src/read_dump.h @@ -41,8 +41,6 @@ class ReadDump : public Command { int fields_and_keywords(int, char **); private: - int me, nprocs; - char **files; // list of input dump files to process int nfile; // # of dump files to process (each may be parallel) int currentfile; // current open file (0 to nfile-1) @@ -60,9 +58,6 @@ class ReadDump : public Command { int filereader; // 1 if this proc reads from a dump file(s) int parallel; // 1 if parallel reading (e.g. via ADIOS2) - int dimension; // same as in Domain - int triclinic; - int boxflag; // overwrite simulation box with dump file box params int timestepflag; // overwrite simulation timestep with dump file timestep int replaceflag, addflag; // flags for processing dump snapshot atoms diff --git a/src/reader_xyz.cpp b/src/reader_xyz.cpp index 89257e9d36..c3e7d0ed99 100644 --- a/src/reader_xyz.cpp +++ b/src/reader_xyz.cpp @@ -38,7 +38,7 @@ ReaderXYZ::ReaderXYZ(LAMMPS *lmp) : Reader(lmp) ReaderXYZ::~ReaderXYZ() { - delete [] line; + delete[] line; memory->destroy(fieldindex); } From 731400e0044acb03fe124c70c49f309b562ce1a9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Oct 2023 18:29:07 -0400 Subject: [PATCH 262/417] improve error messages for read_dump --- src/read_dump.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 893895f6f1..4a64a8be1d 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -82,7 +82,7 @@ void ReadDump::command(int narg, char **arg) if (domain->box_exist == 0) error->all(FLERR,"Read_dump command before simulation box is defined"); - if (narg < 2) error->all(FLERR,"Illegal read_dump command"); + if (narg < 2) utils::missing_cmd_args(FLERR, "read_dump", error); store_files(1,&arg[0]); bigint nstep = utils::bnumeric(FLERR,arg[1],false,lmp); @@ -512,7 +512,7 @@ void ReadDump::header(int fieldinfo) // error check on requested fields existing in dump file if (fieldflag < 0) - error->one(FLERR,"Read_dump field not found in dump file"); + error->one(FLERR,"One of the requested read_dump per-atom fields not found in dump file"); // all explicitly requested x,y,z must have consistent scaling & wrapping @@ -1161,7 +1161,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) int type = whichtype(arg[iarg]); if (type < 0) break; if (type == Reader::Q && !atom->q_flag) - error->all(FLERR,"Read dump of atom property that isn't allocated"); + error->all(FLERR,"Read dump of charge property that isn't supported by atom style"); fieldtype[nfield++] = type; iarg++; } @@ -1169,13 +1169,13 @@ int ReadDump::fields_and_keywords(int narg, char **arg) // check for no fields if (fieldtype[nfield-1] == Reader::ID || fieldtype[nfield-1] == Reader::TYPE) - error->all(FLERR,"Illegal read_dump command"); + error->all(FLERR,"Read_dump must use at least either 'id' or 'type' field"); if (domain->dimension == 2) { for (int i = 0; i < nfield; i++) if (fieldtype[i] == Reader::Z || fieldtype[i] == Reader::VZ || fieldtype[i] == Reader::IZ || fieldtype[i] == Reader::FZ) - error->all(FLERR,"Illegal read_dump command"); + error->all(FLERR,"Read_dump must not read z-dimension data with 2d system"); } for (int i = 0; i < nfield; i++) @@ -1198,40 +1198,40 @@ int ReadDump::fields_and_keywords(int narg, char **arg) while (iarg < narg) { if (strcmp(arg[iarg],"nfile") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump nfile", error); multiproc_nfile = utils::inumeric(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"box") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump box", error); boxflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"timestep") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump timestep", error); timestepflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"replace") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump replace", error); replaceflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"purge") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump purge", error); purgeflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"trim") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump trim", error); trimflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"add") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump add", error); if (strcmp(arg[iarg+1],"yes") == 0) addflag = YESADD; else if (strcmp(arg[iarg+1],"no") == 0) addflag = NOADD; else if (strcmp(arg[iarg+1],"true") == 0) addflag = YESADD; else if (strcmp(arg[iarg+1],"false") == 0) addflag = NOADD; else if (strcmp(arg[iarg+1],"keep") == 0) addflag = KEEPADD; - else error->all(FLERR,"Illegal read_dump command"); + else error->all(FLERR,"Unknown read_dump add keyword {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"label") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "read_dump label", error); int type = whichtype(arg[iarg+1]); int i; for (i = 0; i < nfield; i++) @@ -1240,20 +1240,20 @@ int ReadDump::fields_and_keywords(int narg, char **arg) fieldlabel[i] = utils::strdup(arg[iarg+2]); iarg += 3; } else if (strcmp(arg[iarg],"scaled") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump scaled", error); scaleflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"wrapped") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump wrapped", error); wrapflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"format") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal read_dump command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "read_dump format", error); delete[] readerstyle; readerstyle = utils::strdup(arg[iarg+1]); iarg += 2; break; - } else error->all(FLERR,"Illegal read_dump command"); + } else error->all(FLERR,"Unknown read_dump keyword: {}",arg[iarg]); } if (multiproc == 0 && multiproc_nfile) From e518637d63b8ba185176004d80fe546ddc02a940 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Oct 2023 20:00:33 -0400 Subject: [PATCH 263/417] avoid invalid escape warnings for regexp expressions with python 3.12 --- doc/utils/sphinx-config/LAMMPSLexer.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/utils/sphinx-config/LAMMPSLexer.py b/doc/utils/sphinx-config/LAMMPSLexer.py index a7ba5d92a8..ee548dc602 100644 --- a/doc/utils/sphinx-config/LAMMPSLexer.py +++ b/doc/utils/sphinx-config/LAMMPSLexer.py @@ -76,12 +76,12 @@ class LAMMPSLexer(RegexLexer): include('conditionals'), include('keywords'), (r'#.*?\n', Comment), - ('"', String, 'string'), - ('\'', String, 'single_quote_string'), + (r'"', String, 'string'), + (r'\'', String, 'single_quote_string'), (r'[0-9]+:[0-9]+(:[0-9]+)?', Number), (r'[0-9]+(\.[0-9]+)?([eE]\-?[0-9]+)?', Number), - ('\$?\(', Name.Variable, 'expression'), - ('\$\{', Name.Variable, 'variable'), + (r'\$?\(', Name.Variable, 'expression'), + (r'\$\{', Name.Variable, 'variable'), (r'[\w_\.\[\]]+', Name), (r'\$[\w_]+', Name.Variable), (r'\s+', Whitespace), @@ -97,21 +97,21 @@ class LAMMPSLexer(RegexLexer): ] , 'variable' : [ - ('[^\}]+', Name.Variable), - ('\}', Name.Variable, '#pop'), + (r'[^\}]+', Name.Variable), + (r'\}', Name.Variable, '#pop'), ], 'string' : [ - ('[^"]+', String), - ('"', String, '#pop'), + (r'[^"]+', String), + (r'"', String, '#pop'), ], 'single_quote_string' : [ - ('[^\']+', String), - ('\'', String, '#pop'), + (r'[^\']+', String), + (r'\'', String, '#pop'), ], 'expression' : [ - ('[^\(\)]+', Name.Variable), - ('\(', Name.Variable, 'expression'), - ('\)', Name.Variable, '#pop'), + (r'[^\(\)]+', Name.Variable), + (r'\(', Name.Variable, 'expression'), + (r'\)', Name.Variable, '#pop'), ], 'modify_cmd' : [ (r'[\w_\-\.\[\]]+', Name.Variable.Identifier), From 22cc6bf0b3f2f864e20352e5fd3e73dae3ef256d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Oct 2023 20:01:23 -0400 Subject: [PATCH 264/417] provide example python code for reading a YAML dump file --- doc/src/Howto_structured_data.rst | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/doc/src/Howto_structured_data.rst b/doc/src/Howto_structured_data.rst index 3fe630a120..29c65a7a34 100644 --- a/doc/src/Howto_structured_data.rst +++ b/doc/src/Howto_structured_data.rst @@ -119,6 +119,45 @@ for example :doc:`dump yaml ` or :doc:`fix ave/time ` Depending on the kind of data being written, organization of the data or the specific syntax used may change, but the principles are very similar and all files should be readable with a suitable YAML parser. +A simple example for this is given below: + +.. code-block:: python + + import yaml + try: + from yaml import CSafeLoader as YamlLoader + except ImportError: + from yaml import SafeLoader as YamlLoader + + timesteps = [] + with open("dump.yaml", "r") as f: + data = yaml.load_all(f, Loader=YamlLoader) + + for d in data: + print('Processing timestep %d' % d['timestep']) + timesteps.append(d) + + print('Read %d timesteps from yaml dump' % len(timesteps)) + print('Second timestep: ', timesteps[1]['timestep']) + print('Box info: x: ' , timesteps[1]['box'][0], ' y:', timesteps[1]['box'][1], ' z:',timesteps[1]['box'][2]) + print('First 5 per-atom columns: ', timesteps[1]['keywords'][0:5]) + print('Corresponding 10th atom data: ', timesteps[1]['data'][9][0:5]) + +The corresponding output for a YAML dump command added to the "melt" example is: + +.. parsed-literal:: + + Processing timestep 0 + Processing timestep 50 + Processing timestep 100 + Processing timestep 150 + Processing timestep 200 + Processing timestep 250 + Read 6 timesteps from yaml dump + Second timestep: 50 + Box info: x: [0, 16.795961913825074] y: [0, 16.795961913825074] z: [0, 16.795961913825074] + First 5 per-atom columns: ['id', 'type', 'x', 'y', 'z'] + Corresponding 10th atom data: [10, 1, 4.43828, 0.968481, 0.108555] Processing scalar data with Python ---------------------------------- From 1e2416dfcca179db923e6eb081ed880d898198e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 23 Oct 2023 14:57:27 -0400 Subject: [PATCH 265/417] make sure liblinalg is built before linking phana --- tools/phonon/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/phonon/CMakeLists.txt b/tools/phonon/CMakeLists.txt index 4cf70d57f3..37b7456252 100644 --- a/tools/phonon/CMakeLists.txt +++ b/tools/phonon/CMakeLists.txt @@ -121,5 +121,9 @@ if(USE_SPGLIB) target_link_libraries(phana PRIVATE SPGLIB::SYMSPG) endif() +# add dependency when using local linear algebra lib +if(NOT LAPACK_FOUND OR NOT BLAS_FOUND OR USE_INTERNAL_LINALG) + add_dependencies(phana linalg) +endif() target_link_libraries(phana PRIVATE tricubic ${LAPACK_LIBRARIES}) install(TARGETS phana EXPORT LAMMPS_Targets DESTINATION ${CMAKE_INSTALL_BINDIR}) From ceed4c7db8b6e20ba1dee0d75cd9278c4a72ea55 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 07:51:54 -0400 Subject: [PATCH 266/417] for consistency with CMake 3.12+ we should set Python_EXECUTABLE instead of PYTHON_EXECUTABLE --- cmake/CMakeLists.txt | 24 ++++++++++++------------ cmake/Modules/Packages/PYTHON.cmake | 2 +- doc/src/Build_extras.rst | 4 ++-- doc/src/Howto_pylammps.rst | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index b075fc8f8d..95d738d279 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -159,17 +159,20 @@ endif() ######################################################################## # User input options # ######################################################################## -# set path to python interpreter and thus enforcing python version when -# in a virtual environment and PYTHON_EXECUTABLE is not set on command line -if(DEFINED ENV{VIRTUAL_ENV} AND NOT PYTHON_EXECUTABLE) - if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - set(PYTHON_EXECUTABLE "$ENV{VIRTUAL_ENV}/Scripts/python.exe") - else() - set(PYTHON_EXECUTABLE "$ENV{VIRTUAL_ENV}/bin/python") - endif() +# backward compatibility with CMake before 3.12 and older LAMMPS documentation +if (PYTHON_EXECUTABLE) set(Python_EXECUTABLE "${PYTHON_EXECUTABLE}") +endif() +# set path to python interpreter and thus enforcing python version when +# in a virtual environment and Python_EXECUTABLE is not set on command line +if(DEFINED ENV{VIRTUAL_ENV} AND NOT Python_EXECUTABLE) + if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(Python_EXECUTABLE "$ENV{VIRTUAL_ENV}/Scripts/python.exe") + else() + set(Python_EXECUTABLE "$ENV{VIRTUAL_ENV}/bin/python") + endif() message(STATUS "Running in virtual environment: $ENV{VIRTUAL_ENV}\n" - " Setting Python interpreter to: ${PYTHON_EXECUTABLE}") + " Setting Python interpreter to: ${Python_EXECUTABLE}") endif() set(LAMMPS_MACHINE "" CACHE STRING "Suffix to append to lmp binary (WON'T enable any features automatically") @@ -794,9 +797,6 @@ install( ############################################################################### if(BUILD_SHARED_LIBS) # backward compatibility - if(PYTHON_EXECUTABLE) - set(Python_EXECUTABLE ${PYTHON_EXECUTABLE}) - endif() find_package(Python COMPONENTS Interpreter) if(BUILD_IS_MULTI_CONFIG) set(MY_BUILD_DIR ${CMAKE_BINARY_DIR}/$) diff --git a/cmake/Modules/Packages/PYTHON.cmake b/cmake/Modules/Packages/PYTHON.cmake index 59260e39d5..e05edadbf3 100644 --- a/cmake/Modules/Packages/PYTHON.cmake +++ b/cmake/Modules/Packages/PYTHON.cmake @@ -1,6 +1,6 @@ if(NOT Python_INTERPRETER) - # backward compatibility + # backward compatibility with CMake before 3.12 and older LAMMPS documentation if(PYTHON_EXECUTABLE) set(Python_EXECUTABLE ${PYTHON_EXECUTABLE}) endif() diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 393d7e1c20..7a7b5cf0d5 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -1056,12 +1056,12 @@ additional details. .. code-block:: bash - -D PYTHON_EXECUTABLE=path # path to Python executable to use + -D Python_EXECUTABLE=path # path to Python executable to use Without this setting, CMake will guess the default Python version on your system. To use a different Python version, you can either create a virtualenv, activate it and then run cmake. Or you can - set the PYTHON_EXECUTABLE variable to specify which Python + set the Python_EXECUTABLE variable to specify which Python interpreter should be used. Note note that you will also need to have the development headers installed for this version, e.g. python2-devel. diff --git a/doc/src/Howto_pylammps.rst b/doc/src/Howto_pylammps.rst index 2db61cd5bb..bce37d5ac7 100644 --- a/doc/src/Howto_pylammps.rst +++ b/doc/src/Howto_pylammps.rst @@ -133,7 +133,7 @@ to the location in the virtual environment with: .. code-block:: bash - cmake . -DPYTHON_EXECUTABLE=$(which python) + cmake . -DPython_EXECUTABLE=$(which python) # install LAMMPS package in virtualenv (testing) make install-python From 88644306cd93b3b541837c66bcc7d8e866261334 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 10:39:19 -0400 Subject: [PATCH 267/417] add sanity check on path to LAMMPS python package folder --- python/install.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/python/install.py b/python/install.py index 853479e9f6..c3944bab3a 100644 --- a/python/install.py +++ b/python/install.py @@ -39,6 +39,12 @@ if args.package: sys.exit(1) else: args.package = os.path.abspath(args.package) + if ((os.path.basename(args.package) != "lammps") + and ((os.path.basename(os.path.dirname(args.package)) != "python"))): + print("\nERROR: LAMMPS package folder path %s does not end in %s\n" + % (args.package, os.path.join("python", "lammps"))) + parser.print_help() + sys.exit(1) if args.lib: if not os.path.exists(args.lib): From 5f2f120b4bc6de909d2d5b91e34ab85ed9a158e0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 10:39:49 -0400 Subject: [PATCH 268/417] improve help and error messages --- python/install.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/install.py b/python/install.py index c3944bab3a..fd9f95f1bf 100644 --- a/python/install.py +++ b/python/install.py @@ -18,7 +18,7 @@ parser = ArgumentParser(prog='install.py', description='LAMMPS python package installer script') parser.add_argument("-p", "--package", required=True, - help="path to the LAMMPS Python package") + help="path to the LAMMPS Python package folder") parser.add_argument("-l", "--lib", required=True, help="path to the compiled LAMMPS shared library") parser.add_argument("-n", "--noinstall", action="store_true", default=False, @@ -34,7 +34,7 @@ args = parser.parse_args() if args.package: if not os.path.exists(args.package): - print("ERROR: LAMMPS package folder %s does not exist" % args.package) + print("\nERROR: LAMMPS package folder %s does not exist\n" % args.package) parser.print_help() sys.exit(1) else: @@ -48,7 +48,7 @@ if args.package: if args.lib: if not os.path.exists(args.lib): - print("ERROR: LAMMPS shared library %s does not exist" % args.lib) + print("\nERROR: LAMMPS shared library %s does not exist\n" % args.lib) parser.print_help() sys.exit(1) else: @@ -56,7 +56,7 @@ if args.lib: if args.wheeldir: if not os.path.exists(args.wheeldir): - print("ERROR: directory %s to store the wheel does not exist" % args.wheeldir) + print("\nERROR: directory %s to store the wheel does not exist\n" % args.wheeldir) parser.print_help() sys.exit(1) else: @@ -64,7 +64,7 @@ if args.wheeldir: if args.versionfile: if not os.path.exists(args.versionfile): - print("ERROR: LAMMPS version file at %s does not exist" % args.versionfile) + print("\nERROR: LAMMPS version file at %s does not exist\n" % args.versionfile) parser.print_help() sys.exit(1) else: From bd0c1795b47b741148d331c489a18daf28130396 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 24 Oct 2023 10:33:55 -0600 Subject: [PATCH 269/417] Fix harmless compiler warnings --- src/KOKKOS/kokkos.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 84a8f59dd0..be8823d8e2 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -137,13 +137,13 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) int set_flag = 0; char *str; - if (str = getenv("SLURM_LOCALID")) { + if ((str = getenv("SLURM_LOCALID"))) { int local_rank = atoi(str); device = local_rank % ngpus; if (device >= skip_gpu) device++; set_flag = 1; } - if (str = getenv("FLUX_TASK_LOCAL_ID")) { + if ((str = getenv("FLUX_TASK_LOCAL_ID"))) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -151,7 +151,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if (str = getenv("MPT_LRANK")) { + if ((str = getenv("MPT_LRANK"))) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -159,7 +159,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if (str = getenv("MV2_COMM_WORLD_LOCAL_RANK")) { + if ((str = getenv("MV2_COMM_WORLD_LOCAL_RANK"))) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -167,7 +167,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if (str = getenv("OMPI_COMM_WORLD_LOCAL_RANK")) { + if ((str = getenv("OMPI_COMM_WORLD_LOCAL_RANK"))) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; @@ -175,7 +175,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) set_flag = 1; } } - if (str = getenv("PMI_LOCAL_RANK")) { + if ((str = getenv("PMI_LOCAL_RANK"))) { if (ngpus > 0) { int local_rank = atoi(str); device = local_rank % ngpus; From c6c174469ca9c9a8f29ac1ed639b1536a742de7b Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 24 Oct 2023 12:32:02 -0600 Subject: [PATCH 270/417] Replace deprecated Kokkos code --- src/KOKKOS/transpose_helper_kokkos.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/transpose_helper_kokkos.h b/src/KOKKOS/transpose_helper_kokkos.h index b09639c451..e3a4d86f9a 100644 --- a/src/KOKKOS/transpose_helper_kokkos.h +++ b/src/KOKKOS/transpose_helper_kokkos.h @@ -33,8 +33,8 @@ struct TransposeHelperKokkos { using t_view_src = t_view_src_; static_assert(std::is_same_v, "Value types do not match"); - static_assert(t_view_dst::Rank == 2, "Destination view rank != 2"); - static_assert(t_view_src::Rank == 2, "Source view rank != 2"); + static_assert(t_view_dst::rank == 2, "Destination view rank != 2"); + static_assert(t_view_src::rank == 2, "Source view rank != 2"); using dst_layout = typename t_view_dst::traits::array_layout; using src_layout = typename t_view_src::traits::array_layout; From 63e674cc3efcdbee590f7d8140626c7b4b056f08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 18:37:29 -0400 Subject: [PATCH 271/417] simplify and remove redundant or dead code --- src/SPIN/fix_nve_spin.cpp | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 297e81b424..bfc1543eed 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -58,8 +58,6 @@ static const char cite_fix_nve_spin[] = "doi={10.1016/j.jcp.2018.06.042}\n" "}\n\n"; -enum{NONE}; - /* ---------------------------------------------------------------------- */ FixNVESpin::FixNVESpin(LAMMPS *lmp, int narg, char **arg) : @@ -74,7 +72,6 @@ FixNVESpin::FixNVESpin(LAMMPS *lmp, int narg, char **arg) : if (narg < 4) error->all(FLERR,"Illegal fix/nve/spin command"); time_integrate = 1; - sector_flag = NONE; lattice_flag = 1; nlocal_max = 0; npairs = 0; @@ -88,14 +85,9 @@ FixNVESpin::FixNVESpin(LAMMPS *lmp, int narg, char **arg) : if (atom->map_style == Atom::MAP_NONE) error->all(FLERR,"Fix nve/spin requires an atom map, see atom_modify"); - // defining sector_flag + // define sector_flag - int nprocs_tmp = comm->nprocs; - if (nprocs_tmp == 1) { - sector_flag = 0; - } else if (nprocs_tmp >= 1) { - sector_flag = 1; - } else error->all(FLERR,"Illegal fix/nve/spin command"); + sector_flag = (comm->nprocs > 1) ? 1 : 0; // defining lattice_flag @@ -121,11 +113,6 @@ FixNVESpin::FixNVESpin(LAMMPS *lmp, int narg, char **arg) : if (!atom->sp_flag) error->all(FLERR,"Fix nve/spin requires atom/spin style"); - // check if sector_flag is correctly defined - - if (sector_flag == 0 && nprocs_tmp > 1) - error->all(FLERR,"Illegal fix/nve/spin command"); - // initialize the magnetic interaction flags pair_spin_flag = 0; @@ -378,8 +365,8 @@ void FixNVESpin::initial_integrate(int /*vflag*/) } } } - } else if (sector_flag == 0) { // serial seq. update - comm->forward_comm(); // comm. positions of ghost atoms + } else { // serial seq. update + comm->forward_comm(); // comm. positions of ghost atoms for (int i = 0; i < nlocal; i++) { // advance quarter s for nlocal if (mask[i] & groupbit) { ComputeInteractionsSpin(i); @@ -392,7 +379,7 @@ void FixNVESpin::initial_integrate(int /*vflag*/) AdvanceSingleSpin(i); } } - } else error->all(FLERR,"Illegal fix nve/spin command"); + } // update x for all particles @@ -610,7 +597,7 @@ void FixNVESpin::sectoring() nsectors = sec[0]*sec[1]*sec[2]; - if (sector_flag == 1 && nsectors != 8) + if (sector_flag && (nsectors != 8)) error->all(FLERR,"Illegal sectoring operation"); rsec[0] = rsx; @@ -694,7 +681,7 @@ void FixNVESpin::AdvanceSingleSpin(int i) // comm. sp[i] to atoms with same tag (for serial algo) - if (sector_flag == 0) { + if (!sector_flag) { if (sametag[i] >= 0) { j = sametag[i]; while (j >= 0) { From 8abe52c613decc5ae1acf2fd2d32247cde8ad64f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 18:59:39 -0400 Subject: [PATCH 272/417] simplify/modernize access to computes and fixes and check dynamics casts --- src/BOCS/fix_bocs.cpp | 49 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index 17bb1af002..d35facdc5a 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -487,33 +487,31 @@ void FixBocs::init() // ensure no conflict with fix deform - if (pstat_flag) - { - for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { - int *dimflag = (dynamic_cast(modify->fix[i]))->dimflag; + if (pstat_flag) { + for (auto &ifix : modify->get_fix_by_style("^deform")) { + auto deform = dynamic_cast(ifix); + if (deform) { + int *dimflag = deform->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) - error->all(FLERR,"Cannot use fix bocs and fix deform on " - "same component of stress tensor"); + error->all(FLERR,"Cannot use fix bocs and fix deform on same component of stress tensor"); } + } } // set temperature and pressure ptrs - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature ID for fix bocs does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR,"Temperature compute ID {} for fix bocs does not exist", id_temp); if (temperature->tempbias) which = BIAS; else which = NOBIAS; if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix bocs does not exist"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) + error->all(FLERR,"Pressure compute ID {} for fix bocs does not exist", id_press); } @@ -521,23 +519,21 @@ void FixBocs::init() { if (p_match_flag) // MRD NJD { - if (pressure) + auto pressure_bocs = dynamic_cast(pressure); + if (pressure_bocs) { if (p_basis_type == BASIS_ANALYTIC) { - (dynamic_cast(pressure))->send_cg_info(p_basis_type, - N_p_match, p_match_coeffs, N_mol, vavg); + pressure_bocs->send_cg_info(p_basis_type, N_p_match, p_match_coeffs, N_mol, vavg); } else if (p_basis_type == BASIS_LINEAR_SPLINE || p_basis_type == BASIS_CUBIC_SPLINE) { - (dynamic_cast(pressure))->send_cg_info(p_basis_type, - splines, spline_length); + pressure_bocs->send_cg_info(p_basis_type, splines, spline_length); } } else { - error->all(FLERR,"Unable to find pressure. Are you sure you included" - " the compute bocsPress and fix_modify commands?"); + error->all(FLERR,"Unable to find compatible pressure compute"); } } } @@ -591,9 +587,12 @@ void FixBocs::init() else kspace_flag = 0; if (utils::strmatch(update->integrate_style,"^respa")) { - nlevels_respa = (dynamic_cast(update->integrate))->nlevels; - step_respa = (dynamic_cast(update->integrate))->step; - dto = 0.5*step_respa[0]; + auto respa = dynamic_cast(update->integrate); + if (respa) { + nlevels_respa = respa->nlevels; + step_respa = respa->step; + dto = 0.5*step_respa[0]; + } } // detect if any rigid fixes exist so rigid bodies move when box is remapped From 975cc9a0522f6d622b004af215721e584793c95e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 19:05:48 -0400 Subject: [PATCH 273/417] simplify, avoid division by zero --- src/BODY/pair_body_rounded_polyhedron.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 9425707ef1..e261ff14d3 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -1699,9 +1699,10 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, num_unique_contacts++; } - xc[0] /= (double)num_unique_contacts; - xc[1] /= (double)num_unique_contacts; - xc[2] /= (double)num_unique_contacts; + const double dble_unique_contacts = (num_unique_contacts > 0) ? (double) num_unique_contacts : 1.0; + xc[0] /= dble_unique_contacts; + xc[1] /= dble_unique_contacts; + xc[2] /= dble_unique_contacts; contact_area = 0.0; for (int m = 0; m < num_contacts; m++) { @@ -1711,7 +1712,7 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, dz = contact_list[m].xi[2] - xc[2]; contact_area += (dx*dx + dy*dy + dz*dz); } - contact_area *= (MY_PI/(double)num_unique_contacts); + contact_area *= (MY_PI/dble_unique_contacts); } double j_a = contact_area / (num_unique_contacts * A_ua); From c123c7058b988c29ca44ec02492d90ec2a3de853 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 19:08:00 -0400 Subject: [PATCH 274/417] remove dead code --- src/CG-DNA/mf_oxdna.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CG-DNA/mf_oxdna.h b/src/CG-DNA/mf_oxdna.h index c583abf3ab..11995ee394 100644 --- a/src/CG-DNA/mf_oxdna.h +++ b/src/CG-DNA/mf_oxdna.h @@ -208,7 +208,6 @@ inline double MFOxdna::DF5(double x, double a, double x_ast, double b, double x_ } else { return 0.0; } - return 0; } /* ---------------------------------------------------------------------- From e5160b279a034db5b88e68e4f43922e0a46ac50f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 23:12:17 -0400 Subject: [PATCH 275/417] avoid static code analysis warnings --- src/ASPHERE/compute_erotate_asphere.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ASPHERE/compute_erotate_asphere.cpp b/src/ASPHERE/compute_erotate_asphere.cpp index 82249a1db5..95a323b4e3 100644 --- a/src/ASPHERE/compute_erotate_asphere.cpp +++ b/src/ASPHERE/compute_erotate_asphere.cpp @@ -47,8 +47,7 @@ void ComputeERotateAsphere::init() avec_line = dynamic_cast(atom->style_match("line")); avec_tri = dynamic_cast(atom->style_match("tri")); if (!avec_ellipsoid && !avec_line && !avec_tri) - error->all(FLERR,"Compute erotate/asphere requires " - "atom style ellipsoid or line or tri"); + error->all(FLERR,"Compute erotate/asphere requires atom style ellipsoid or line or tri"); // check that all particles are finite-size // no point particles allowed, spherical is OK @@ -79,12 +78,13 @@ double ComputeERotateAsphere::compute_scalar() { invoked_scalar = update->ntimestep; - AtomVecEllipsoid::Bonus *ebonus; + AtomVecEllipsoid::Bonus *ebonus = nullptr; if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus; - AtomVecLine::Bonus *lbonus; + AtomVecLine::Bonus *lbonus = nullptr; if (avec_line) lbonus = avec_line->bonus; - AtomVecTri::Bonus *tbonus; + AtomVecTri::Bonus *tbonus = nullptr; if (avec_tri) tbonus = avec_tri->bonus; + int *ellipsoid = atom->ellipsoid; int *line = atom->line; int *tri = atom->tri; @@ -98,14 +98,14 @@ double ComputeERotateAsphere::compute_scalar() // no point particles since divide by inertia double length; - double *shape,*quat; - double wbody[3],inertia[3]; + double *shape, *quat; + double wbody[3], inertia[3]; double rot[3][3]; double erotate = 0.0; for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - if (ellipsoid && ellipsoid[i] >= 0) { + if (ellipsoid && ebonus && (ellipsoid[i] >= 0)) { shape = ebonus[ellipsoid[i]].shape; quat = ebonus[ellipsoid[i]].quat; @@ -126,13 +126,13 @@ double ComputeERotateAsphere::compute_scalar() erotate += inertia[0]*wbody[0]*wbody[0] + inertia[1]*wbody[1]*wbody[1] + inertia[2]*wbody[2]*wbody[2]; - } else if (line && line[i] >= 0) { + } else if (line && lbonus && (line[i] >= 0)) { length = lbonus[line[i]].length; erotate += (omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + omega[i][2]*omega[i][2]) * length*length*rmass[i] / 12.0; - } else if (tri && tri[i] >= 0) { + } else if (tri && tbonus && (tri[i] >= 0)) { // principal moments of inertia From 020ef70300fd1ecc54a1e865ddcff807de6c96ad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Oct 2023 23:18:24 -0400 Subject: [PATCH 276/417] avoid double free on B array --- src/KSPACE/pppm_disp.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index 7ab76ad62a..72424a7330 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -1374,6 +1374,7 @@ void PPPMDisp::init_coeffs() if (nsplit == 1) { delete[] B; + B = nullptr; function[3] = 0; function[2] = 0; function[1] = 1; @@ -1387,11 +1388,13 @@ void PPPMDisp::init_coeffs() //function[3] = 1; //function[2] = 0; delete[] B; // remove this when un-comment previous 2 lines + B = nullptr; } if (function[2] && (nsplit > 6)) { if (me == 0) utils::logmesg(lmp," Using 7 structure factors\n"); delete[] B; + B = nullptr; } if (function[3]) { From 20b386fc1ab04520650346fbc3b65af93d45b7d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 25 Oct 2023 06:12:44 -0400 Subject: [PATCH 277/417] update CONTRIBUTING guidelines posted on GitHub --- .github/CONTRIBUTING.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c7abfebf3a..891d1ad5e5 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,9 +5,9 @@ Thank you for considering to contribute to the LAMMPS software project. The following is a set of guidelines as well as explanations of policies and work flows for contributing to the LAMMPS molecular dynamics software project. These guidelines focus on submitting issues or pull requests on the LAMMPS GitHub project. Thus please also have a look at: -* [The guide for submitting new features in the LAMMPS manual](https://www.lammps.org/doc/Modify_contribute.html) -* [The guide on programming style and requirement in the LAMMPS manual](https://www.lammps.org/doc/Modify_style.html) -* [The GitHub tutorial in the LAMMPS manual](http://lammps.sandia.gov/doc/Howto_github.html) +* [The guide for submitting new features in the LAMMPS manual](https://docs.lammps.org/Modify_contribute.html) +* [The guide on programming style and requirement in the LAMMPS manual](https://docs.lammps.org/Modify_requirements.html) +* [The GitHub tutorial in the LAMMPS manual](http://docs.lammps.org/Howto_github.html) ## Table of Contents @@ -27,17 +27,17 @@ __ ## I don't want to read this whole thing I just have a question! -> **Note:** Please do not file an issue to ask a general question about LAMMPS, its features, how to use specific commands, or how perform simulations or analysis in LAMMPS. Instead post your question to either the ['lammps-users' mailing list](https://lammps.sandia.gov/mail.html) or the [LAMMPS Material Science Discourse forum](https://matsci.org/lammps). You do not need to be subscribed to post to the list (but a mailing list subscription avoids having your post delayed until it is approved by a mailing list moderator). Most posts to the mailing list receive a response within less than 24 hours. Before posting to the mailing list, please read the [mailing list guidelines](https://lammps.sandia.gov/guidelines.html). Following those guidelines will help greatly to get a helpful response. Always mention which LAMMPS version you are using. The LAMMPS forum was recently created as part of a larger effort to build a materials science community and have discussions not just about using LAMMPS. Thus the forum may be also used for discussions that would be off-topic for the mailing list. Those will just have to be posted to a more general category. +> **Note:** Please do not file an issue to ask a general question about LAMMPS, its features, how to use specific commands, or how perform simulations or analysis in LAMMPS. Instead post your question to the [LAMMPS Material Science Discourse forum](https://matsci.org/lammps). Before posting to the forum, please read the general [guidelines](https://www.lammps.org/guidelines.html) and the forum specific [suggestions](https://matsci.org/t/please-read-this-first-guidelines-and-suggestions-for-posting-lammps-questions/49913). Following those guidelines and suggestions will help greatly to get a helpful response. *Always* mention which LAMMPS version you are using. The MatSci website may be also used for discussions that would be off-topic for the LAMMPS categories. Those will just have to be posted to a different category. ## How Can I Contribute? There are several ways how you can actively contribute to the LAMMPS project: you can discuss compiling and using LAMMPS, and solving LAMMPS related problems with other LAMMPS users on the lammps-users mailing list or the forum, you can report bugs or suggest enhancements by creating issues on GitHub (or posting them to the lammps-users mailing list or posting in the LAMMPS Materials Science Discourse forum), and you can contribute by submitting pull requests on GitHub or e-mail your code -to one of the [LAMMPS core developers](https://lammps.sandia.gov/authors.html). As you may see from the aforementioned developer page, the LAMMPS software package includes the efforts of a very large number of contributors beyond the principal authors and maintainers. +to one of the [LAMMPS core developers](https://www.lammps.org/authors.html). As you may see from the aforementioned developer page, the LAMMPS software package includes the efforts of a very large number of contributors beyond the principal authors and maintainers. ### Discussing How To Use LAMMPS The LAMMPS mailing list is hosted at SourceForge. The mailing list began in 2005, and now includes tens of thousands of messages in thousands of threads. LAMMPS developers try to respond to posted questions in a timely manner, but there are no guarantees. Please consider that people live in different timezone and may not have time to answer e-mails outside of their work hours. -You can post to list by sending your email to lammps-users at lists.sourceforge.net (no subscription required), but before posting, please read the [mailing list guidelines](https://lammps.sandia.gov/guidelines.html) to maximize your chances to receive a helpful response. +You can post to list by sending your email to lammps-users at lists.sourceforge.net (no subscription required), but before posting, please read the [mailing list guidelines](https://www.lammps.org/guidelines.html) to maximize your chances to receive a helpful response. Anyone can browse/search previous questions/answers in the archives. You do not have to subscribe to the list to post questions, receive answers (to your questions), or browse/search the archives. You **do** need to subscribe to the list if you want emails for **all** the posts (as individual messages or in digest form), or to answer questions yourself. Feel free to sign up and help us out! Answering questions from fellow LAMMPS users is a great way to pay back the community for providing you a useful tool for free, and to pass on the advice you have received yourself to others. It improves your karma and helps you understand your own research better. @@ -47,7 +47,7 @@ The LAMMPS Materials Science Discourse forum was created recently to facilitate ### Reporting Bugs -While developers writing code for LAMMPS are careful to test their code, LAMMPS is such a large and complex software, that it is impossible to test for all combinations of features under all normal and not so normal circumstances. Thus bugs do happen, and if you suspect, that you have encountered one, please try to document it and report it as an [Issue](https://github.com/lammps/lammps/issues) on the LAMMPS GitHub project web page. However, before reporting a bug, you need to check whether this is something that may have already been corrected. The [Latest Features and Bug Fixes in LAMMPS](https://lammps.sandia.gov/bug.html) web page lists all significant changes to LAMMPS over the years. It also tells you what the current latest development version of LAMMPS is, and you should test whether your issue still applies to that version. +While developers writing code for LAMMPS are careful to test their code, LAMMPS is such a large and complex software, that it is impossible to test for all combinations of features under all normal and not so normal circumstances. Thus bugs do happen, and if you suspect, that you have encountered one, please try to document it and report it as an [Issue](https://github.com/lammps/lammps/issues) on the LAMMPS GitHub project web page. However, before reporting a bug, you need to check whether this is something that may have already been corrected. The [Latest Features and Bug Fixes in LAMMPS](https://www.lammps.org/bug.html) web page lists all significant changes to LAMMPS over the years. It also tells you what the current latest development version of LAMMPS is, and you should test whether your issue still applies to that version. When you click on the green "New Issue" button, you will be provided with a text field, where you can enter your message. That text field with contain a template with several headlines and some descriptions. Keep the headlines that are relevant to your reported potential bug and replace the descriptions with the information as suggested by the descriptions. You can also attach small text files (please add the file name extension `.txt` or it will be rejected), images, or small compressed text files (using gzip, do not use RAR or 7-ZIP or similar tools that are uncommon outside of Windows machines). In many cases, bugs are best illustrated by providing a small input deck (do **not** attach your entire production input, but remove everything that is not required to reproduce the issue, and scale down your system size, that the resulting calculation runs fast and can be run on small desktop quickly). @@ -65,9 +65,9 @@ To be able to submit an issue on GitHub, you have to register for an account (fo We encourage users to submit new features or modifications for LAMMPS. Instructions, guidelines, requirements, and recommendations are in the following sections of the LAMMPS manual: -* [The guide for submitting new features in the LAMMPS manual](https://lammps.sandia.gov/doc/Modify_contribute.html) -* [The guide on programming style and requirement in the LAMMPS manual](https://lammps.sandia.gov/doc/Modify_contribute.html) -* [The GitHub tutorial in the LAMMPS manual](http://lammps.sandia.gov/doc/Howto_github.html) +* [The guide for submitting new features in the LAMMPS manual](https://docs.lammps.org/Modify_contribute.html) +* [The guide on programming style and requirement in the LAMMPS manual](https://docs.lammps.org/Modify_requirements.html) +* [The GitHub tutorial in the LAMMPS manual](http://docs.lammps.org/Howto_github.html) ## GitHub Workflows @@ -85,7 +85,7 @@ For bug reports, the next step is that one of the core LAMMPS developers will se ### Pull Requests Pull requests are the **only** way that changes get made to the LAMMPS distribution. So also the LAMMPS core developers will submit pull requests for their own changes and discuss them on GitHub. Thus if you submit a pull request it will be treated in a similar fashion. When you submit a pull request you may opt to submit a "Draft" pull request. That means your changes are visible and will be subject to testing, but reviewers will not be (auto-)assigned and comments will take into account that this is not complete. On the other hand, this is a perfect way to ask the LAMMPS developers for comments on non-obvious changes and get feedback and possible suggestions for improvements or recommendations about what to avoid. -Immediately after the submission, the LAMMPS continuing integration server at ci.lammps.org will download your submitted branch and perform a number of tests: it will tests whether it compiles cleanly under various conditions, it will also do a check on whether your included documentation translates cleanly and run some unit tests and other checks. Whether these tests are successful or fail will be recorded. If a test fails, please inspect the corresponding output on the CI server and take the necessary steps, if needed, so that the code can compile cleanly again. The test will be re-run each time the pull request is updated with a push to the remote branch on GitHub. If you are unsure about what you need to change, ask a question in the discussion area of the pull request. +Immediately after the submission, the LAMMPS continuing integration server at https://ci.lammps.org will download your submitted branch and perform a number of tests: it will tests whether it compiles cleanly under various conditions, it will also do a check on whether your included documentation translates cleanly and run some unit tests and other checks. Whether these tests are successful or fail will be recorded. If a test fails, please inspect the corresponding output on the CI server and take the necessary steps, if needed, so that the code can compile cleanly again. The test will be re-run each time the pull request is updated with a push to the remote branch on GitHub. If you are unsure about what you need to change, ask a question in the discussion area of the pull request. Next a LAMMPS core developer will self-assign and do an overall technical assessment of the submission. If you submitted a draft pull request, this will not happen unless you mark it "ready for review". If you are not yet invited as a LAMMPS collaborator, and your contribution seems significant, you may also receive an invitation for collaboration on the LAMMPS repository. As part of the assessment, the pull request will be categorized with labels. There are two special labels: `needs_work` (indicates that work from the submitter of the pull request is needed) and `work_in_progress` (indicates, that the assigned LAMMPS developer will make changes, if not done by the contributor who made the submit). You may also receive comments and suggestions on the overall submission or specific details and on occasion specific requests for changes as part of the review. If permitted, also additional changes may be pushed into your pull request branch or a pull request may be filed in your LAMMPS fork on GitHub to include those changes. The LAMMPS developer may then decide to assign the pull request to another developer (e.g. when that developer is more knowledgeable about the submitted feature or enhancement or has written the modified code). It may also happen, that additional developers are requested to provide a review and approve the changes. For submissions, that may change the general behavior of LAMMPS, or where a possibility of unwanted side effects exists, additional tests may be requested by the assigned developer. From 23d4bfe1983847c9f8a3675d30d15abbb72f14f9 Mon Sep 17 00:00:00 2001 From: jbcouli Date: Wed, 25 Oct 2023 11:08:58 -0600 Subject: [PATCH 278/417] reset eflag=0 in fix wall/region --- src/fix_wall_region.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fix_wall_region.cpp b/src/fix_wall_region.cpp index b243c82d92..da9ee757d9 100644 --- a/src/fix_wall_region.cpp +++ b/src/fix_wall_region.cpp @@ -244,6 +244,7 @@ void FixWallRegion::post_force(int vflag) // initilize ewall after region->prematch(), // so a dynamic region can access last timestep values + eflag = 0; ewall[0] = ewall[1] = ewall[2] = ewall[3] = 0.0; for (i = 0; i < nlocal; i++) From ea744ac8f9369d140be3b26bc9af7afcd844ceed Mon Sep 17 00:00:00 2001 From: jbcouli Date: Wed, 25 Oct 2023 11:17:24 -0600 Subject: [PATCH 279/417] fix typos --- doc/src/fix_ave_chunk.rst | 8 ++++---- src/fix_wall.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/fix_ave_chunk.rst b/doc/src/fix_ave_chunk.rst index 3c358c9aa5..adbfb43d72 100644 --- a/doc/src/fix_ave_chunk.rst +++ b/doc/src/fix_ave_chunk.rst @@ -541,10 +541,10 @@ Restrictions Related commands """""""""""""""" -:doc:`compute `, :doc:`fix ave/atom `, `fix -:doc:ave/histo `, :doc:`fix ave/time `, -:doc:`variable `, :doc:`fix ave/correlate -:doc:`, `fix ave/atogrid ` +:doc:`compute `, :doc:`fix ave/atom `, +:doc:`fix ave/histo `, :doc:`fix ave/time `, +:doc:`variable `, :doc:`fix ave/correlate `, +:doc:`fix ave/grid ` Default diff --git a/src/fix_wall.cpp b/src/fix_wall.cpp index 4c4406a34c..c4f3219622 100644 --- a/src/fix_wall.cpp +++ b/src/fix_wall.cpp @@ -344,7 +344,7 @@ void FixWall::post_force(int vflag) v_init(vflag); // energy intialize. - // eflag is used to track whether wall energies have been communitcated. + // eflag is used to track whether wall energies have been communicated. eflag = 0; for (int m = 0; m <= nwall; m++) ewall[m] = 0.0; From bb9f46824795424bb6cc7cbc331d8e20418061cd Mon Sep 17 00:00:00 2001 From: Ben Nebgen Date: Wed, 25 Oct 2023 14:38:28 -0600 Subject: [PATCH 280/417] Added fix to setting pair energies in kokkos --- src/KOKKOS/mliap_unified_kokkos.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/mliap_unified_kokkos.cpp b/src/KOKKOS/mliap_unified_kokkos.cpp index 612bc42dfe..4c38e4f1d6 100644 --- a/src/KOKKOS/mliap_unified_kokkos.cpp +++ b/src/KOKKOS/mliap_unified_kokkos.cpp @@ -271,8 +271,8 @@ void LAMMPS_NS::update_pair_energy(MLIAPDataKokkosDevice *data, double *eij) { auto d_eatoms = data->eatoms; auto d_pair_i= data->pair_i; - const auto nlistatoms = data->nlistatoms; - Kokkos::parallel_for(nlistatoms, KOKKOS_LAMBDA(int ii){ + const auto nlocal = data->nlocal; + Kokkos::parallel_for(nlocal, KOKKOS_LAMBDA(int ii){ d_eatoms[ii] = 0; }); @@ -281,7 +281,7 @@ void LAMMPS_NS::update_pair_energy(MLIAPDataKokkosDevice *data, double *eij) double e = 0.5 * eij[ii]; // must not count any contribution where i is not a local atom - if (i < nlistatoms) { + if (i < nlocal) { Kokkos::atomic_add(&d_eatoms[i], e); local_sum += e; } From 47dd98dd345aaf2e2536abbd4ac1e3ff71e621c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 25 Oct 2023 20:38:20 -0400 Subject: [PATCH 281/417] whitespace --- src/KOKKOS/pair_mliap_kokkos.cpp | 2 +- src/ML-IAP/pair_mliap.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/pair_mliap_kokkos.cpp b/src/KOKKOS/pair_mliap_kokkos.cpp index d991a93420..a735763fb0 100644 --- a/src/KOKKOS/pair_mliap_kokkos.cpp +++ b/src/KOKKOS/pair_mliap_kokkos.cpp @@ -138,7 +138,7 @@ template void PairMLIAPKokkos::allocate() { int n = atom->ntypes; - + memoryKK->destroy_kokkos(k_map, map); memoryKK->destroy_kokkos(k_cutsq, cutsq); memoryKK->destroy_kokkos(k_setflag, setflag); diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 79efc1f156..66e8b848cd 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -120,7 +120,7 @@ void PairMLIAP::allocate() { allocated = 1; int n = atom->ntypes; - + memory->create(setflag,n+1,n+1,"pair:setflag"); memory->create(cutsq,n+1,n+1,"pair:cutsq"); memory->create(cutghost,n+1,n+1,"pair:cutghost"); From ed4ae0a26c04dec85b29e6c7d551ad599bc06187 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Oct 2023 04:44:05 -0400 Subject: [PATCH 282/417] find more misformatted references in ReST sources --- doc/Makefile | 4 ++++ doc/src/fix_srd.rst | 4 ++-- doc/src/improper_amoeba.rst | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 2a4edc70f3..b652c515e1 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -63,6 +63,7 @@ help: @echo " anchor_check scan for duplicate anchor labels" @echo " style_check check for complete and consistent style lists" @echo " package_check check for complete and consistent package lists" + @echo " role_check check for misformatted role keywords" @echo " spelling spell-check the manual" # ------------------------------------------ @@ -98,6 +99,7 @@ html: xmlgen $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) $(MATHJAX) env LC_ALL=C grep -n '[^ -~]' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n ' :[a-z]\+`' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n ' `[^`]\+<[a-z][^`]\+`[^_]' $(RSTDIR)/*.rst ;\ + env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst ;\ $(PYTHON) $(BUILDDIR)/utils/check-styles.py -s ../src -d src ;\ echo "############################################" ;\ deactivate ;\ @@ -179,6 +181,7 @@ pdf: xmlgen $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) env LC_ALL=C grep -n '[^ -~]' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n ' :[a-z]\+`' $(RSTDIR)/*.rst ;\ env LC_ALL=C grep -n ' `[^`]\+<[a-z][^`]\+`[^_]' $(RSTDIR)/*.rst ;\ + env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst ;\ $(PYTHON) utils/check-styles.py -s ../src -d src ;\ echo "############################################" ;\ deactivate ;\ @@ -227,6 +230,7 @@ char_check : role_check : @( env LC_ALL=C grep -n ' :[a-z]\+`' $(RSTDIR)/*.rst && exit 1 || : ) @( env LC_ALL=C grep -n ' `[^`]\+<[a-z][^`]\+`[^_]' $(RSTDIR)/*.rst && exit 1 || : ) + @( env LC_ALL=C grep -n ':\(ref\|doc\):[^`]' $(RSTDIR)/*.rst && exit 1 || : ) link_check : $(VENV) html @(\ diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index 59044a6e3b..dd080b0d3b 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -81,10 +81,10 @@ used in conjunction with the SRD model. These 3 papers give more details on how the SRD model is implemented in LAMMPS. :ref:`(Petersen) ` describes pure SRD fluid systems. :ref:`(Bolintineanu1) ` describes models -where pure SRD fluids :ref:interact with boundary walls. +where pure SRD fluids interact with boundary walls. :ref:`(Bolintineanu2) ` describes mixture models where large colloidal particles are solvated by an SRD fluid. See the -``examples/srd`` :ref:directory for sample input scripts. +``examples/srd`` directory for sample input scripts. This fix does two things: diff --git a/doc/src/improper_amoeba.rst b/doc/src/improper_amoeba.rst index 18c7f11080..1a93b0d32a 100644 --- a/doc/src/improper_amoeba.rst +++ b/doc/src/improper_amoeba.rst @@ -68,8 +68,8 @@ for more info. Related commands """""""""""""""" -:doc:`improper_coeff `, `improper_harmonic -:doc:` +:doc:`improper_coeff `, +:doc:`improper_harmonic ` Default """"""" From 1e533d649686c07906310dca9c25400e1d87446d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Oct 2023 12:20:47 -0400 Subject: [PATCH 283/417] simplify --- tools/lammps-gui/chartviewer.cpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index fbd888f1cd..f723562489 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -300,20 +300,7 @@ void ChartViewer::add_data(int step, double data) if (last_step < step) { last_step = step; series->append(step, data); - auto points = series->points(); - - qreal xmin = 1.0e100; - qreal xmax = -1.0e100; - qreal ymin = 1.0e100; - qreal ymax = -1.0e100; - for (auto &p : points) { - xmin = qMin(xmin, p.x()); - xmax = qMax(xmax, p.x()); - ymin = qMin(ymin, p.y()); - ymax = qMax(ymax, p.y()); - } - xaxis->setRange(xmin, xmax); - yaxis->setRange(ymin, ymax); + reset_zoom(); } } From 22c47a4e1b323ea65567bd1e79a4ba7115c1c43d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Oct 2023 12:21:48 -0400 Subject: [PATCH 284/417] expand x or y range for charts if too small --- tools/lammps-gui/chartviewer.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index f723562489..ff53602823 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -31,6 +31,8 @@ #include #include +#include + using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : @@ -86,9 +88,9 @@ int ChartWindow::get_step() const if (charts.size() > 0) { auto *v = charts[0]; if (v) - return (int)v->get_step(v->get_count() - 1); + return (int)v->get_step(v->get_count() - 1); else - return -1; + return -1; } else { return -1; } @@ -320,6 +322,20 @@ void ChartViewer::reset_zoom() ymin = qMin(ymin, p.y()); ymax = qMax(ymax, p.y()); } + + // avoid (nearly) empty ranges + double deltax = fabs((xmax - xmin) / ((xmax == 0.0) ? 1.0 : xmax)); + if (deltax < 1.0e-10) { + xmin -= 100.0*deltax; + xmax += 100.0*deltax; + } + + double deltay = fabs((ymax - ymin) / ((ymax == 0.0) ? 1.0 : ymax)); + if (deltay < 1.0e-10) { + ymin -= 100.0*deltay; + ymax += 100.0*deltay; + } + xaxis->setRange(xmin, xmax); yaxis->setRange(ymin, ymax); } From b6b8884bc65962a524de4cf08c8af0a9d8130117 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Oct 2023 13:58:17 -0400 Subject: [PATCH 285/417] clear data buffer when querying LAMMPS for info, check return values, use symbolic constant --- tools/lammps-gui/codeeditor.cpp | 13 ++++++++----- tools/lammps-gui/imageviewer.cpp | 6 ++++-- tools/lammps-gui/lammpsgui.cpp | 8 ++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index e95f576be0..f644b7f5f0 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -424,12 +424,15 @@ void CodeEditor::setVarNameList() LammpsWrapper *lammps = &qobject_cast(parent())->lammps; int nvar = lammps->id_count("variable"); - char buffer[200]; + constexpr int BUFLEN = 256; + char buffer[BUFLEN]; for (int i = 0; i < nvar; ++i) { - lammps->variable_info(i, buffer, 200); - if (strlen(buffer) == 1) vars << QString("$%1").arg(buffer); - vars << QString("${%1}").arg(buffer); - vars << QString("v_%1").arg(buffer); + memset(buffer, 0, BUFLEN); + if (lammps->variable_info(i, buffer, BUFLEN)) { + if (strlen(buffer) == 1) vars << QString("$%1").arg(buffer); + vars << QString("${%1}").arg(buffer); + vars << QString("v_%1").arg(buffer); + } } #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index 00b08f3f47..1d00dd7c1d 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -215,9 +215,11 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge combo->setToolTip("Select group to display"); combo->setObjectName("group"); int ngroup = lammps->id_count("group"); - char gname[64]; + constexpr int BUFLEN = 256; + char gname[BUFLEN]; for (int i = 0; i < ngroup; ++i) { - lammps->id_name("group", i, gname, 64); + memset(gname, 0, BUFLEN); + lammps->id_name("group", i, gname, BUFLEN); combo->addItem(gname); } diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 37b8aebf88..4b0f7370dc 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -58,7 +58,7 @@ #endif static const QString blank(" "); -static constexpr int BUFLEN = 128; +static constexpr int BUFLEN = 256; LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), @@ -778,11 +778,11 @@ void LammpsGui::logupdate() if (varwindow) { int nvar = lammps.id_count("variable"); - char buffer[200]; + char buffer[BUFLEN]; QString varinfo("\n"); for (int i = 0; i < nvar; ++i) { - lammps.variable_info(i, buffer, 200); - varinfo += buffer; + memset(buffer, 0, BUFLEN); + if (lammps.variable_info(i, buffer, BUFLEN)) varinfo += buffer; } if (nvar == 0) varinfo += " (none) "; From eea3b1a7575fbf4c4da8e2f7f2bfb0c4b510a746 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 26 Oct 2023 13:59:36 -0600 Subject: [PATCH 286/417] Whitespace --- src/KOKKOS/pair_mliap_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_mliap_kokkos.cpp b/src/KOKKOS/pair_mliap_kokkos.cpp index a735763fb0..5739a8ea2e 100644 --- a/src/KOKKOS/pair_mliap_kokkos.cpp +++ b/src/KOKKOS/pair_mliap_kokkos.cpp @@ -277,7 +277,7 @@ void PairMLIAPKokkos::coeff(int narg, char **arg) { for (int itype=1; itype <= atom->ntypes; ++itype) for (int jtype=1; jtype <= atom->ntypes; ++jtype) // do not set cuts for NULL atoms - if (map[itype] >= 0 && map[jtype] >=0) { + if (map[itype] >= 0 && map[jtype] >= 0) { h_cutsq(itype,jtype) = descriptor->cutsq[map[itype]][map[jtype]]; } k_cutsq.modify(); From b1ffb70f7d62355efd7de688ef2193c2477315ca Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 26 Oct 2023 17:20:33 -0600 Subject: [PATCH 287/417] Logic tweak --- src/KOKKOS/kokkos.cpp | 61 +++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 787f75fd47..b190c7f6b6 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -37,7 +37,7 @@ // for detecting GPU-aware MPI support: // the variable int have_gpu_aware -// - is 1 if GPU-aware MPI support is potentially available +// - is 1 if GPU-aware MPI support is available // - is 0 if GPU-aware MPI support is unavailable // - is -1 if GPU-aware MPI support is unknown @@ -52,7 +52,6 @@ GPU_AWARE_UNKNOWN #if (OMPI_MAJOR_VERSION >= 2) #include #if defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT -// May have CUDA-aware enabled: below we will check dynamically with MPIX_Query_cuda_support() static int have_gpu_aware = 1; #elif defined(MPIX_CUDA_AWARE_SUPPORT) && !MPIX_CUDA_AWARE_SUPPORT static int have_gpu_aware = 0; @@ -72,8 +71,7 @@ GPU_AWARE_UNKNOWN #if (OPEN_MPI) #if (OMPI_MAJOR_VERSION >= 5) #include -#if defined(MPIX_ROCM_AWARE_SUPPORT ) && MPIX_ROCM_AWARE_SUPPORT -// May have ROCm-aware enabled: below we will check dynamically with MPIX_Query_rocm_support() +#if defined(MPIX_ROCM_AWARE_SUPPORT) && MPIX_ROCM_AWARE_SUPPORT static int have_gpu_aware = 1; #elif defined(MPIX_ROCM_AWARE_SUPPORT) && !MPIX_ROCM_AWARE_SUPPORT static int have_gpu_aware = 0; @@ -89,7 +87,7 @@ GPU_AWARE_UNKNOWN #endif // KOKKOS_ENABLE_CUDA & KOKKOS_ENABLE_HIP -#endif // LMP_ENABLE_DEVICE +#endif // LMP_KOKKOS_GPU using namespace LAMMPS_NS; @@ -259,10 +257,8 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) // default settings for package kokkos command binsize = 0.0; -#if defined(KOKKOS_ENABLE_CUDA) && defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT - gpu_aware_flag = MPIX_Query_cuda_support(); -#elif defined(KOKKOS_ENABLE_HIP) && defined(MPIX_ROCM_AWARE_SUPPORT) && MPIX_ROCM_AWARE_SUPPORT - gpu_aware_flag = MPIX_Query_rocm_support(); +#if defined(LMP_KOKKOS_GPU) + gpu_aware_flag = 1; #else gpu_aware_flag = 0; #endif @@ -299,12 +295,22 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) #ifdef LMP_KOKKOS_GPU // check and warn about GPU-aware MPI availability when using multiple MPI tasks - // change default only if we can safely detect that GPU-aware MPI is not available + // change default only if we can detect that GPU-aware MPI is not available int nmpi = 0; MPI_Comm_size(world,&nmpi); if (nmpi > 1) { + // runtime check for OpenMPI GPU-aware + +#if (OPEN_MPI) +#if (OMPI_MAJOR_VERSION >= 2) && defined(KOKKOS_ENABLE_CUDA) + have_gpu_aware = MPIX_Query_cuda_support(); +#elif (OMPI_MAJOR_VERSION >= 5) && defined(KOKKOS_ENABLE_HIP) + have_gpu_aware = MPIX_Query_rocm_support(); +#endif +#endif + #if defined(MPI_VERSION) && (MPI_VERSION > 2) // Check for IBM Spectrum MPI @@ -312,17 +318,17 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) char mpi_version[MPI_MAX_LIBRARY_VERSION_STRING]; MPI_Get_library_version(mpi_version, &len); if (strstr(&mpi_version[0], "Spectrum") != nullptr) { - gpu_aware_flag = 0; char* str; + have_gpu_aware = 0; if ((str = getenv("OMPI_MCA_pml_pami_enable_cuda"))) - if ((strcmp(str,"1") == 0)) { + if ((strcmp(str,"1") == 0)) have_gpu_aware = 1; - gpu_aware_flag = 1; - } - if (!gpu_aware_flag) + if (!have_gpu_aware) { if (me == 0) error->warning(FLERR,"The Spectrum MPI '-gpu' flag is not set. Disabling GPU-aware MPI"); + gpu_aware_flag = 0; + } } #endif @@ -332,27 +338,32 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) "use '-pk kokkos gpu/aware on' to override"); gpu_aware_flag = 0; } else if (have_gpu_aware == -1) { // maybe we are dealing with MPICH, MVAPICH2 or some derivative? - // MVAPICH2 + // MVAPICH2 #if defined(MPICH) && defined(MVAPICH2_VERSION) char* str; - gpu_aware_flag = 0; + have_gpu_aware = 0; if ((str = getenv("MV2_USE_CUDA"))) if ((strcmp(str,"1") == 0)) - gpu_aware_flag = 1; + have_gpu_aware = 1; - if (!gpu_aware_flag) + if (!have_gpu_aware) { if (me == 0) error->warning(FLERR,"MVAPICH2 'MV2_USE_CUDA' environment variable is not set. Disabling GPU-aware MPI"); + gpu_aware_flag = 0; + } // pure MPICH or some unsupported MPICH derivative #elif defined(MPICH) && !defined(MVAPICH2_VERSION) char* str; - gpu_aware_flag = 0; + have_gpu_aware = 0; if ((str = getenv("MPICH_GPU_SUPPORT_ENABLED"))) if ((strcmp(str,"1") == 0)) - gpu_aware_flag = 1; + have_gpu_aware = 1; - if (!gpu_aware_flag && me == 0) - error->warning(FLERR,"Detected MPICH. Disabling GPU-aware MPI"); + if (!have_gpu_aware) { + if (me == 0) + error->warning(FLERR,"Detected MPICH. Disabling GPU-aware MPI"); + gpu_aware_flag = 0; + } #else if (me == 0) error->warning(FLERR,"Kokkos with GPU-enabled backend assumes GPU-aware MPI is available," @@ -360,9 +371,9 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) " '-pk kokkos gpu/aware off' if getting segmentation faults"); #endif - } // if (-1 == have_gpu_aware) + } // if (have_gpu_aware == -1) } // nmpi > 0 -#endif // LMP_ENABLE_DEVICE +#endif // LMP_KOKKOS_GPU #ifdef KILL_KOKKOS_ON_SIGSEGV signal(SIGSEGV, my_signal_handler); From d33a8ea0c23dafca2f0e40fae20e5c2795d18ffc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 26 Oct 2023 20:48:20 -0400 Subject: [PATCH 288/417] whitespace --- .../mliap_model_python_couple_kokkos.pyx | 6 ++-- src/KOKKOS/mliap_unified_couple_kokkos.pyx | 32 +++++++++---------- src/ML-IAP/mliap_unified_couple.pyx | 30 ++++++++--------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/KOKKOS/mliap_model_python_couple_kokkos.pyx b/src/KOKKOS/mliap_model_python_couple_kokkos.pyx index 010830f7fd..24a0e0897f 100644 --- a/src/KOKKOS/mliap_model_python_couple_kokkos.pyx +++ b/src/KOKKOS/mliap_model_python_couple_kokkos.pyx @@ -131,14 +131,14 @@ cdef create_array(device, void *pointer, shape,is_int): return numpy.asarray(pointer) else: return numpy.asarray(pointer) - + cdef public void MLIAPPYKokkos_compute_gradients(MLIAPModelPythonKokkosDevice * c_model, MLIAPDataKokkosDevice * data) with gil: dev=data.dev torch.cuda.nvtx.range_push("set data fields") - model = retrieve(c_model) + model = retrieve(c_model) n_d = data.ndescriptors n_a = data.nlistatoms @@ -149,7 +149,7 @@ cdef public void MLIAPPYKokkos_compute_gradients(MLIAPModelPythonKokkosDevice * beta_cp = create_array(dev, data.betas, (n_a, n_d), False) desc_cp = create_array(dev, data.descriptors, (n_a, n_d), False) torch.cuda.nvtx.range_pop() - + # Invoke python model on numpy arrays. torch.cuda.nvtx.range_push("call model") model(elem_cp,desc_cp,beta_cp,en_cp,dev==1) diff --git a/src/KOKKOS/mliap_unified_couple_kokkos.pyx b/src/KOKKOS/mliap_unified_couple_kokkos.pyx index 0142c5eda2..97d807ac33 100644 --- a/src/KOKKOS/mliap_unified_couple_kokkos.pyx +++ b/src/KOKKOS/mliap_unified_couple_kokkos.pyx @@ -134,14 +134,14 @@ cdef create_array(device, void *pointer, shape,is_int): return np.asarray(pointer) else: return np.asarray(pointer) - + # Cython implementation of MLIAPData # Automatically converts between C arrays and numpy when needed cdef class MLIAPDataPy: cdef MLIAPDataKokkosDevice * data - + def __cinit__(self): self.data = NULL @@ -158,7 +158,7 @@ cdef class MLIAPDataPy: ptr = eij.data.ptr except: ptr = eij.data_ptr() - update_pair_energy(self.data, ptr) + update_pair_energy(self.data, ptr) def update_pair_energy(self, eij): if self.data.dev==0: self.update_pair_energy_cpu(eij) @@ -178,7 +178,7 @@ cdef class MLIAPDataPy: ptr = fij.data.ptr except: ptr = fij.data_ptr() - update_pair_forces(self.data, ptr) + update_pair_forces(self.data, ptr) def update_pair_forces(self, fij): if self.data.dev==0: self.update_pair_forces_cpu(fij) @@ -190,11 +190,11 @@ cdef class MLIAPDataPy: return None return create_array(self.data.dev, self.data.f, [self.ntotal, 3],False) - + @property def size_gradforce(self): return self.data.size_gradforce - + @write_only_property def gradforce(self, value): if self.data.gradforce is NULL: @@ -203,7 +203,7 @@ cdef class MLIAPDataPy: cdef double[:, :] value_view = value gradforce_view[:] = value_view print("This code has not been tested or optimized for the GPU, if you are getting this warning optimize gradforce") - + @write_only_property def betas(self, value): if self.data.betas is NULL: @@ -281,7 +281,7 @@ cdef class MLIAPDataPy: @property def ntotal(self): return self.data.ntotal - + @property def elems(self): if self.data.elems is NULL: @@ -295,7 +295,7 @@ cdef class MLIAPDataPy: @property def nlocal(self): return self.data.nlocal - + @property def natomneigh(self): return self.data.natomneigh @@ -311,7 +311,7 @@ cdef class MLIAPDataPy: if self.data.iatoms is NULL: return None return create_array(self.data.dev, self.data.iatoms, [self.natomneigh],True) - + @property def ielems(self): if self.data.ielems is NULL: @@ -327,7 +327,7 @@ cdef class MLIAPDataPy: if self.data.pair_i is NULL: return None return create_array(self.data.dev, self.data.pair_i, [self.npairs],True) - + @property def pair_j(self): return self.jatoms @@ -337,7 +337,7 @@ cdef class MLIAPDataPy: if self.data.jatoms is NULL: return None return create_array(self.data.dev, self.data.jatoms, [self.npairs],True) - + @property def jelems(self): if self.data.jelems is NULL: @@ -388,13 +388,13 @@ cdef class MLIAPUnifiedInterfaceKokkos: self.model = NULL self.descriptor = NULL self.unified_impl = unified_impl - + def compute_gradients(self, data): self.unified_impl.compute_gradients(data) - + def compute_descriptors(self, data): self.unified_impl.compute_descriptors(data) - + def compute_forces(self, data): self.unified_impl.compute_forces(data) @@ -448,7 +448,7 @@ cdef public object mliap_unified_connect_kokkos(char *fname, MLIAPDummyModel * m if unified.element_types is None: raise ValueError("no element type set") - + cdef int nelements = len(unified.element_types) cdef char **elements = malloc(nelements * sizeof(char*)) diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 422b8bbcee..3148b96b51 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -114,11 +114,11 @@ cdef class MLIAPDataPy: def __cinit__(self): self.data = NULL - + def update_pair_energy(self, eij): cdef double[:] eij_arr = eij update_pair_energy(self.data, &eij_arr[0]) - + def update_pair_forces(self, fij): cdef double[:, ::1] fij_arr = fij update_pair_forces(self.data, &fij_arr[0][0]) @@ -128,11 +128,11 @@ cdef class MLIAPDataPy: if self.data.f is NULL: return None return np.asarray( &self.data.f[0][0]) - + @property def size_gradforce(self): return self.data.size_gradforce - + @write_only_property def gradforce(self, value): if self.data.gradforce is NULL: @@ -140,7 +140,7 @@ cdef class MLIAPDataPy: cdef double[:, :] gradforce_view = &self.data.gradforce[0][0] cdef double[:, :] value_view = value gradforce_view[:] = value_view - + @write_only_property def betas(self, value): if self.data.betas is NULL: @@ -217,7 +217,7 @@ cdef class MLIAPDataPy: @property def ntotal(self): return self.data.ntotal - + @property def elems(self): if self.data.elems is NULL: @@ -231,7 +231,7 @@ cdef class MLIAPDataPy: @property def nlocal(self): return self.data.nlocal - + @property def natomneigh(self): return self.data.natomneigh @@ -247,13 +247,13 @@ cdef class MLIAPDataPy: if self.data.iatoms is NULL: return None return np.asarray( &self.data.iatoms[0]) - + @property def ielems(self): if self.data.ielems is NULL: return None return np.asarray( &self.data.ielems[0]) - + @property def npairs(self): return self.data.npairs @@ -263,7 +263,7 @@ cdef class MLIAPDataPy: if self.data.pair_i is NULL: return None return np.asarray( &self.data.pair_i[0]) - + @property def pair_j(self): return self.jatoms @@ -273,7 +273,7 @@ cdef class MLIAPDataPy: if self.data.jatoms is NULL: return None return np.asarray( &self.data.jatoms[0]) - + @property def jelems(self): if self.data.jelems is NULL: @@ -323,13 +323,13 @@ cdef class MLIAPUnifiedInterface: self.model = NULL self.descriptor = NULL self.unified_impl = unified_impl - + def compute_gradients(self, data): self.unified_impl.compute_gradients(data) - + def compute_descriptors(self, data): self.unified_impl.compute_descriptors(data) - + def compute_forces(self, data): self.unified_impl.compute_forces(data) @@ -384,7 +384,7 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, if unified.element_types is None: raise ValueError("no element type set") - + cdef int nelements = len(unified.element_types) cdef char **elements = malloc(nelements * sizeof(char*)) From b9283cfcf661418df817bc1b7a3d8455bc3b57c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 00:20:05 -0400 Subject: [PATCH 289/417] modernize --- purge-workflows.py | 24 ++++++++++++++++++++++++ src/fix_dt_reset.cpp | 2 +- src/fix_nve_limit.cpp | 7 ++----- src/neighbor.cpp | 18 ++++++------------ src/neighbor.h | 2 +- 5 files changed, 34 insertions(+), 19 deletions(-) create mode 100755 purge-workflows.py diff --git a/purge-workflows.py b/purge-workflows.py new file mode 100755 index 0000000000..00ebf35fa8 --- /dev/null +++ b/purge-workflows.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +from yaml import load +import subprocess +try: + from yaml import CLoader as Loader +except ImportError: + from yaml import Loader + +runs = subprocess.check_output('gh api repos/lammps/lammps/actions/runs',shell=True) +data = load(runs,Loader=Loader) +while data['total_count'] > 3: + print('remaining: ', data['total_count']) + num=1 + for d in data['workflow_runs']: + print(num, d['id'],d['name'],d['run_number']) + num += 1 + if num > 4: + subprocess.call('gh api -X DELETE repos/lammps/lammps/actions/runs/' + str(d['id']), shell=True) + #print('gh api -X DELETE repos/lammps/lammps/actions/runs/' + str(d['id'])) + else: + print('skip') + runs = subprocess.check_output('gh api repos/lammps/lammps/actions/runs',shell=True) + data = load(runs,Loader=Loader) diff --git a/src/fix_dt_reset.cpp b/src/fix_dt_reset.cpp index b56ae4f846..ba69d17718 100644 --- a/src/fix_dt_reset.cpp +++ b/src/fix_dt_reset.cpp @@ -195,7 +195,7 @@ void FixDtReset::end_of_step() update->dt_default = 0; if (respaflag) update->integrate->reset_dt(); if (force->pair) force->pair->reset_dt(); - for (int i = 0; i < modify->nfix; i++) modify->fix[i]->reset_dt(); + for (auto &ifix : modify->get_fix_list()) ifix->reset_dt(); output->reset_dt(); } diff --git a/src/fix_nve_limit.cpp b/src/fix_nve_limit.cpp index 331d50631b..53e9258ce5 100644 --- a/src/fix_nve_limit.cpp +++ b/src/fix_nve_limit.cpp @@ -71,12 +71,9 @@ void FixNVELimit::init() // warn if using fix shake, which will lead to invalid constraint forces - for (int i = 0; i < modify->nfix; i++) - if (utils::strmatch(modify->fix[i]->style,"^shake") - || utils::strmatch(modify->fix[i]->style,"^rattle")) { - if (comm->me == 0) + if ((comm->me == 0) && ((modify->get_fix_by_style("^shake").size() > 0) || + (modify->get_fix_by_style("^rattle").size() > 0))) error->warning(FLERR,"Should not use fix nve/limit with fix shake or fix rattle"); - } } /* ---------------------------------------------------------------------- diff --git a/src/neighbor.cpp b/src/neighbor.cpp index c6eea7e2f1..63e1494acd 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -143,7 +143,6 @@ pairclass(nullptr), pairnames(nullptr), pairmasks(nullptr) cutneighghostsq = nullptr; cuttype = nullptr; cuttypesq = nullptr; - fixchecklist = nullptr; // pairwise neighbor lists and associated data structs @@ -242,7 +241,6 @@ Neighbor::~Neighbor() memory->destroy(cutneighghostsq); delete[] cuttype; delete[] cuttypesq; - delete[] fixchecklist; for (int i = 0; i < nlist; i++) delete lists[i]; for (int i = 0; i < nbin; i++) delete neigh_bin[i]; @@ -497,19 +495,15 @@ void Neighbor::init() if (cut_respa[0]-skin < 0) cut_middle_inside_sq = 0.0; } - // fixchecklist = other classes that can induce reneighboring in decide() - restart_check = 0; if (output->restart_flag) restart_check = 1; - delete[] fixchecklist; - fixchecklist = nullptr; - fixchecklist = new int[modify->nfix]; + // fixchecklist = other classes that can induce reneighboring in decide() + fixchecklist.clear(); fix_check = 0; - for (i = 0; i < modify->nfix; i++) - if (modify->fix[i]->force_reneighbor) - fixchecklist[fix_check++] = i; + for (auto &ifix : modify->get_fix_list()) + if (ifix->force_reneighbor) fixchecklist.push_back(ifix); must_check = 0; if (restart_check || fix_check) must_check = 1; @@ -2298,8 +2292,8 @@ int Neighbor::decide() if (must_check) { bigint n = update->ntimestep; if (restart_check && n == output->next_restart) return 1; - for (int i = 0; i < fix_check; i++) - if (n == modify->fix[fixchecklist[i]]->next_reneighbor) return 1; + for (auto &ifix : fixchecklist) + if (n == ifix->next_reneighbor) return 1; } ago++; diff --git a/src/neighbor.h b/src/neighbor.h index 9c51361aa8..d696445d61 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -187,7 +187,7 @@ class Neighbor : protected Pointers { int must_check; // 1 if must check other classes to reneigh int restart_check; // 1 if restart enabled, 0 if no int fix_check; // # of fixes that induce reneigh - int *fixchecklist; // which fixes to check + std::vectorfixchecklist; // which fixes to check double triggersq; // trigger = build when atom moves this dist From 5a665c31f6baf42c9c6fd6c49ae797a5870feb3f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 00:20:34 -0400 Subject: [PATCH 290/417] use better heuristics to avoid zero plot ranges --- tools/lammps-gui/chartviewer.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index ff53602823..0150133954 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -324,16 +324,26 @@ void ChartViewer::reset_zoom() } // avoid (nearly) empty ranges - double deltax = fabs((xmax - xmin) / ((xmax == 0.0) ? 1.0 : xmax)); - if (deltax < 1.0e-10) { - xmin -= 100.0*deltax; - xmax += 100.0*deltax; + double deltax = xmax - xmin; + if ((deltax / ((xmax == 0.0) ? 1.0 : xmax)) < 1.0e-10) { + if ((xmin == 0.0) || (xmax == 0.0)) { + xmin = -0.025; + xmax = 0.025; + } else { + xmin -= 0.025 * fabs(xmin); + xmax += 0.025 * fabs(xmax); + } } - double deltay = fabs((ymax - ymin) / ((ymax == 0.0) ? 1.0 : ymax)); - if (deltay < 1.0e-10) { - ymin -= 100.0*deltay; - ymax += 100.0*deltay; + double deltay = ymax - ymin; + if ((deltay / ((ymax == 0.0) ? 1.0 : ymax)) < 1.0e-10) { + if ((ymin == 0.0) || (ymax == 0.0)) { + ymin = -0.025; + ymax = 0.025; + } else { + ymin -= 0.025 * fabs(ymin); + ymax += 0.025 * fabs(ymax); + } } xaxis->setRange(xmin, xmax); From dc9140dfa8ba417cacf83e02e460f60ed7ec14ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 03:19:11 -0400 Subject: [PATCH 291/417] modernize --- src/GPU/fix_nh_gpu.cpp | 8 +--- src/INTEL/fix_nh_intel.cpp | 8 +--- src/KOKKOS/fix_nh_kokkos.cpp | 9 ++--- src/OPENMP/fix_nh_omp.cpp | 8 +--- src/fix_box_relax.cpp | 29 +++----------- src/fix_box_relax.h | 3 +- src/fix_nh.cpp | 74 +++++++++++++----------------------- src/fix_nh.h | 3 +- 8 files changed, 43 insertions(+), 99 deletions(-) diff --git a/src/GPU/fix_nh_gpu.cpp b/src/GPU/fix_nh_gpu.cpp index 9d4fbcc668..00df278ea8 100644 --- a/src/GPU/fix_nh_gpu.cpp +++ b/src/GPU/fix_nh_gpu.cpp @@ -129,9 +129,7 @@ void FixNHGPU::remap() } } - if (nrigid) - for (int i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -304,9 +302,7 @@ void FixNHGPU::remap() } } - if (nrigid) - for (int i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/INTEL/fix_nh_intel.cpp b/src/INTEL/fix_nh_intel.cpp index 2c05c3f6fa..688101ab13 100644 --- a/src/INTEL/fix_nh_intel.cpp +++ b/src/INTEL/fix_nh_intel.cpp @@ -138,9 +138,7 @@ void FixNHIntel::remap() } } - if (nrigid) - for (int i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -321,9 +319,7 @@ void FixNHIntel::remap() } } - if (nrigid) - for (int i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index 939b88889c..3d2d3ebb71 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -310,10 +310,9 @@ void FixNHKokkos::remap() // domain->x2lamda(x[i],x[i]); //} - if (nrigid) + if (rfix.size() > 0) error->all(FLERR,"Cannot (yet) use rigid bodies with fix nh and Kokkos"); - //for (i = 0; i < nrigid; i++) - // modify->fix[rfix[i]]->deform(0); + // for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -459,9 +458,7 @@ void FixNHKokkos::remap() // domain->lamda2x(x[i],x[i]); //} - //if (nrigid) - // for (i = 0; i < nrigid; i++) - // modify->fix[rfix[i]]->deform(1); + // for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/OPENMP/fix_nh_omp.cpp b/src/OPENMP/fix_nh_omp.cpp index aada50949e..a7fe2738ca 100644 --- a/src/OPENMP/fix_nh_omp.cpp +++ b/src/OPENMP/fix_nh_omp.cpp @@ -68,9 +68,7 @@ void FixNHOMP::remap() domain->x2lamda(x[i],x[i]); } - if (nrigid) - for (int i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -218,9 +216,7 @@ void FixNHOMP::remap() domain->lamda2x(x[i],x[i]); } - if (nrigid) - for (int i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } diff --git a/src/fix_box_relax.cpp b/src/fix_box_relax.cpp index fba050e89c..1f715a1dd4 100644 --- a/src/fix_box_relax.cpp +++ b/src/fix_box_relax.cpp @@ -319,9 +319,6 @@ FixBoxRelax::FixBoxRelax(LAMMPS *lmp, int narg, char **arg) : pflag = 1; dimension = domain->dimension; - nrigid = 0; - rfix = nullptr; - current_lifo = 0; } @@ -329,8 +326,6 @@ FixBoxRelax::FixBoxRelax(LAMMPS *lmp, int narg, char **arg) : FixBoxRelax::~FixBoxRelax() { - delete[] rfix; - // delete temperature and pressure if fix created them if (tflag) modify->delete_compute(id_temp); @@ -368,20 +363,10 @@ void FixBoxRelax::init() else kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete[] rfix; - nrigid = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; - if (nrigid) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); // initial box dimensions @@ -638,9 +623,7 @@ void FixBoxRelax::remap() domain->x2lamda(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -678,9 +661,7 @@ void FixBoxRelax::remap() domain->lamda2x(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_box_relax.h b/src/fix_box_relax.h index bedf7faef3..0870ed522d 100644 --- a/src/fix_box_relax.h +++ b/src/fix_box_relax.h @@ -68,8 +68,7 @@ class FixBoxRelax : public Fix { class Compute *temperature, *pressure; int tflag, pflag; - int nrigid; - int *rfix; + std::vector rfix; double sigma[6]; // scaled target stress double utsigma[3]; // weighting for upper-tri elements diff --git a/src/fix_nh.cpp b/src/fix_nh.cpp index 12272c3123..562ca51c29 100644 --- a/src/fix_nh.cpp +++ b/src/fix_nh.cpp @@ -53,12 +53,9 @@ enum{ISO,ANISO,TRICLINIC}; ---------------------------------------------------------------------- */ FixNH::FixNH(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - rfix(nullptr), id_dilate(nullptr), irregular(nullptr), - id_temp(nullptr), id_press(nullptr), - eta(nullptr), eta_dot(nullptr), eta_dotdot(nullptr), - eta_mass(nullptr), etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), - etap_mass(nullptr) + Fix(lmp, narg, arg), id_dilate(nullptr), irregular(nullptr), id_temp(nullptr), + id_press(nullptr), eta(nullptr), eta_dot(nullptr), eta_dotdot(nullptr), eta_mass(nullptr), + etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), etap_mass(nullptr) { if (narg < 4) utils::missing_cmd_args(FLERR, std::string("fix ") + style, error); @@ -271,7 +268,7 @@ FixNH::FixNH(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[iarg+1],"all") == 0) allremap = 1; else { allremap = 0; - delete [] id_dilate; + delete[] id_dilate; id_dilate = utils::strdup(arg[iarg+1]); int idilate = group->find(id_dilate); if (idilate == -1) @@ -564,9 +561,6 @@ FixNH::FixNH(LAMMPS *lmp, int narg, char **arg) : if (deviatoric_flag) size_vector += 1; } - nrigid = 0; - rfix = nullptr; - if (pre_exchange_flag) irregular = new Irregular(lmp); else irregular = nullptr; @@ -582,31 +576,29 @@ FixNH::~FixNH() { if (copymode) return; - delete [] id_dilate; - delete [] rfix; - + delete[] id_dilate; delete irregular; // delete temperature and pressure if fix created them if (tcomputeflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; if (tstat_flag) { - delete [] eta; - delete [] eta_dot; - delete [] eta_dotdot; - delete [] eta_mass; + delete[] eta; + delete[] eta_dot; + delete[] eta_dotdot; + delete[] eta_mass; } if (pstat_flag) { if (pcomputeflag) modify->delete_compute(id_press); - delete [] id_press; + delete[] id_press; if (mpchain) { - delete [] etap; - delete [] etap_dot; - delete [] etap_dotdot; - delete [] etap_mass; + delete[] etap; + delete[] etap_dot; + delete[] etap_dotdot; + delete[] etap_mass; } } } @@ -641,15 +633,17 @@ void FixNH::init() // ensure no conflict with fix deform if (pstat_flag) - for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { - int *dimflag = (dynamic_cast(modify->fix[i]))->dimflag; + for (auto &ifix : modify->get_fix_by_style("^deform")) { + auto deform = dynamic_cast(ifix); + if (deform) { + int *dimflag = deform->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2]) || (p_flag[3] && dimflag[3]) || (p_flag[4] && dimflag[4]) || (p_flag[5] && dimflag[5])) error->all(FLERR,"Cannot use fix {} and fix deform on " "same component of stress tensor", style); } + } // set temperature and pressure ptrs @@ -718,20 +712,10 @@ void FixNH::init() } // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete [] rfix; - nrigid = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; - if (nrigid) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } /* ---------------------------------------------------------------------- @@ -1090,9 +1074,7 @@ void FixNH::remap() domain->x2lamda(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -1237,9 +1219,7 @@ void FixNH::remap() domain->lamda2x(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- @@ -1398,7 +1378,7 @@ int FixNH::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tcomputeflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); temperature = modify->get_compute_by_id(arg[1]); @@ -1428,7 +1408,7 @@ int FixNH::modify_param(int narg, char **arg) modify->delete_compute(id_press); pcomputeflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); pressure = modify->get_compute_by_id(arg[1]); diff --git a/src/fix_nh.h b/src/fix_nh.h index 3e406929b2..4741f3bac5 100644 --- a/src/fix_nh.h +++ b/src/fix_nh.h @@ -66,9 +66,8 @@ class FixNH : public Fix { double drag, tdrag_factor; // drag factor on particle thermostat double pdrag_factor; // drag factor on barostat int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes int dilate_group_bit; // mask for dilation group - int *rfix; // indices of rigid fixes + std::vector rfix; // list of rigid fixes char *id_dilate; // group name to dilate class Irregular *irregular; // for migrating atoms after box flips From 6b4a1908203b226d13509c3b6bf0802b323ba6e0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 03:51:19 -0400 Subject: [PATCH 292/417] must skip quit command death test with MPICH version 4.1 and later due to using threads --- unittest/commands/test_simple_commands.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 1c995603e1..79ea1c71ce 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -213,8 +213,11 @@ TEST_F(SimpleCommandsTest, Quit) END_HIDE_OUTPUT(); TEST_FAILURE(".*ERROR: Expected integer .*", command("quit xxx");); - // the following tests must be skipped with OpenMPI due to using threads + // the following tests must be skipped with OpenMPI or MPICH 4.1 and later due to using threads if (platform::mpi_vendor() == "Open MPI") GTEST_SKIP(); +#if defined(MPICH_NUMVERSION) + if (MPICH_NUMVERSION >= 40100000) GTEST_SKIP(); +#endif ASSERT_EXIT(command("quit"), ExitedWithCode(0), ""); ASSERT_EXIT(command("quit 9"), ExitedWithCode(9), ""); } From e431a972ad72aee6e0eb43cf2eee26882a4a93a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 09:26:58 -0400 Subject: [PATCH 293/417] Stop processing commands when "quit" is found instead of crashing. When using the library interface for processing commands, the "quit" command will terminate the application. Instead we intercept and just stop processing the command buffer and print a suitable message. Long-term, we perhaps may want to add a "QuitException" and throw that. --- src/library.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/library.cpp b/src/library.cpp index 7b0d8ef91b..9d542f86ae 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -702,6 +702,13 @@ void lammps_commands_string(void *handle, const char *str) continue; } } + // stop processing when quit command is found + if (words.size() && (words[0] == "quit")) { + if (lmp->comm->me == 0) + utils::logmesg(lmp, "Encountered a 'quit' command. Stopping ...\n"); + break; + } + lmp->input->one(cmd.c_str()); } } From d79aca60154e2abc4cd852b42f852ca0089ee8da Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 11:08:02 -0400 Subject: [PATCH 294/417] fix bug in not listing all not compiled-in styles --- src/lammps.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lammps.cpp b/src/lammps.cpp index 6fc06521d1..c44933d59c 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -16,6 +16,7 @@ #include "style_angle.h" // IWYU pragma: keep #include "style_atom.h" // IWYU pragma: keep +#include "style_body.h" // IWYU pragma: keep #include "style_bond.h" // IWYU pragma: keep #include "style_command.h" // IWYU pragma: keep #include "style_compute.h" // IWYU pragma: keep @@ -27,6 +28,7 @@ #include "style_kspace.h" // IWYU pragma: keep #include "style_minimize.h" // IWYU pragma: keep #include "style_pair.h" // IWYU pragma: keep +#include "style_reader.h" // IWYU pragma: keep #include "style_region.h" // IWYU pragma: keep #include "accelerator_kokkos.h" @@ -1150,9 +1152,9 @@ const char *LAMMPS::match_style(const char *style, const char *name) check_for_match(bond,style,name); check_for_match(command,style,name); check_for_match(compute,style,name); + check_for_match(dihedral,style,name); check_for_match(dump,style,name); check_for_match(fix,style,name); - check_for_match(compute,style,name); check_for_match(improper,style,name); check_for_match(integrate,style,name); check_for_match(kspace,style,name); @@ -1163,6 +1165,8 @@ const char *LAMMPS::match_style(const char *style, const char *name) return nullptr; } +#undef check_for_match + /** \brief Return suffix for non-pair styles depending on pair_only_flag * * \return suffix or null pointer From 16dd61ca5f138fe8ddab162667bfe66de0da4f15 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Oct 2023 09:48:26 -0600 Subject: [PATCH 295/417] Remove redundant compile-time checks --- src/KOKKOS/kokkos.cpp | 106 ++++++++++++------------------------------ 1 file changed, 31 insertions(+), 75 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index b190c7f6b6..ace1d0f575 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -33,62 +33,6 @@ #include // for getpid() #endif -#ifdef LMP_KOKKOS_GPU - -// for detecting GPU-aware MPI support: -// the variable int have_gpu_aware -// - is 1 if GPU-aware MPI support is available -// - is 0 if GPU-aware MPI support is unavailable -// - is -1 if GPU-aware MPI support is unknown - -#define GPU_AWARE_UNKNOWN static int have_gpu_aware = -1; - -#if defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET) -GPU_AWARE_UNKNOWN -#elif defined(KOKKOS_ENABLE_CUDA) - -// OpenMPI supports detecting GPU-aware MPI as of version 2.0.0 -#if (OPEN_MPI) -#if (OMPI_MAJOR_VERSION >= 2) -#include -#if defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT -static int have_gpu_aware = 1; -#elif defined(MPIX_CUDA_AWARE_SUPPORT) && !MPIX_CUDA_AWARE_SUPPORT -static int have_gpu_aware = 0; -#else -GPU_AWARE_UNKNOWN -#endif // defined(MPIX_CUDA_AWARE_SUPPORT) -#else // old OpenMPI -GPU_AWARE_UNKNOWN -#endif // (OMPI_MAJOR_VERSION >=2) -#else // unknown MPI library -GPU_AWARE_UNKNOWN -#endif // OPEN_MPI - -#elif defined(KOKKOS_ENABLE_HIP) - -// OpenMPI supports detecting HIP-aware MPI as of version 5.0.0 -#if (OPEN_MPI) -#if (OMPI_MAJOR_VERSION >= 5) -#include -#if defined(MPIX_ROCM_AWARE_SUPPORT) && MPIX_ROCM_AWARE_SUPPORT -static int have_gpu_aware = 1; -#elif defined(MPIX_ROCM_AWARE_SUPPORT) && !MPIX_ROCM_AWARE_SUPPORT -static int have_gpu_aware = 0; -#else -GPU_AWARE_UNKNOWN -#endif // defined(OMPI_HAVE_MPI_EXT_ROCM) -#else // old OpenMPI -GPU_AWARE_UNKNOWN -#endif // (OMPI_MAJOR_VERSION >=5) -#else // unknown MPI library -GPU_AWARE_UNKNOWN -#endif // OPEN_MPI - -#endif // KOKKOS_ENABLE_CUDA & KOKKOS_ENABLE_HIP - -#endif // LMP_KOKKOS_GPU - using namespace LAMMPS_NS; int KokkosLMP::is_finalized = 0; @@ -301,18 +245,35 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) MPI_Comm_size(world,&nmpi); if (nmpi > 1) { - // runtime check for OpenMPI GPU-aware - + // for detecting GPU-aware MPI support: + // the variable int have_gpu_aware + // - is 1 if GPU-aware MPI support is available + // - is 0 if GPU-aware MPI support is unavailable + // - is -1 if GPU-aware MPI support is unknown + + int have_gpu_aware = -1; + + // OpenMPI + #if (OPEN_MPI) + have_gpu_aware = 0; #if (OMPI_MAJOR_VERSION >= 2) && defined(KOKKOS_ENABLE_CUDA) - have_gpu_aware = MPIX_Query_cuda_support(); + have_gpu_aware = MPIX_Query_cuda_support(); #elif (OMPI_MAJOR_VERSION >= 5) && defined(KOKKOS_ENABLE_HIP) - have_gpu_aware = MPIX_Query_rocm_support(); -#endif + have_gpu_aware = MPIX_Query_rocm_support(); #endif + if (gpu_aware_flag == 1 && have_gpu_aware == 0) { + if (me == 0) + error->warning(FLERR,"Turning off GPU-aware MPI since it is not detected, " + "use '-pk kokkos gpu/aware on' to override"); + gpu_aware_flag = 0; + } +#endif + + // IBM Spectrum MPI + #if defined(MPI_VERSION) && (MPI_VERSION > 2) - // Check for IBM Spectrum MPI int len; char mpi_version[MPI_MAX_LIBRARY_VERSION_STRING]; @@ -332,12 +293,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) } #endif - if (gpu_aware_flag == 1 && have_gpu_aware == 0) { - if (me == 0) - error->warning(FLERR,"Turning off GPU-aware MPI since it is not detected, " - "use '-pk kokkos gpu/aware on' to override"); - gpu_aware_flag = 0; - } else if (have_gpu_aware == -1) { // maybe we are dealing with MPICH, MVAPICH2 or some derivative? + if (have_gpu_aware == -1) { // MVAPICH2 #if defined(MPICH) && defined(MVAPICH2_VERSION) char* str; @@ -351,7 +307,8 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) error->warning(FLERR,"MVAPICH2 'MV2_USE_CUDA' environment variable is not set. Disabling GPU-aware MPI"); gpu_aware_flag = 0; } - // pure MPICH or some unsupported MPICH derivative + // pure MPICH or some MPICH derivative + // check for Cray MPICH which has GPU-aware support #elif defined(MPICH) && !defined(MVAPICH2_VERSION) char* str; have_gpu_aware = 0; @@ -365,13 +322,12 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) gpu_aware_flag = 0; } #else - if (me == 0) - error->warning(FLERR,"Kokkos with GPU-enabled backend assumes GPU-aware MPI is available," - " but cannot determine if this is the case\n try" - " '-pk kokkos gpu/aware off' if getting segmentation faults"); - + if (me == 0) + error->warning(FLERR,"Kokkos with GPU-enabled backend assumes GPU-aware MPI is available," + " but cannot determine if this is the case\n try" + " '-pk kokkos gpu/aware off' if getting segmentation faults"); #endif - } // if (have_gpu_aware == -1) + } } // nmpi > 0 #endif // LMP_KOKKOS_GPU From 0ab687040211409e7080d917596755eac0145500 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Oct 2023 10:31:24 -0600 Subject: [PATCH 296/417] Need to include MPI header --- src/KOKKOS/kokkos.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index ace1d0f575..41417c66ae 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -257,10 +257,13 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) #if (OPEN_MPI) have_gpu_aware = 0; -#if (OMPI_MAJOR_VERSION >= 2) && defined(KOKKOS_ENABLE_CUDA) +#if (OMPI_MAJOR_VERSION >= 2) +#include +#if defined(KOKKOS_ENABLE_CUDA) have_gpu_aware = MPIX_Query_cuda_support(); #elif (OMPI_MAJOR_VERSION >= 5) && defined(KOKKOS_ENABLE_HIP) have_gpu_aware = MPIX_Query_rocm_support(); +#endif #endif if (gpu_aware_flag == 1 && have_gpu_aware == 0) { From 784ae460a100a905e97fa04c139eca3fca6b1acd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 13:18:19 -0400 Subject: [PATCH 297/417] only offer completion in context menu, if there is something to complete --- tools/lammps-gui/codeeditor.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index f644b7f5f0..672c009c35 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -686,13 +686,15 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) // print augmented context menu if an entry was found auto *menu = createStandardContextMenu(); menu->addSeparator(); - auto action = menu->addAction(QString("Display available completions for '%1'").arg(help)); - action->setIcon(QIcon(":/icons/expand-text.png")); - connect(action, &QAction::triggered, this, &CodeEditor::runCompletion); + if (!help.isEmpty()) { + auto action = menu->addAction(QString("Display available completions for '%1'").arg(help)); + action->setIcon(QIcon(":/icons/expand-text.png")); + connect(action, &QAction::triggered, this, &CodeEditor::runCompletion); + } if (!page.isEmpty()) { menu->addSeparator(); - action = menu->addAction(QString("Reformat '%1' command").arg(help)); + auto action = menu->addAction(QString("Reformat '%1' command").arg(help)); action->setIcon(QIcon(":/icons/format-indent-less-3.png")); connect(action, &QAction::triggered, this, &CodeEditor::reformatCurrentLine); @@ -714,10 +716,10 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) connect(action2, &QAction::triggered, this, &CodeEditor::open_help); } } - auto action3 = menu->addAction(QString("LAMMPS Manual")); - action3->setIcon(QIcon(":/icons/help-browser.png")); - action3->setData(QString()); - connect(action3, &QAction::triggered, this, &CodeEditor::open_help); + auto action = menu->addAction(QString("LAMMPS Manual")); + action->setIcon(QIcon(":/icons/help-browser.png")); + action->setData(QString()); + connect(action, &QAction::triggered, this, &CodeEditor::open_help); menu->exec(event->globalPos()); delete menu; From 36690a861db743e5b36c2cf3435b789860feaf0a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 16:33:24 -0400 Subject: [PATCH 298/417] correct and simplify --- src/neighbor.cpp | 19 +++++++++++-------- src/neighbor.h | 1 - 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 63e1494acd..46d46b7440 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -496,17 +496,17 @@ void Neighbor::init() } restart_check = 0; - if (output->restart_flag) restart_check = 1; + if (output->restart_flag) must_check = restart_check = 1; // fixchecklist = other classes that can induce reneighboring in decide() fixchecklist.clear(); - fix_check = 0; - for (auto &ifix : modify->get_fix_list()) - if (ifix->force_reneighbor) fixchecklist.push_back(ifix); - - must_check = 0; - if (restart_check || fix_check) must_check = 1; + for (auto &ifix : modify->get_fix_list()) { + if (ifix->force_reneighbor) { + fixchecklist.push_back(ifix); + must_check = 1; + } + } // set special_flag for 1-2, 1-3, 1-4 neighbors // flag[0] is not used, flag[1] = 1-2, flag[2] = 1-3, flag[3] = 1-4 @@ -2292,8 +2292,11 @@ int Neighbor::decide() if (must_check) { bigint n = update->ntimestep; if (restart_check && n == output->next_restart) return 1; - for (auto &ifix : fixchecklist) + fprintf(stderr, "step %ld num fixes: %d\n", update->ntimestep, fixchecklist.size()); + for (auto &ifix : fixchecklist) { + fprintf(stderr, " fix: %s %s next %ld\n", ifix->id, ifix->style, ifix->next_reneighbor); if (n == ifix->next_reneighbor) return 1; + } } ago++; diff --git a/src/neighbor.h b/src/neighbor.h index d696445d61..ed99ae0af1 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -186,7 +186,6 @@ class Neighbor : protected Pointers { int must_check; // 1 if must check other classes to reneigh int restart_check; // 1 if restart enabled, 0 if no - int fix_check; // # of fixes that induce reneigh std::vectorfixchecklist; // which fixes to check double triggersq; // trigger = build when atom moves this dist From e7fc2923a52e0af045cb797f88c3a7f5ab6e3c42 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Oct 2023 14:59:51 -0600 Subject: [PATCH 299/417] whitespace --- src/KOKKOS/kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 41417c66ae..1116808c60 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -254,7 +254,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) int have_gpu_aware = -1; // OpenMPI - + #if (OPEN_MPI) have_gpu_aware = 0; #if (OMPI_MAJOR_VERSION >= 2) From 588be47b18f091f47347bf72d396e0b02c2cdf39 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 17:02:21 -0400 Subject: [PATCH 300/417] remove dead code --- src/KOKKOS/pair_yukawa_colloid_kokkos.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp index 04eb5ab657..9303e0d435 100644 --- a/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp +++ b/src/KOKKOS/pair_yukawa_colloid_kokkos.cpp @@ -255,7 +255,6 @@ compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, : params(itype,jtype).offset; // U = a * exp(-kappa*(r-(radi+radj))) / kappa - const F_FLOAT rinv = 1.0 / rr; const F_FLOAT screening = exp(-kappa*(rr-(radi+radj))); return aa / kappa * screening - offset; From 6c3206f2f63c0d69098e2c9135d85863e0a1356e Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 27 Oct 2023 15:36:22 -0600 Subject: [PATCH 301/417] Tweaks --- src/KOKKOS/kokkos.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 1116808c60..9670e2fbd5 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -33,6 +33,12 @@ #include // for getpid() #endif +#ifdef LMP_KOKKOS_GPU +#if (OPEN_MPI) && (OMPI_MAJOR_VERSION >= 2) +#include +#endif +#endif + using namespace LAMMPS_NS; int KokkosLMP::is_finalized = 0; @@ -256,23 +262,32 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) // OpenMPI #if (OPEN_MPI) - have_gpu_aware = 0; #if (OMPI_MAJOR_VERSION >= 2) -#include + #if defined(KOKKOS_ENABLE_CUDA) have_gpu_aware = MPIX_Query_cuda_support(); -#elif (OMPI_MAJOR_VERSION >= 5) && defined(KOKKOS_ENABLE_HIP) +#endif + +#if defined(KOKKOS_ENABLE_HIP) +#if (OMPI_MAJOR_VERSION >= 5) have_gpu_aware = MPIX_Query_rocm_support(); +#else + have_gpu_aware = 0; #endif #endif +#else + have_gpu_aware = 0; +#endif // OMPI_MAJOR_VERSION >= 2 + if (gpu_aware_flag == 1 && have_gpu_aware == 0) { if (me == 0) error->warning(FLERR,"Turning off GPU-aware MPI since it is not detected, " "use '-pk kokkos gpu/aware on' to override"); gpu_aware_flag = 0; } -#endif + +#endif // OPEN_MPI // IBM Spectrum MPI From d35c27167742bd457abc2a36a2fa95ca6b96312f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Oct 2023 19:10:55 -0400 Subject: [PATCH 302/417] limit the maximum number of iterations so the LAMMPS simulation will not stall --- src/compute_cluster_atom.cpp | 9 +++++++-- src/compute_fragment_atom.cpp | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index ae44fbcd37..0d60b8b993 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -29,6 +29,7 @@ using namespace LAMMPS_NS; +static constexpr int MAXLOOP = 100; /* ---------------------------------------------------------------------- */ ComputeClusterAtom::ComputeClusterAtom(LAMMPS *lmp, int narg, char **arg) : @@ -136,9 +137,11 @@ void ComputeClusterAtom::compute_peratom() int change, done, anychange; - while (true) { + int counter = 0; + // stop after MAXLOOP iterations + while (counter < MAXLOOP) { comm->forward_comm(this); - + ++counter; change = 0; while (true) { done = 1; @@ -177,6 +180,8 @@ void ComputeClusterAtom::compute_peratom() MPI_Allreduce(&change, &anychange, 1, MPI_INT, MPI_MAX, world); if (!anychange) break; } + if ((comm->me == 0) && (counter >= MAXLOOP)) + error->warning(FLERR, "Compute cluster/atom did not converge after {} iterations", MAXLOOP); } /* ---------------------------------------------------------------------- */ diff --git a/src/compute_fragment_atom.cpp b/src/compute_fragment_atom.cpp index 035f554c8d..7e3f3437b6 100644 --- a/src/compute_fragment_atom.cpp +++ b/src/compute_fragment_atom.cpp @@ -31,7 +31,8 @@ using namespace LAMMPS_NS; -#define BIG 1.0e20 +static constexpr double BIG = 1.0e20; +static constexpr int MAXLOOP = 100; /* ---------------------------------------------------------------------- */ @@ -145,8 +146,11 @@ void ComputeFragmentAtom::compute_peratom() commflag = 1; - while (true) { + int counter = 0; + // stop after MAXLOOP iterations + while (counter < MAXLOOP) { comm->forward_comm(this); + ++counter; done = 1; // set markflag = 0 for all owned atoms, for new iteration @@ -223,6 +227,8 @@ void ComputeFragmentAtom::compute_peratom() MPI_Allreduce(&done,&alldone,1,MPI_INT,MPI_MIN,world); if (alldone) break; } + if ((comm->me == 0) && (counter >= MAXLOOP)) + error->warning(FLERR, "Compute fragment/atom did not converge after {} iterations", MAXLOOP); } /* ---------------------------------------------------------------------- */ From ef2b3a7d70409c37b3ea2f401f67c1a1def9f006 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 28 Oct 2023 05:25:05 -0400 Subject: [PATCH 303/417] remove accidentally committed file --- purge-workflows.py | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100755 purge-workflows.py diff --git a/purge-workflows.py b/purge-workflows.py deleted file mode 100755 index 00ebf35fa8..0000000000 --- a/purge-workflows.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 - -from yaml import load -import subprocess -try: - from yaml import CLoader as Loader -except ImportError: - from yaml import Loader - -runs = subprocess.check_output('gh api repos/lammps/lammps/actions/runs',shell=True) -data = load(runs,Loader=Loader) -while data['total_count'] > 3: - print('remaining: ', data['total_count']) - num=1 - for d in data['workflow_runs']: - print(num, d['id'],d['name'],d['run_number']) - num += 1 - if num > 4: - subprocess.call('gh api -X DELETE repos/lammps/lammps/actions/runs/' + str(d['id']), shell=True) - #print('gh api -X DELETE repos/lammps/lammps/actions/runs/' + str(d['id'])) - else: - print('skip') - runs = subprocess.check_output('gh api repos/lammps/lammps/actions/runs',shell=True) - data = load(runs,Loader=Loader) From c5463e13f147eca8b9c89a1729b0afc2507f5513 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sat, 28 Oct 2023 13:22:10 -0400 Subject: [PATCH 304/417] output ninserted for fixes: deposit+pour --- src/GRANULAR/fix_pour.cpp | 12 +++++++++++- src/GRANULAR/fix_pour.h | 1 + src/fix_deposit.cpp | 6 ++++++ src/fix_deposit.h | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/GRANULAR/fix_pour.cpp b/src/GRANULAR/fix_pour.cpp index f92bca5073..8a2470715d 100644 --- a/src/GRANULAR/fix_pour.cpp +++ b/src/GRANULAR/fix_pour.cpp @@ -57,7 +57,8 @@ FixPour::FixPour(LAMMPS *lmp, int narg, char **arg) : if (narg < 6) error->all(FLERR, "Illegal fix pour command"); if (lmp->kokkos) error->all(FLERR, "Cannot yet use fix pour with the KOKKOS package"); - + + scalar_flag = 1; time_depend = 1; if (!atom->radius_flag || !atom->rmass_flag) @@ -1030,6 +1031,15 @@ void FixPour::options(int narg, char **arg) } } +/* ---------------------------------------------------------------------- + output number of successful insertions +------------------------------------------------------------------------- */ + +double FixPour::compute_scalar() +{ + return ninserted; +} + /* ---------------------------------------------------------------------- */ void FixPour::reset_dt() diff --git a/src/GRANULAR/fix_pour.h b/src/GRANULAR/fix_pour.h index 4a6e4abdae..57db2541df 100644 --- a/src/GRANULAR/fix_pour.h +++ b/src/GRANULAR/fix_pour.h @@ -32,6 +32,7 @@ class FixPour : public Fix { void init() override; void setup_pre_exchange() override; void pre_exchange() override; + double compute_scalar() override; void reset_dt() override; void *extract(const char *, int &) override; diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index 35bc48fe89..ebcaf92beb 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -51,6 +51,7 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : { if (narg < 7) error->all(FLERR,"Illegal fix deposit command"); + scalar_flag = 1; restart_global = 1; time_depend = 1; @@ -816,6 +817,11 @@ void FixDeposit::options(int narg, char **arg) } } +double FixDeposit::compute_scalar() +{ + return ninserted; +} + /* ---------------------------------------------------------------------- pack entire state of Fix into one write ------------------------------------------------------------------------- */ diff --git a/src/fix_deposit.h b/src/fix_deposit.h index ba5078dbbe..2b866dc068 100644 --- a/src/fix_deposit.h +++ b/src/fix_deposit.h @@ -32,6 +32,7 @@ class FixDeposit : public Fix { void init() override; void setup_pre_exchange() override; void pre_exchange() override; + double compute_scalar() override; void write_restart(FILE *) override; void restart(char *) override; void *extract(const char *, int &) override; From db91f9413d7773e1bd4901ea4e89198fa3fa9bfe Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sat, 28 Oct 2023 13:41:42 -0400 Subject: [PATCH 305/417] docs --- doc/src/fix_deposit.rst | 9 +++++---- doc/src/fix_pour.rst | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index 7d2d28bfa9..08711001c5 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -289,10 +289,11 @@ operation of the fix continues in an uninterrupted fashion. The fix will try to detect it and stop with an error. None of the :doc:`fix_modify ` options are relevant to this -fix. No global or per-atom quantities are stored by this fix for -access by various :doc:`output commands `. No parameter -of this fix can be used with the *start/stop* keywords of the -:doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +fix. This fix computes a global scalar, which can be accessed by various +output commands. The scalar is the cumulative number of insertions. The +scalar value calculated by this fix is “intensive”. No parameter of this +fix can be used with the *start/stop* keywords of the :doc:`run ` +command. This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" diff --git a/doc/src/fix_pour.rst b/doc/src/fix_pour.rst index eca1f70c41..0ad369bf29 100644 --- a/doc/src/fix_pour.rst +++ b/doc/src/fix_pour.rst @@ -245,8 +245,9 @@ produce the same behavior if you adjust the fix pour parameters appropriately. None of the :doc:`fix_modify ` options are relevant to this -fix. No global or per-atom quantities are stored by this fix for -access by various :doc:`output commands `. No parameter +fix. This fix computes a global scalar, which can be accessed by various +output commands. The scalar is the cumulative number of insertions. The +scalar value calculated by this fix is “intensive”. No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. From 902c43e8c6e84fccd856cf8902a7dab129e4b740 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sat, 28 Oct 2023 13:45:55 -0400 Subject: [PATCH 306/417] formatting --- src/fix_deposit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index ebcaf92beb..d2bcb3e855 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -817,6 +817,10 @@ void FixDeposit::options(int narg, char **arg) } } +/* ---------------------------------------------------------------------- + output number of successful insertions +------------------------------------------------------------------------- */ + double FixDeposit::compute_scalar() { return ninserted; From 56d2a791af693effe5a25a2354dbac16d0ef358d Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sat, 28 Oct 2023 14:01:39 -0400 Subject: [PATCH 307/417] whitespace --- src/GRANULAR/fix_pour.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GRANULAR/fix_pour.cpp b/src/GRANULAR/fix_pour.cpp index 8a2470715d..cc5f0567e8 100644 --- a/src/GRANULAR/fix_pour.cpp +++ b/src/GRANULAR/fix_pour.cpp @@ -57,7 +57,7 @@ FixPour::FixPour(LAMMPS *lmp, int narg, char **arg) : if (narg < 6) error->all(FLERR, "Illegal fix pour command"); if (lmp->kokkos) error->all(FLERR, "Cannot yet use fix pour with the KOKKOS package"); - + scalar_flag = 1; time_depend = 1; From c5c816e36074b704449abbcd073afb029e0d7de7 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Sat, 28 Oct 2023 20:14:53 -0600 Subject: [PATCH 308/417] Add another check --- src/KOKKOS/kokkos.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 9670e2fbd5..f702c8a2d1 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -265,13 +265,15 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) #if (OMPI_MAJOR_VERSION >= 2) #if defined(KOKKOS_ENABLE_CUDA) +#if defined(OMPI_HAVE_MPI_EXT_CUDA) && OMPI_HAVE_MPI_EXT_CUDA have_gpu_aware = MPIX_Query_cuda_support(); #endif +#endif #if defined(KOKKOS_ENABLE_HIP) -#if (OMPI_MAJOR_VERSION >= 5) +#if defined(OMPI_HAVE_MPI_EXT_ROCM) && OMPI_HAVE_MPI_EXT_ROCM have_gpu_aware = MPIX_Query_rocm_support(); -#else +#elif (OMPI_MAJOR_VERSION < 5) have_gpu_aware = 0; #endif #endif From 549ea506d4d8cd9a7e85aee85fe4fd59fc8aef62 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 29 Oct 2023 15:46:55 -0400 Subject: [PATCH 309/417] add var keyword to fix_deposit borrowed from create_atoms --- src/fix_deposit.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++-- src/fix_deposit.h | 6 +++- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index d2bcb3e855..7f11987ad7 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -20,6 +20,7 @@ #include "domain.h" #include "error.h" #include "fix.h" +#include "input.h" #include "lattice.h" #include "math_const.h" #include "math_extra.h" @@ -29,6 +30,7 @@ #include "random_park.h" #include "region.h" #include "update.h" +#include "variable.h" #include #include @@ -209,6 +211,10 @@ FixDeposit::~FixDeposit() delete [] idrigid; delete [] idshake; delete [] idregion; + delete [] vstr; + delete [] xstr; + delete [] ystr; + delete [] zstr; memory->destroy(coords); memory->destroy(imageflags); } @@ -361,6 +367,8 @@ void FixDeposit::pre_exchange() } while (iregion->match(coord[0],coord[1],coord[2]) == 0); } else error->all(FLERR,"Unknown particle distribution in fix deposit"); + if (varflag && vartest(coord[0],coord[1],coord[2]) == 0) continue; + // adjust vertical coord by offset if (dimension == 2) coord[1] += offset; @@ -583,8 +591,10 @@ void FixDeposit::pre_exchange() // warn if not successful b/c too many attempts - if (!success && comm->me == 0) - error->warning(FLERR,"Particle deposition was unsuccessful"); + if (warnflag && !success && comm->me == 0) { + error->warning(FLERR,"One or more particle depositions were unsuccessful"); + warnflag = 0; + } // reset global natoms,nbonds,etc // increment maxtag_all and maxmol_all if necessary @@ -661,6 +671,8 @@ void FixDeposit::options(int narg, char **arg) iregion = nullptr; idregion = nullptr; + varflag = 0; + vstr = xstr = ystr = zstr = nullptr; mode = ATOM; molfrac = nullptr; rigidflag = 0; @@ -680,6 +692,7 @@ void FixDeposit::options(int narg, char **arg) scaleflag = 1; targetflag = 0; orientflag = 0; + warnflag = 1; rx = 0.0; ry = 0.0; rz = 0.0; @@ -693,6 +706,27 @@ void FixDeposit::options(int narg, char **arg) idregion = utils::strdup(arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg], "var") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_atoms var", error); + delete[] vstr; + vstr = utils::strdup(arg[iarg + 1]); + varflag = 1; + iarg += 2; + } else if (strcmp(arg[iarg], "set") == 0) { + if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, "create_atoms set", error); + if (strcmp(arg[iarg + 1], "x") == 0) { + delete[] xstr; + xstr = utils::strdup(arg[iarg + 2]); + } else if (strcmp(arg[iarg + 1], "y") == 0) { + delete[] ystr; + ystr = utils::strdup(arg[iarg + 2]); + } else if (strcmp(arg[iarg + 1], "z") == 0) { + delete[] zstr; + zstr = utils::strdup(arg[iarg + 2]); + } else + error->all(FLERR, "Unknown create_atoms set option {}", arg[iarg + 2]); + iarg += 3; + } else if (strcmp(arg[iarg],"mol") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); int imol = atom->find_molecule(arg[iarg+1]); @@ -815,6 +849,39 @@ void FixDeposit::options(int narg, char **arg) iarg += 4; } else error->all(FLERR,"Illegal fix deposit command"); } + + // error check and further setup for variable test + + if (!vstr && (xstr || ystr || zstr)) + error->all(FLERR, "Incomplete use of variables in create_atoms command"); + if (vstr && (!xstr && !ystr && !zstr)) + error->all(FLERR, "Incomplete use of variables in create_atoms command"); + + if (varflag) { + vvar = input->variable->find(vstr); + if (vvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", vstr); + if (!input->variable->equalstyle(vvar)) + error->all(FLERR, "Variable for create_atoms is invalid style"); + + if (xstr) { + xvar = input->variable->find(xstr); + if (xvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", xstr); + if (!input->variable->internalstyle(xvar)) + error->all(FLERR, "Variable for create_atoms is invalid style"); + } + if (ystr) { + yvar = input->variable->find(ystr); + if (yvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", ystr); + if (!input->variable->internalstyle(yvar)) + error->all(FLERR, "Variable for create_atoms is invalid style"); + } + if (zstr) { + zvar = input->variable->find(zstr); + if (zvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", zstr); + if (!input->variable->internalstyle(zvar)) + error->all(FLERR, "Variable for create_atoms is invalid style"); + } + } } /* ---------------------------------------------------------------------- @@ -908,3 +975,20 @@ void *FixDeposit::extract(const char *str, int &itype) return nullptr; } + +/* ---------------------------------------------------------------------- + test a generated atom position against variable evaluation + first set x,y,z values in internal variables +------------------------------------------------------------------------- */ + +int FixDeposit::vartest(double x, double y, double z) +{ + if (xstr) input->variable->internal_set(xvar, x); + if (ystr) input->variable->internal_set(yvar, y); + if (zstr) input->variable->internal_set(zvar, z); + + double value = input->variable->compute_equal(vvar); + + if (value == 0.0) return 0; + return 1; +} diff --git a/src/fix_deposit.h b/src/fix_deposit.h index 2b866dc068..5d2824fba3 100644 --- a/src/fix_deposit.h +++ b/src/fix_deposit.h @@ -40,7 +40,8 @@ class FixDeposit : public Fix { private: int ninsert, ntype, nfreq, seed; int globalflag, localflag, maxattempt, rateflag, scaleflag, targetflag; - int mode, rigidflag, shakeflag, idnext, distflag, orientflag; + int mode, rigidflag, shakeflag, idnext, distflag, orientflag, warnflag; + int varflag, vvar, xvar, yvar, zvar; double lo, hi, deltasq, nearsq, rate, sigma; double vxlo, vxhi, vylo, vyhi, vzlo, vzhi; double xlo, xhi, ylo, yhi, zlo, zhi, xmid, ymid, zmid; @@ -48,6 +49,8 @@ class FixDeposit : public Fix { class Region *iregion; char *idregion; char *idrigid, *idshake; + char *vstr, *xstr, *ystr, *zstr; + char *xstr_copy, *ystr_copy, *zstr_copy; class Molecule **onemols; int nmol, natom_max; @@ -64,6 +67,7 @@ class FixDeposit : public Fix { void find_maxid(); void options(int, char **); + int vartest(double, double, double); // evaluate a variable with new atom position }; } // namespace LAMMPS_NS From d4ee6f476c0c29dc91b3f7749c41495d1e742e8f Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 29 Oct 2023 16:13:12 -0400 Subject: [PATCH 310/417] var/set docs for fix_deposit --- doc/src/fix_deposit.rst | 48 ++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index 08711001c5..72db67343e 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -17,12 +17,16 @@ Syntax * M = insert a single atom or molecule every M steps * seed = random # seed (positive integer) * one or more keyword/value pairs may be appended to args -* keyword = *region* or *id* or *global* or *local* or *near* or *gaussian* or *attempt* or *rate* or *vx* or *vy* or *vz* or *target* or *mol* or *molfrac* or *rigid* or *shake* or *orient* or *units* +* keyword = *region* or *var* or *set* or *id* or *global* or *local* or *near* or *gaussian* or *attempt* or *rate* or *vx* or *vy* or *vz* or *target* or *mol* or *molfrac* or *rigid* or *shake* or *orient* or *units* .. parsed-literal:: *region* value = region-ID region-ID = ID of region to use as insertion volume + *var* value = name = variable name to evaluate for test of atom creation + *set* values = dim name + dim = *x* or *y* or *z* + name = name of variable to set with x, y, or z atom position *id* value = *max* or *next* max = atom ID for new atom(s) is max ID of all current atoms plus one next = atom ID for new atom(s) increments by one for every deposition @@ -193,17 +197,19 @@ simulation that is "nearby" the chosen x,y position. In this context, particles is less than the *delta* setting. Once a trial x,y,z position has been selected, the insertion is only -performed if no current atom in the simulation is within a distance R -of any atom in the new particle, including the effect of periodic -boundary conditions if applicable. R is defined by the *near* -keyword. Note that the default value for R is 0.0, which will allow -atoms to strongly overlap if you are inserting where other atoms are -present. This distance test is performed independently for each atom -in an inserted molecule, based on the randomly rotated configuration -of the molecule. If this test fails, a new random position within the -insertion volume is chosen and another trial is made. Up to Q -attempts are made. If the particle is not successfully inserted, -LAMMPS prints a warning message. +performed if both the *near* and *var* keywords are satisfied (see below). +If either the *near* or the *var* keyword is not satisfied, a new random +position within the insertion volume is chosen and another trial is made. +Up to Q attempts are made. If one or more particle insertions are not +successful, LAMMPS prints a warning message. + +The *near* keyword ensures that no current atom in the simulation is within +a distance R of any atom in the new particle, including the effect of +periodic boundary conditions if applicable. Note that the default value +for R is 0.0, which will allow atoms to strongly overlap if you are +inserting where other atoms are present. This distance test is performed +independently for each atom in an inserted molecule, based on the randomly +rotated configuration of the molecule. .. note:: @@ -214,6 +220,24 @@ LAMMPS prints a warning message. existing particle. LAMMPS will issue a warning if R is smaller than this value, based on the radii of existing and inserted particles. +The *var* and *set* keywords can be used together to provide a criterion +for accepting or rejecting the addition of an individual atom, based on its +coordinates. The *name* specified for the *var* keyword is the name of an +:doc:`equal-style variable ` that should evaluate to a zero or +non-zero value based on one or two or three variables that will store the +*x*, *y*, or *z* coordinates of an atom (one variable per coordinate). If +used, these other variables must be :doc:`internal-style variables +` defined in the input script; their initial numeric value can be +anything. They must be internal-style variables, because this command +resets their values directly. The *set* keyword is used to identify the +names of these other variables, one variable for the *x*-coordinate of a +created atom, one for *y*, and one for *z*. When an atom is created, its +:math:`(x,y,z)` coordinates become the values for any *set* variable that +is defined. The *var* variable is then evaluated. If the returned value +is 0.0, the atom is not created. If it is non-zero, the atom is created. +For an example of how to use these keywords, see the +:doc:`create_atoms `command. + The *rate* option moves the insertion volume in the z direction (3d) or y direction (2d). This enables particles to be inserted from a successively higher height over time. Note that this parameter is From f3a7ec8c55e5ae5e81d799e49b34030575a421e2 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 29 Oct 2023 16:19:11 -0400 Subject: [PATCH 311/417] copy/paste issues --- src/fix_deposit.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index 7f11987ad7..6dea4a0932 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -707,13 +707,13 @@ void FixDeposit::options(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg], "var") == 0) { - if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_atoms var", error); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "fix deposit var", error); delete[] vstr; vstr = utils::strdup(arg[iarg + 1]); varflag = 1; iarg += 2; } else if (strcmp(arg[iarg], "set") == 0) { - if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, "create_atoms set", error); + if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, "fix deposit set", error); if (strcmp(arg[iarg + 1], "x") == 0) { delete[] xstr; xstr = utils::strdup(arg[iarg + 2]); @@ -724,7 +724,7 @@ void FixDeposit::options(int narg, char **arg) delete[] zstr; zstr = utils::strdup(arg[iarg + 2]); } else - error->all(FLERR, "Unknown create_atoms set option {}", arg[iarg + 2]); + error->all(FLERR, "Unknown fix deposit set option {}", arg[iarg + 2]); iarg += 3; } else if (strcmp(arg[iarg],"mol") == 0) { @@ -853,33 +853,33 @@ void FixDeposit::options(int narg, char **arg) // error check and further setup for variable test if (!vstr && (xstr || ystr || zstr)) - error->all(FLERR, "Incomplete use of variables in create_atoms command"); + error->all(FLERR, "Incomplete use of variables in fix deposit command"); if (vstr && (!xstr && !ystr && !zstr)) - error->all(FLERR, "Incomplete use of variables in create_atoms command"); + error->all(FLERR, "Incomplete use of variables in fix deposit command"); if (varflag) { vvar = input->variable->find(vstr); - if (vvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", vstr); + if (vvar < 0) error->all(FLERR, "Variable {} for fix deposit does not exist", vstr); if (!input->variable->equalstyle(vvar)) - error->all(FLERR, "Variable for create_atoms is invalid style"); + error->all(FLERR, "Variable for fix deposit is invalid style"); if (xstr) { xvar = input->variable->find(xstr); - if (xvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", xstr); + if (xvar < 0) error->all(FLERR, "Variable {} for fix deposit does not exist", xstr); if (!input->variable->internalstyle(xvar)) - error->all(FLERR, "Variable for create_atoms is invalid style"); + error->all(FLERR, "Variable for fix deposit is invalid style"); } if (ystr) { yvar = input->variable->find(ystr); - if (yvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", ystr); + if (yvar < 0) error->all(FLERR, "Variable {} for fix deposit does not exist", ystr); if (!input->variable->internalstyle(yvar)) - error->all(FLERR, "Variable for create_atoms is invalid style"); + error->all(FLERR, "Variable for fix deposit is invalid style"); } if (zstr) { zvar = input->variable->find(zstr); - if (zvar < 0) error->all(FLERR, "Variable {} for create_atoms does not exist", zstr); + if (zvar < 0) error->all(FLERR, "Variable {} for fix deposit does not exist", zstr); if (!input->variable->internalstyle(zvar)) - error->all(FLERR, "Variable for create_atoms is invalid style"); + error->all(FLERR, "Variable for fix deposit is invalid style"); } } } From 6056941688a89796b32847bd3d23ed5fea3fd595 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Oct 2023 11:01:57 -0400 Subject: [PATCH 312/417] add pair_style nb3b/screened by Federica Lodesani --- doc/src/Commands_pair.rst | 1 + doc/src/pair_nb3b_harmonic.rst | 30 +- doc/src/pair_style.rst | 1 + examples/nb3b/PSiO.nb3b.screened | 1 + examples/nb3b/README.nb3b.screened | 41 + examples/nb3b/Table_NP.dat | 14997 ++++++++++++++++ examples/nb3b/data.NaPO3 | 6020 +++++++ examples/nb3b/in.nb3b.screened | 35 + examples/nb3b/log.30Oct23.nb3b.screened.g++.1 | 132 + examples/nb3b/log.30Oct23.nb3b.screened.g++.4 | 132 + src/.gitignore | 2 + src/MANYBODY/pair_nb3b_harmonic.cpp | 26 +- src/MANYBODY/pair_nb3b_harmonic.h | 7 +- src/MANYBODY/pair_nb3b_screened.cpp | 89 + src/MANYBODY/pair_nb3b_screened.h | 39 + 15 files changed, 21536 insertions(+), 17 deletions(-) create mode 120000 examples/nb3b/PSiO.nb3b.screened create mode 100644 examples/nb3b/README.nb3b.screened create mode 100644 examples/nb3b/Table_NP.dat create mode 100644 examples/nb3b/data.NaPO3 create mode 100644 examples/nb3b/in.nb3b.screened create mode 100644 examples/nb3b/log.30Oct23.nb3b.screened.g++.1 create mode 100644 examples/nb3b/log.30Oct23.nb3b.screened.g++.4 create mode 100644 src/MANYBODY/pair_nb3b_screened.cpp create mode 100644 src/MANYBODY/pair_nb3b_screened.h diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index 923c040aaf..1b98bbad47 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -221,6 +221,7 @@ OPT. * :doc:`multi/lucy ` * :doc:`multi/lucy/rx (k) ` * :doc:`nb3b/harmonic ` + * :doc:`nb3b/screened ` * :doc:`nm/cut (o) ` * :doc:`nm/cut/coul/cut (o) ` * :doc:`nm/cut/coul/long (o) ` diff --git a/doc/src/pair_nb3b_harmonic.rst b/doc/src/pair_nb3b_harmonic.rst index 203c707ec0..f4e254b40c 100644 --- a/doc/src/pair_nb3b_harmonic.rst +++ b/doc/src/pair_nb3b_harmonic.rst @@ -1,14 +1,20 @@ .. index:: pair_style nb3b/harmonic +.. index:: pair_style nb3b/screened pair_style nb3b/harmonic command ================================ +pair_style nb3b/screened command +================================ + Syntax """""" .. code-block:: LAMMPS - pair_style nb3b/harmonic + pair_style style + +* style = *nb3b/harmonic* or *nb3b/screened* Examples """""""" @@ -18,10 +24,14 @@ Examples pair_style nb3b/harmonic pair_coeff * * MgOH.nb3bharmonic Mg O H + pair_style nb3b/screened + pair_coeff * * PO.nb3b.screened P NULL O + pair_coeff * * SiOH.nb3b.screened Si O H + Description """"""""""" -This pair style computes a non-bonded 3-body harmonic potential for the +The pair style *nb3b/harmonic* computes a non-bonded 3-body harmonic potential for the energy E of a system of atoms as .. math:: @@ -33,7 +43,17 @@ prefactor. Note that the usual 1/2 factor is included in *K*\ . The form of the potential is identical to that used in angle_style *harmonic*, but in this case, the atoms do not need to be explicitly bonded. -Only a single pair_coeff command is used with this style which +Style *nb3b/screened* adds an additional exponentially decaying factor to +the harmonic term, given by + +.. math:: + + E = K (\theta - \theta_0)^2 \exp \left(- \frac{r_{ij}}{\rho_{ij}} - \frac{r_{ik}}{\rho_{ik}} \right) + +where :math:`\rho_ij` and :math:`\rho_ik` are the screening factors along +the two bonds. Note that the usual 1/2 factor is included in *K*. + +Only a single pair_coeff command is used with these styles which specifies a potential file with parameters for specified elements. These are mapped to LAMMPS atom types by specifying N additional arguments after the filename in the pair_coeff command, where N is the @@ -61,8 +81,8 @@ type 4 to the C element in the potential file. If a mapping value is specified as NULL, the mapping is not performed. This can be used when the 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. An example of a pair_coeff command for use with the -*hybrid* pair style is: +other potentials. Two examples of pair_coeff command for use with the +*hybrid* pair style are: .. code-block:: LAMMPS diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index 494a26aacf..9c3a65514a 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -298,6 +298,7 @@ accelerated styles exist. * :doc:`multi/lucy ` - DPD potential with density-dependent force * :doc:`multi/lucy/rx ` - reactive DPD potential with density-dependent force * :doc:`nb3b/harmonic ` - non-bonded 3-body harmonic potential +* :doc:`nb3b/screened ` - non-bonded 3-body screened harmonic potential * :doc:`nm/cut ` - N-M potential * :doc:`nm/cut/coul/cut ` - N-M potential with cutoff Coulomb * :doc:`nm/cut/coul/long ` - N-M potential with long-range Coulomb diff --git a/examples/nb3b/PSiO.nb3b.screened b/examples/nb3b/PSiO.nb3b.screened new file mode 120000 index 0000000000..e5b381f0a3 --- /dev/null +++ b/examples/nb3b/PSiO.nb3b.screened @@ -0,0 +1 @@ +../../potentials/PSiO.nb3b.screened \ No newline at end of file diff --git a/examples/nb3b/README.nb3b.screened b/examples/nb3b/README.nb3b.screened new file mode 100644 index 0000000000..c0859c035a --- /dev/null +++ b/examples/nb3b/README.nb3b.screened @@ -0,0 +1,41 @@ +Additional information for pair style nb3b/screened example. + +This input uses the BMP potential (Bertani, M., Menziani, M. C., +& Pedone, A. (2021). Improved empirical force field for multicomponent +oxide glasses and crystals. Physical Review Materials, 5(4), 045602). + +The interatomic potential is obtained by mixing coulombic interactions +with other two-body functions (modified Morse and Buckingham), with a +three-body interaction (screened harmonic function). + +The modified Morse is introduce with Tables and it is combined with +Buckingham and coul/dsf to complete the two-body force field. +The three-body interaction is computed with pair style nb3b/screened +only for P-O-P angle. With the pair_coeff command the atom types +involved in the three-body potential are specified: + +pair_coeff * * nb3b/screened PSiO.nb3b.screened P NULL O + +And they appear in the same order as in the data file: +type 1: P; +type 2: Na, not involved in the three body so indicated as NULL; +type 3: O. + +In the potential file PSiO.nb3b.screened there are the parameters of +all permutations of the required atom types. In the example, also +parameters for Si permutations appear but they are not employed in +the current case. + +# i j k K theta0 rho cutoff +O P P 65.0 109.47 1.0 3.3 +O P Si 120.0 109.47 1.0 0.000 +O P O 0.000 0.000 1.0 0.000 +O Si P 120.0 109.47 1.0 0.000 +O Si Si 25.0 109.47 1.0 3.3 +(...) + +The rho value must be always higher than 0.0. Cutoff and rho are extracted +only from symmetric interactions (e.g. O P P, O Si Si), because of that +you do not need to specify those values for the asymmetric interactions +(e.g. O P Si and O Si P). + diff --git a/examples/nb3b/Table_NP.dat b/examples/nb3b/Table_NP.dat new file mode 100644 index 0000000000..7e3efd836c --- /dev/null +++ b/examples/nb3b/Table_NP.dat @@ -0,0 +1,14997 @@ +Pair_P-O +N 4995 + +1 0.01 1.0000000e+24 1.2000000e+27 +2 0.012 1.1215665e+23 1.1215665e+26 +3 0.014 1.7638578e+22 1.5118781e+25 +4 0.016 3.5527137e+21 2.6645353e+24 +5 0.018 8.6443022e+20 5.7628681e+23 +6 0.02 2.4414063e+20 1.4648438e+23 +7 0.022 7.7790727e+19 4.2431306e+22 +8 0.024 2.7381996e+19 1.3690998e+22 +9 0.026 1.0479000e+19 4.8364614e+21 +10 0.028 4.3062935e+18 1.8455543e+21 +11 0.03 1.8816764e+18 7.5267057e+20 +12 0.032 8.6736174e+17 3.2526065e+20 +13 0.034 4.1903760e+17 1.4789562e+20 +14 0.036 2.1104253e+17 7.0347511e+19 +15 0.038 1.1030542e+17 3.4833290e+19 +16 0.04 5.9604645e+16 1.7881393e+19 +17 0.042 3.3190097e+16 9.4828847e+18 +18 0.044 1.8991877e+16 5.1796027e+18 +19 0.046 1.1140534e+16 2.9062263e+18 +20 0.048 6.6850576e+15 1.6712644e+18 +21 0.05 4.0960000e+15 9.8304000e+17 +22 0.052 2.5583495e+15 5.9038835e+17 +23 0.054 1.6265780e+15 3.6146177e+17 +24 0.056 1.0513412e+15 2.2528740e+17 +25 0.058 6.9002381e+14 1.4276355e+17 +26 0.06 4.5939366e+14 9.1878732e+16 +27 0.062 3.0995577e+14 5.9991439e+16 +28 0.064 2.1175824e+14 3.9704669e+16 +29 0.066 1.4637698e+14 2.6613996e+16 +30 0.068 1.0230410e+14 1.8053665e+16 +31 0.07 7.2247616e+13 1.2385306e+16 +32 0.072 5.1524056e+13 8.5873427e+15 +33 0.074 3.7086800e+13 6.0140757e+15 +34 0.076 2.6930033e+13 4.2521105e+15 +35 0.078 1.9718087e+13 3.0335518e+15 +36 0.08 1.4551915e+13 2.1827873e+15 +37 0.082 1.0820162e+13 1.5834384e+15 +38 0.084 8.1030509e+12 1.1575787e+15 +39 0.086 6.1096817e+12 8.5251373e+14 +40 0.088 4.6366887e+12 6.3227572e+14 +41 0.09 3.5407062e+12 4.7209415e+14 +42 0.092 2.7198570e+12 3.5476396e+14 +43 0.094 2.1011921e+12 2.6823729e+14 +44 0.096 1.6320941e+12 2.0401177e+14 +45 0.098 1.2743452e+12 1.5604227e+14 +46 0.1 1.0000000e+12 1.2000000e+14 +47 0.102 7.8849318e+11 9.2763903e+13 +48 0.104 6.2459705e+11 7.2068890e+13 +49 0.106 4.9696937e+11 5.6260683e+13 +50 0.108 3.9711376e+11 4.4123751e+13 +51 0.11 3.1863082e+11 3.4759726e+13 +52 0.112 2.5667510e+11 2.7500903e+13 +53 0.114 2.0755911e+11 2.1848327e+13 +54 0.116 1.6846285e+11 1.7427191e+13 +55 0.118 1.3721953e+11 1.3954528e+13 +56 0.12 1.1215666e+11 1.1215666e+13 +57 0.122 9.1977596e+10 9.0469762e+12 +58 0.124 7.5672800e+10 7.3231738e+12 +59 0.126 6.2453027e+10 5.9479069e+12 +60 0.128 5.1698793e+10 4.8467614e+12 +61 0.13 4.2921987e+10 3.9620292e+12 +62 0.132 3.5736571e+10 3.2487788e+12 +63 0.134 2.9836129e+10 2.6718918e+12 +64 0.136 2.4976592e+10 2.2038166e+12 +65 0.138 2.0962885e+10 1.8228592e+12 +66 0.14 1.7638582e+10 1.5118781e+12 +67 0.142 1.4877844e+10 1.2572822e+12 +68 0.144 1.2579119e+10 1.0482596e+12 +69 0.146 1.0660213e+10 8.7618161e+11 +70 0.148 9.0543985e+09 7.3414012e+11 +71 0.15 7.7073505e+09 6.1658775e+11 +72 0.152 6.5747191e+09 5.1905648e+11 +73 0.154 5.6201984e+09 4.3793726e+11 +74 0.156 4.8139898e+09 3.7030663e+11 +75 0.158 4.1315722e+09 3.1379003e+11 +76 0.16 3.5527174e+09 2.6645355e+11 +77 0.162 3.0606971e+09 2.2671805e+11 +78 0.164 2.6416448e+09 1.9329084e+11 +79 0.166 2.2840396e+09 1.6511105e+11 +80 0.168 1.9782875e+09 1.4130601e+11 +81 0.17 1.7163815e+09 1.2115611e+11 +82 0.172 1.4916250e+09 1.0406664e+11 +83 0.174 1.2984050e+09 8.9544952e+10 +84 0.176 1.1320075e+09 7.7182113e+10 +85 0.178 9.8846536e+08 6.6637904e+10 +86 0.18 8.6443356e+08 5.7628699e+10 +87 0.182 7.5708604e+08 4.9917561e+10 +88 0.184 6.6403086e+08 4.3306164e+10 +89 0.186 5.8323970e+08 3.7628176e+10 +90 0.188 5.1298955e+08 3.2743826e+10 +91 0.19 4.5181416e+08 2.8535447e+10 +92 0.192 3.9846362e+08 2.4903797e+10 +93 0.194 3.5187067e+08 2.1765021e+10 +94 0.196 3.1112251e+08 1.9048145e+10 +95 0.198 2.7543715e+08 1.6692992e+10 +96 0.2 2.4414363e+08 1.4648453e+10 +97 0.202 2.1666539e+08 1.2871050e+10 +98 0.204 1.9250616e+08 1.1323734e+10 +99 0.206 1.7123824e+08 9.9748885e+09 +100 0.208 1.5249240e+08 8.7974871e+09 +101 0.21 1.3594949e+08 7.7683942e+09 +102 0.212 1.2133324e+08 6.8677740e+09 +103 0.214 1.0840415e+08 6.0785955e+09 +104 0.216 9.6954366e+07 5.3862146e+09 +105 0.218 8.6803206e+07 4.7780219e+09 +106 0.22 7.7793435e+07 4.2431448e+09 +107 0.222 6.9788037e+07 3.7721956e+09 +108 0.224 6.2667469e+07 3.3570578e+09 +109 0.226 5.6327303e+07 2.9907048e+09 +110 0.228 5.0676205e+07 2.6670457e+09 +111 0.23 4.5634197e+07 2.3807941e+09 +112 0.232 4.1131166e+07 2.1273560e+09 +113 0.234 3.7105574e+07 1.9027342e+09 +114 0.236 3.3503349e+07 1.7034467e+09 +115 0.238 3.0276930e+07 1.5264567e+09 +116 0.24 2.7384433e+07 1.3691126e+09 +117 0.242 2.4788934e+07 1.2290965e+09 +118 0.244 2.2457853e+07 1.1043798e+09 +119 0.246 2.0362405e+07 9.9318533e+08 +120 0.248 1.8477140e+07 8.9395442e+08 +121 0.25 1.6779528e+07 8.0531856e+08 +122 0.252 1.5249607e+07 7.2607491e+08 +123 0.254 1.3869675e+07 6.5516523e+08 +124 0.256 1.2624014e+07 5.9165749e+08 +125 0.258 1.1498660e+07 5.3473001e+08 +126 0.26 1.0481193e+07 4.8365770e+08 +127 0.262 9.5605547e+06 4.3780006e+08 +128 0.264 8.7268950e+06 3.9659077e+08 +129 0.266 7.9714281e+06 3.5952866e+08 +130 0.268 7.2863127e+06 3.2616976e+08 +131 0.27 6.6645437e+06 2.9612046e+08 +132 0.272 6.0998582e+06 2.6903144e+08 +133 0.274 5.5866520e+06 2.4459243e+08 +134 0.276 5.1199063e+06 2.2252763e+08 +135 0.278 4.6951229e+06 2.0259162e+08 +136 0.28 4.3082669e+06 1.8456585e+08 +137 0.282 3.9557163e+06 1.6825557e+08 +138 0.284 3.6342172e+06 1.5348704e+08 +139 0.286 3.3408441e+06 1.4010516e+08 +140 0.288 3.0729648e+06 1.2797137e+08 +141 0.29 2.8282094e+06 1.1696179e+08 +142 0.292 2.6044424e+06 1.0696555e+08 +143 0.294 2.3997381e+06 9.7883372e+07 +144 0.296 2.2123590e+06 8.9626295e+07 +145 0.298 2.0407362e+06 8.2114523e+07 +146 0.3 1.8834520e+06 7.5276442e+07 +147 0.302 1.7392243e+06 6.9047731e+07 +148 0.304 1.6068935e+06 6.3370576e+07 +149 0.306 1.4854091e+06 5.8192979e+07 +150 0.308 1.3738198e+06 5.3468137e+07 +151 0.31 1.2712629e+06 4.9153895e+07 +152 0.312 1.1769559e+06 4.5212259e+07 +153 0.314 1.0901884e+06 4.1608962e+07 +154 0.316 1.0103152e+06 3.8313077e+07 +155 0.318 9.3674984e+05 3.5296676e+07 +156 0.32 8.6895905e+05 3.2534519e+07 +157 0.322 8.0645754e+05 3.0003783e+07 +158 0.324 7.4880345e+05 2.7683819e+07 +159 0.326 6.9559425e+05 2.5555930e+07 +160 0.328 6.4646301e+05 2.3603178e+07 +161 0.33 6.0107505e+05 2.1810208e+07 +162 0.332 5.5912496e+05 2.0163095e+07 +163 0.334 5.2033388e+05 1.8649199e+07 +164 0.336 4.8444703e+05 1.7257042e+07 +165 0.338 4.5123153e+05 1.5976195e+07 +166 0.34 4.2047439e+05 1.4797176e+07 +167 0.342 3.9198071e+05 1.3711361e+07 +168 0.344 3.6557206e+05 1.2710900e+07 +169 0.346 3.4108498e+05 1.1788644e+07 +170 0.348 3.1836970e+05 1.0938079e+07 +171 0.35 2.9728884e+05 1.0153268e+07 +172 0.352 2.7771641e+05 9.4287926e+06 +173 0.354 2.5953675e+05 8.7597111e+06 +174 0.356 2.4264366e+05 8.1415096e+06 +175 0.358 2.2693955e+05 7.5700648e+06 +176 0.36 2.1233475e+05 7.0416079e+06 +177 0.362 1.9874677e+05 6.5526923e+06 +178 0.364 1.8609972e+05 6.1001647e+06 +179 0.366 1.7432378e+05 5.6811386e+06 +180 0.368 1.6335460e+05 5.2929703e+06 +181 0.37 1.5313294e+05 4.9332376e+06 +182 0.372 1.4360418e+05 4.5997201e+06 +183 0.374 1.3471795e+05 4.2903813e+06 +184 0.376 1.2642779e+05 4.0033525e+06 +185 0.378 1.1869081e+05 3.7369184e+06 +186 0.38 1.1146743e+05 3.4895036e+06 +187 0.382 1.0472108e+05 3.2596606e+06 +188 0.384 9.8417967e+04 3.0460588e+06 +189 0.386 9.2526840e+04 2.8474745e+06 +190 0.388 8.7018810e+04 2.6627820e+06 +191 0.39 8.1867144e+04 2.4909450e+06 +192 0.392 7.7047098e+04 2.3310093e+06 +193 0.394 7.2535760e+04 2.1820959e+06 +194 0.396 6.8311908e+04 2.0433947e+06 +195 0.398 6.4355872e+04 1.9141588e+06 +196 0.4 6.0649422e+04 1.7936994e+06 +197 0.402 5.7175649e+04 1.6813806e+06 +198 0.404 5.3918865e+04 1.5766157e+06 +199 0.406 5.0864512e+04 1.4788629e+06 +200 0.408 4.7999073e+04 1.3876214e+06 +201 0.41 4.5309995e+04 1.3024286e+06 +202 0.412 4.2785613e+04 1.2228567e+06 +203 0.414 4.0415085e+04 1.1485100e+06 +204 0.416 3.8188334e+04 1.0790225e+06 +205 0.418 3.6095982e+04 1.0140553e+06 +206 0.42 3.4129309e+04 9.5329464e+05 +207 0.422 3.2280194e+04 8.9644986e+05 +208 0.424 3.0541078e+04 8.4325165e+05 +209 0.426 2.8904923e+04 7.9345038e+05 +210 0.428 2.7365167e+04 7.4681454e+05 +211 0.43 2.5915698e+04 7.0312938e+05 +212 0.432 2.4550816e+04 6.6219564e+05 +213 0.434 2.3265205e+04 6.2382833e+05 +214 0.436 2.2053906e+04 5.8785568e+05 +215 0.438 2.0912292e+04 5.5411812e+05 +216 0.44 1.9836043e+04 5.2246739e+05 +217 0.442 1.8821123e+04 4.9276565e+05 +218 0.444 1.7863766e+04 4.6488477e+05 +219 0.446 1.6960450e+04 4.3870552e+05 +220 0.448 1.6107884e+04 4.1411700e+05 +221 0.45 1.5302991e+04 3.9101596e+05 +222 0.452 1.4542893e+04 3.6930630e+05 +223 0.454 1.3824898e+04 3.4889848e+05 +224 0.456 1.3146487e+04 3.2970912e+05 +225 0.458 1.2505301e+04 3.1166047e+05 +226 0.46 1.1899133e+04 2.9468009e+05 +227 0.462 1.1325913e+04 2.7870041e+05 +228 0.464 1.0783706e+04 2.6365840e+05 +229 0.466 1.0270694e+04 2.4949525e+05 +230 0.468 9.7851757e+03 2.3615606e+05 +231 0.47 9.3255547e+03 2.2358960e+05 +232 0.472 8.8903341e+03 2.1174800e+05 +233 0.474 8.4781093e+03 2.0058656e+05 +234 0.476 8.0875623e+03 1.9006348e+05 +235 0.478 7.7174559e+03 1.8013972e+05 +236 0.48 7.3666283e+03 1.7077877e+05 +237 0.482 7.0339884e+03 1.6194648e+05 +238 0.484 6.7185113e+03 1.5361090e+05 +239 0.486 6.4192336e+03 1.4574213e+05 +240 0.488 6.1352502e+03 1.3831220e+05 +241 0.49 5.8657098e+03 1.3129491e+05 +242 0.492 5.6098119e+03 1.2466571e+05 +243 0.494 5.3668036e+03 1.1840163e+05 +244 0.496 5.1359764e+03 1.1248112e+05 +245 0.498 4.9166635e+03 1.0688400e+05 +246 0.5 4.7082374e+03 1.0159134e+05 +247 0.502 4.5101071e+03 9.6585398e+04 +248 0.504 4.3217158e+03 9.1849521e+04 +249 0.506 4.1425394e+03 8.7368091e+04 +250 0.508 3.9720836e+03 8.3126447e+04 +251 0.51 3.8098829e+03 7.9110830e+04 +252 0.512 3.6554982e+03 7.5308317e+04 +253 0.514 3.5085157e+03 7.1706774e+04 +254 0.516 3.3685448e+03 6.8294800e+04 +255 0.518 3.2352172e+03 6.5061683e+04 +256 0.52 3.1081855e+03 6.1997355e+04 +257 0.522 2.9871216e+03 5.9092350e+04 +258 0.524 2.8717159e+03 5.6337769e+04 +259 0.526 2.7616759e+03 5.3725239e+04 +260 0.528 2.6567255e+03 5.1246885e+04 +261 0.53 2.5566038e+03 4.8895296e+04 +262 0.532 2.4610644e+03 4.6663498e+04 +263 0.534 2.3698744e+03 4.4544923e+04 +264 0.536 2.2828134e+03 4.2533388e+04 +265 0.538 2.1996733e+03 4.0623069e+04 +266 0.54 2.1202573e+03 3.8808479e+04 +267 0.542 2.0443791e+03 3.7084450e+04 +268 0.544 1.9718624e+03 3.5446108e+04 +269 0.546 1.9025406e+03 3.3888860e+04 +270 0.548 1.8362558e+03 3.2408375e+04 +271 0.55 1.7728586e+03 3.1000569e+04 +272 0.552 1.7122076e+03 2.9661588e+04 +273 0.554 1.6541688e+03 2.8387797e+04 +274 0.556 1.5986153e+03 2.7175766e+04 +275 0.558 1.5454267e+03 2.6022256e+04 +276 0.56 1.4944893e+03 2.4924210e+04 +277 0.562 1.4456948e+03 2.3878740e+04 +278 0.564 1.3989411e+03 2.2883121e+04 +279 0.566 1.3541309e+03 2.1934775e+04 +280 0.568 1.3111721e+03 2.1031270e+04 +281 0.57 1.2699774e+03 2.0170304e+04 +282 0.572 1.2304640e+03 1.9349703e+04 +283 0.574 1.1925531e+03 1.8567412e+04 +284 0.576 1.1561701e+03 1.7821487e+04 +285 0.578 1.1212441e+03 1.7110088e+04 +286 0.58 1.0877079e+03 1.6431475e+04 +287 0.582 1.0554974e+03 1.5784005e+04 +288 0.584 1.0245521e+03 1.5166117e+04 +289 0.586 9.9481424e+02 1.4576339e+04 +290 0.588 9.6622897e+02 1.4013273e+04 +291 0.59 9.3874422e+02 1.3475599e+04 +292 0.592 9.1231048e+02 1.2962064e+04 +293 0.594 8.8688066e+02 1.2471482e+04 +294 0.596 8.6241000e+02 1.2002731e+04 +295 0.598 8.3885590e+02 1.1554744e+04 +296 0.6 8.1617785e+02 1.1126512e+04 +297 0.602 7.9433732e+02 1.0717080e+04 +298 0.604 7.7329761e+02 1.0325540e+04 +299 0.606 7.5302381e+02 9.9510306e+03 +300 0.608 7.3348267e+02 9.5927373e+03 +301 0.61 7.1464256e+02 9.2498855e+03 +302 0.612 6.9647333e+02 8.9217407e+03 +303 0.614 6.7894626e+02 8.6076059e+03 +304 0.616 6.6203401e+02 8.3068195e+03 +305 0.618 6.4571050e+02 8.0187534e+03 +306 0.62 6.2995091e+02 7.7428113e+03 +307 0.622 6.1473155e+02 7.4784268e+03 +308 0.624 6.0002986e+02 7.2250618e+03 +309 0.626 5.8582430e+02 6.9822055e+03 +310 0.628 5.7209436e+02 6.7493721e+03 +311 0.63 5.5882044e+02 6.5261002e+03 +312 0.632 5.4598387e+02 6.3119513e+03 +313 0.634 5.3356683e+02 6.1065083e+03 +314 0.636 5.2155230e+02 5.9093748e+03 +315 0.638 5.0992404e+02 5.7201738e+03 +316 0.64 4.9866656e+02 5.5385467e+03 +317 0.642 4.8776504e+02 5.3641523e+03 +318 0.644 4.7720534e+02 5.1966662e+03 +319 0.646 4.6697397e+02 5.0357795e+03 +320 0.648 4.5705802e+02 4.8811983e+03 +321 0.65 4.4744516e+02 4.7326428e+03 +322 0.652 4.3812361e+02 4.5898466e+03 +323 0.654 4.2908210e+02 4.4525561e+03 +324 0.656 4.2030988e+02 4.3205297e+03 +325 0.658 4.1179663e+02 4.1935373e+03 +326 0.66 4.0353252e+02 4.0713597e+03 +327 0.662 3.9550812e+02 3.9537881e+03 +328 0.664 3.8771443e+02 3.8406234e+03 +329 0.666 3.8014282e+02 3.7316760e+03 +330 0.668 3.7278503e+02 3.6267650e+03 +331 0.67 3.6563318e+02 3.5257179e+03 +332 0.672 3.5867970e+02 3.4283706e+03 +333 0.674 3.5191734e+02 3.3345660e+03 +334 0.676 3.4533917e+02 3.2441547e+03 +335 0.678 3.3893855e+02 3.1569940e+03 +336 0.68 3.3270912e+02 3.0729478e+03 +337 0.682 3.2664477e+02 2.9918861e+03 +338 0.684 3.2073967e+02 2.9136850e+03 +339 0.686 3.1498820e+02 2.8382261e+03 +340 0.688 3.0938501e+02 2.7653965e+03 +341 0.69 3.0392494e+02 2.6950881e+03 +342 0.692 2.9860304e+02 2.6271981e+03 +343 0.694 2.9341460e+02 2.5616278e+03 +344 0.696 2.8835505e+02 2.4982834e+03 +345 0.698 2.8342004e+02 2.4370750e+03 +346 0.7 2.7860538e+02 2.3779167e+03 +347 0.702 2.7390706e+02 2.3207266e+03 +348 0.704 2.6932122e+02 2.2654260e+03 +349 0.706 2.6484415e+02 2.2119402e+03 +350 0.708 2.6047229e+02 2.1601974e+03 +351 0.71 2.5620224e+02 2.1101290e+03 +352 0.712 2.5203070e+02 2.0616695e+03 +353 0.714 2.4795453e+02 2.0147561e+03 +354 0.716 2.4397069e+02 1.9693289e+03 +355 0.718 2.4007626e+02 1.9253304e+03 +356 0.72 2.3626845e+02 1.8827057e+03 +357 0.722 2.3254456e+02 1.8414021e+03 +358 0.724 2.2890200e+02 1.8013694e+03 +359 0.726 2.2533827e+02 1.7625593e+03 +360 0.728 2.2185098e+02 1.7249256e+03 +361 0.73 2.1843781e+02 1.6884242e+03 +362 0.732 2.1509655e+02 1.6530127e+03 +363 0.734 2.1182506e+02 1.6186505e+03 +364 0.736 2.0862128e+02 1.5852988e+03 +365 0.738 2.0548322e+02 1.5529203e+03 +366 0.74 2.0240897e+02 1.5214794e+03 +367 0.742 1.9939670e+02 1.4909417e+03 +368 0.744 1.9644462e+02 1.4612746e+03 +369 0.746 1.9355104e+02 1.4324465e+03 +370 0.748 1.9071430e+02 1.4044273e+03 +371 0.75 1.8793281e+02 1.3771880e+03 +372 0.752 1.8520504e+02 1.3507010e+03 +373 0.754 1.8252952e+02 1.3249395e+03 +374 0.756 1.7990482e+02 1.2998781e+03 +375 0.758 1.7732956e+02 1.2754921e+03 +376 0.76 1.7480242e+02 1.2517582e+03 +377 0.762 1.7232211e+02 1.2286536e+03 +378 0.764 1.6988740e+02 1.2061568e+03 +379 0.766 1.6749709e+02 1.1842468e+03 +380 0.768 1.6515003e+02 1.1629037e+03 +381 0.77 1.6284511e+02 1.1421083e+03 +382 0.772 1.6058125e+02 1.1218421e+03 +383 0.774 1.5835740e+02 1.1020873e+03 +384 0.776 1.5617257e+02 1.0828270e+03 +385 0.778 1.5402577e+02 1.0640447e+03 +386 0.78 1.5191608e+02 1.0457247e+03 +387 0.782 1.4984258e+02 1.0278519e+03 +388 0.784 1.4780438e+02 1.0104117e+03 +389 0.786 1.4580065e+02 9.9339015e+02 +390 0.788 1.4383055e+02 9.7677373e+02 +391 0.79 1.4189329e+02 9.6054951e+02 +392 0.792 1.3998810e+02 9.4470503e+02 +393 0.794 1.3811423e+02 9.2922831e+02 +394 0.796 1.3627095e+02 9.1410780e+02 +395 0.798 1.3445757e+02 8.9933239e+02 +396 0.8 1.3267340e+02 8.8489139e+02 +397 0.802 1.3091779e+02 8.7077450e+02 +398 0.804 1.2919009e+02 8.5697181e+02 +399 0.806 1.2748970e+02 8.4347376e+02 +400 0.808 1.2581600e+02 8.3027116e+02 +401 0.81 1.2416842e+02 8.1735514e+02 +402 0.812 1.2254639e+02 8.0471716e+02 +403 0.814 1.2094937e+02 7.9234898e+02 +404 0.816 1.1937682e+02 7.8024267e+02 +405 0.818 1.1782823e+02 7.6839058e+02 +406 0.82 1.1630310e+02 7.5678534e+02 +407 0.822 1.1480093e+02 7.4541982e+02 +408 0.824 1.1332126e+02 7.3428717e+02 +409 0.826 1.1186363e+02 7.2338077e+02 +410 0.828 1.1042759e+02 7.1269422e+02 +411 0.83 1.0901271e+02 7.0222137e+02 +412 0.832 1.0761857e+02 6.9195627e+02 +413 0.834 1.0624475e+02 6.8189317e+02 +414 0.836 1.0489086e+02 6.7202654e+02 +415 0.838 1.0355652e+02 6.6235100e+02 +416 0.84 1.0224134e+02 6.5286141e+02 +417 0.842 1.0094495e+02 6.4355275e+02 +418 0.844 9.9667008e+01 6.3442021e+02 +419 0.846 9.8407157e+01 6.2545913e+02 +420 0.848 9.7165060e+01 6.1666499e+02 +421 0.85 9.5940388e+01 6.0803343e+02 +422 0.852 9.4732821e+01 5.9956026e+02 +423 0.854 9.3542044e+01 5.9124140e+02 +424 0.856 9.2367755e+01 5.8307290e+02 +425 0.858 9.1209655e+01 5.7505097e+02 +426 0.86 9.0067456e+01 5.6717191e+02 +427 0.862 8.8940874e+01 5.5943217e+02 +428 0.864 8.7829636e+01 5.5182828e+02 +429 0.866 8.6733473e+01 5.4435691e+02 +430 0.868 8.5652123e+01 5.3701484e+02 +431 0.87 8.4585330e+01 5.2979891e+02 +432 0.872 8.3532845e+01 5.2270612e+02 +433 0.874 8.2494425e+01 5.1573352e+02 +434 0.876 8.1469832e+01 5.0887826e+02 +435 0.878 8.0458836e+01 5.0213758e+02 +436 0.88 7.9461208e+01 4.9550883e+02 +437 0.882 7.8476727e+01 4.8898941e+02 +438 0.884 7.7505179e+01 4.8257680e+02 +439 0.886 7.6546351e+01 4.7626858e+02 +440 0.888 7.5600036e+01 4.7006239e+02 +441 0.89 7.4666034e+01 4.6395593e+02 +442 0.892 7.3744148e+01 4.5794699e+02 +443 0.894 7.2834183e+01 4.5203342e+02 +444 0.896 7.1935952e+01 4.4621311e+02 +445 0.898 7.1049270e+01 4.4048405e+02 +446 0.9 7.0173956e+01 4.3484425e+02 +447 0.902 6.9309834e+01 4.2929182e+02 +448 0.904 6.8456732e+01 4.2382488e+02 +449 0.906 6.7614479e+01 4.1844165e+02 +450 0.908 6.6782911e+01 4.1314035e+02 +451 0.91 6.5961864e+01 4.0791929e+02 +452 0.912 6.5151181e+01 4.0277682e+02 +453 0.914 6.4350706e+01 3.9771133e+02 +454 0.916 6.3560285e+01 3.9272124e+02 +455 0.918 6.2779771e+01 3.8780504e+02 +456 0.92 6.2009017e+01 3.8296125e+02 +457 0.922 6.1247879e+01 3.7818844e+02 +458 0.924 6.0496217e+01 3.7348519e+02 +459 0.926 5.9753893e+01 3.6885016e+02 +460 0.928 5.9020772e+01 3.6428200e+02 +461 0.93 5.8296721e+01 3.5977945e+02 +462 0.932 5.7581611e+01 3.5534122e+02 +463 0.934 5.6875314e+01 3.5096611e+02 +464 0.936 5.6177705e+01 3.4665292e+02 +465 0.938 5.5488662e+01 3.4240050e+02 +466 0.94 5.4808064e+01 3.3820770e+02 +467 0.942 5.4135792e+01 3.3407344e+02 +468 0.944 5.3471731e+01 3.2999662e+02 +469 0.946 5.2815768e+01 3.2597622e+02 +470 0.948 5.2167790e+01 3.2201121e+02 +471 0.95 5.1527687e+01 3.1810059e+02 +472 0.952 5.0895352e+01 3.1424339e+02 +473 0.954 5.0270678e+01 3.1043867e+02 +474 0.956 4.9653563e+01 3.0668550e+02 +475 0.958 4.9043903e+01 3.0298299e+02 +476 0.96 4.8441597e+01 2.9933025e+02 +477 0.962 4.7846549e+01 2.9572642e+02 +478 0.964 4.7258660e+01 2.9217067e+02 +479 0.966 4.6677835e+01 2.8866218e+02 +480 0.968 4.6103980e+01 2.8520015e+02 +481 0.97 4.5537004e+01 2.8178380e+02 +482 0.972 4.4976815e+01 2.7841236e+02 +483 0.974 4.4423325e+01 2.7508510e+02 +484 0.976 4.3876446e+01 2.7180128e+02 +485 0.978 4.3336091e+01 2.6856019e+02 +486 0.98 4.2802177e+01 2.6536114e+02 +487 0.982 4.2274619e+01 2.6220345e+02 +488 0.984 4.1753336e+01 2.5908645e+02 +489 0.986 4.1238247e+01 2.5600949e+02 +490 0.988 4.0729272e+01 2.5297194e+02 +491 0.99 4.0226333e+01 2.4997317e+02 +492 0.992 3.9729354e+01 2.4701257e+02 +493 0.994 3.9238258e+01 2.4408956e+02 +494 0.996 3.8752971e+01 2.4120354e+02 +495 0.998 3.8273419e+01 2.3835394e+02 +496 1.0 3.7799531e+01 2.3554021e+02 +497 1.002 3.7331235e+01 2.3276180e+02 +498 1.004 3.6868461e+01 2.3001817e+02 +499 1.006 3.6411139e+01 2.2730880e+02 +500 1.008 3.5959203e+01 2.2463317e+02 +501 1.01 3.5512584e+01 2.2199078e+02 +502 1.012 3.5071218e+01 2.1938113e+02 +503 1.014 3.4635038e+01 2.1680374e+02 +504 1.016 3.4203982e+01 2.1425815e+02 +505 1.018 3.3777985e+01 2.1174387e+02 +506 1.02 3.3356986e+01 2.0926046e+02 +507 1.022 3.2940923e+01 2.0680746e+02 +508 1.024 3.2529736e+01 2.0438445e+02 +509 1.026 3.2123365e+01 2.0199099e+02 +510 1.028 3.1721753e+01 1.9962665e+02 +511 1.03 3.1324840e+01 1.9729103e+02 +512 1.032 3.0932569e+01 1.9498372e+02 +513 1.034 3.0544886e+01 1.9270432e+02 +514 1.036 3.0161734e+01 1.9045243e+02 +515 1.038 2.9783058e+01 1.8822768e+02 +516 1.04 2.9408805e+01 1.8602968e+02 +517 1.042 2.9038922e+01 1.8385807e+02 +518 1.044 2.8673356e+01 1.8171249e+02 +519 1.046 2.8312055e+01 1.7959257e+02 +520 1.048 2.7954969e+01 1.7749796e+02 +521 1.05 2.7602046e+01 1.7542833e+02 +522 1.052 2.7253239e+01 1.7338333e+02 +523 1.054 2.6908497e+01 1.7136262e+02 +524 1.056 2.6567772e+01 1.6936590e+02 +525 1.058 2.6231018e+01 1.6739282e+02 +526 1.06 2.5898186e+01 1.6544308e+02 +527 1.062 2.5569230e+01 1.6351637e+02 +528 1.064 2.5244105e+01 1.6161238e+02 +529 1.066 2.4922765e+01 1.5973081e+02 +530 1.068 2.4605167e+01 1.5787137e+02 +531 1.07 2.4291265e+01 1.5603376e+02 +532 1.072 2.3981017e+01 1.5421771e+02 +533 1.074 2.3674380e+01 1.5242293e+02 +534 1.076 2.3371312e+01 1.5064914e+02 +535 1.078 2.3071770e+01 1.4889607e+02 +536 1.08 2.2775714e+01 1.4716347e+02 +537 1.082 2.2483103e+01 1.4545106e+02 +538 1.084 2.2193896e+01 1.4375858e+02 +539 1.086 2.1908055e+01 1.4208578e+02 +540 1.088 2.1625540e+01 1.4043242e+02 +541 1.09 2.1346313e+01 1.3879824e+02 +542 1.092 2.1070335e+01 1.3718300e+02 +543 1.094 2.0797568e+01 1.3558646e+02 +544 1.096 2.0527976e+01 1.3400840e+02 +545 1.098 2.0261523e+01 1.3244856e+02 +546 1.1 1.9998170e+01 1.3090674e+02 +547 1.102 1.9737884e+01 1.2938270e+02 +548 1.104 1.9480628e+01 1.2787622e+02 +549 1.106 1.9226367e+01 1.2638708e+02 +550 1.108 1.8975068e+01 1.2491508e+02 +551 1.11 1.8726696e+01 1.2345999e+02 +552 1.112 1.8481217e+01 1.2202161e+02 +553 1.114 1.8238598e+01 1.2059974e+02 +554 1.116 1.7998807e+01 1.1919417e+02 +555 1.118 1.7761811e+01 1.1780470e+02 +556 1.12 1.7527578e+01 1.1643114e+02 +557 1.122 1.7296076e+01 1.1507329e+02 +558 1.124 1.7067274e+01 1.1373096e+02 +559 1.126 1.6841142e+01 1.1240397e+02 +560 1.128 1.6617648e+01 1.1109213e+02 +561 1.13 1.6396763e+01 1.0979525e+02 +562 1.132 1.6178457e+01 1.0851316e+02 +563 1.134 1.5962701e+01 1.0724568e+02 +564 1.136 1.5749465e+01 1.0599263e+02 +565 1.138 1.5538721e+01 1.0475385e+02 +566 1.14 1.5330440e+01 1.0352915e+02 +567 1.142 1.5124595e+01 1.0231837e+02 +568 1.144 1.4921158e+01 1.0112136e+02 +569 1.146 1.4720100e+01 9.9937933e+01 +570 1.148 1.4521397e+01 9.8767942e+01 +571 1.15 1.4325020e+01 9.7611224e+01 +572 1.152 1.4130943e+01 9.6467623e+01 +573 1.154 1.3939141e+01 9.5336985e+01 +574 1.156 1.3749587e+01 9.4219156e+01 +575 1.158 1.3562256e+01 9.3113986e+01 +576 1.16 1.3377122e+01 9.2021327e+01 +577 1.162 1.3194162e+01 9.0941032e+01 +578 1.164 1.3013350e+01 8.9872956e+01 +579 1.166 1.2834662e+01 8.8816958e+01 +580 1.168 1.2658074e+01 8.7772895e+01 +581 1.17 1.2483563e+01 8.6740629e+01 +582 1.172 1.2311104e+01 8.5720023e+01 +583 1.174 1.2140675e+01 8.4710942e+01 +584 1.176 1.1972253e+01 8.3713252e+01 +585 1.178 1.1805815e+01 8.2726821e+01 +586 1.18 1.1641338e+01 8.1751518e+01 +587 1.182 1.1478801e+01 8.0787216e+01 +588 1.184 1.1318182e+01 7.9833788e+01 +589 1.186 1.1159459e+01 7.8891108e+01 +590 1.188 1.1002610e+01 7.7959053e+01 +591 1.19 1.0847616e+01 7.7037500e+01 +592 1.192 1.0694453e+01 7.6126330e+01 +593 1.194 1.0543103e+01 7.5225422e+01 +594 1.196 1.0393545e+01 7.4334660e+01 +595 1.198 1.0245758e+01 7.3453928e+01 +596 1.2 1.0099723e+01 7.2583111e+01 +597 1.202 9.9554191e+00 7.1722095e+01 +598 1.204 9.8128278e+00 7.0870770e+01 +599 1.206 9.6719296e+00 7.0029025e+01 +600 1.208 9.5327054e+00 6.9196750e+01 +601 1.21 9.3951364e+00 6.8373838e+01 +602 1.212 9.2592039e+00 6.7560184e+01 +603 1.214 9.1248896e+00 6.6755681e+01 +604 1.216 8.9921751e+00 6.5960226e+01 +605 1.218 8.8610427e+00 6.5173717e+01 +606 1.22 8.7314744e+00 6.4396053e+01 +607 1.222 8.6034526e+00 6.3627133e+01 +608 1.224 8.4769601e+00 6.2866859e+01 +609 1.226 8.3519795e+00 6.2115133e+01 +610 1.228 8.2284939e+00 6.1371859e+01 +611 1.23 8.1064865e+00 6.0636942e+01 +612 1.232 7.9859406e+00 5.9910287e+01 +613 1.234 7.8668399e+00 5.9191802e+01 +614 1.236 7.7491681e+00 5.8481395e+01 +615 1.238 7.6329090e+00 5.7778974e+01 +616 1.24 7.5180469e+00 5.7084452e+01 +617 1.242 7.4045660e+00 5.6397738e+01 +618 1.244 7.2924508e+00 5.5718746e+01 +619 1.246 7.1816859e+00 5.5047388e+01 +620 1.248 7.0722562e+00 5.4383580e+01 +621 1.25 6.9641466e+00 5.3727237e+01 +622 1.252 6.8573423e+00 5.3078275e+01 +623 1.254 6.7518287e+00 5.2436613e+01 +624 1.256 6.6475911e+00 5.1802168e+01 +625 1.258 6.5446152e+00 5.1174860e+01 +626 1.26 6.4428869e+00 5.0554609e+01 +627 1.262 6.3423921e+00 4.9941338e+01 +628 1.264 6.2431170e+00 4.9334967e+01 +629 1.266 6.1450477e+00 4.8735421e+01 +630 1.268 6.0481708e+00 4.8142622e+01 +631 1.27 5.9524728e+00 4.7556497e+01 +632 1.272 5.8579404e+00 4.6976971e+01 +633 1.274 5.7645605e+00 4.6403971e+01 +634 1.276 5.6723202e+00 4.5837424e+01 +635 1.278 5.5812066e+00 4.5277258e+01 +636 1.28 5.4912070e+00 4.4723403e+01 +637 1.282 5.4023088e+00 4.4175789e+01 +638 1.284 5.3144997e+00 4.3634346e+01 +639 1.286 5.2277674e+00 4.3099007e+01 +640 1.288 5.1420997e+00 4.2569703e+01 +641 1.29 5.0574846e+00 4.2046367e+01 +642 1.292 4.9739103e+00 4.1528934e+01 +643 1.294 4.8913650e+00 4.1017339e+01 +644 1.296 4.8098371e+00 4.0511516e+01 +645 1.298 4.7293151e+00 4.0011402e+01 +646 1.3 4.6497877e+00 3.9516934e+01 +647 1.302 4.5712436e+00 3.9028049e+01 +648 1.304 4.4936718e+00 3.8544685e+01 +649 1.306 4.4170612e+00 3.8066783e+01 +650 1.308 4.3414011e+00 3.7594280e+01 +651 1.31 4.2666806e+00 3.7127119e+01 +652 1.312 4.1928891e+00 3.6665239e+01 +653 1.314 4.1200161e+00 3.6208583e+01 +654 1.316 4.0480513e+00 3.5757093e+01 +655 1.318 3.9769843e+00 3.5310712e+01 +656 1.32 3.9068051e+00 3.4869383e+01 +657 1.322 3.8375035e+00 3.4433051e+01 +658 1.324 3.7690696e+00 3.4001661e+01 +659 1.326 3.7014936e+00 3.3575159e+01 +660 1.328 3.6347657e+00 3.3153490e+01 +661 1.33 3.5688764e+00 3.2736602e+01 +662 1.332 3.5038162e+00 3.2324441e+01 +663 1.334 3.4395755e+00 3.1916956e+01 +664 1.336 3.3761453e+00 3.1514096e+01 +665 1.338 3.3135161e+00 3.1115808e+01 +666 1.34 3.2516790e+00 3.0722044e+01 +667 1.342 3.1906250e+00 3.0332753e+01 +668 1.344 3.1303451e+00 2.9947886e+01 +669 1.346 3.0708305e+00 2.9567394e+01 +670 1.348 3.0120726e+00 2.9191230e+01 +671 1.35 2.9540627e+00 2.8819345e+01 +672 1.352 2.8967924e+00 2.8451693e+01 +673 1.354 2.8402532e+00 2.8088228e+01 +674 1.356 2.7844367e+00 2.7728902e+01 +675 1.358 2.7293348e+00 2.7373671e+01 +676 1.36 2.6749393e+00 2.7022489e+01 +677 1.362 2.6212422e+00 2.6675313e+01 +678 1.364 2.5682354e+00 2.6332098e+01 +679 1.366 2.5159112e+00 2.5992800e+01 +680 1.368 2.4642617e+00 2.5657377e+01 +681 1.37 2.4132791e+00 2.5325785e+01 +682 1.372 2.3629560e+00 2.4997984e+01 +683 1.374 2.3132847e+00 2.4673931e+01 +684 1.376 2.2642578e+00 2.4353585e+01 +685 1.378 2.2158679e+00 2.4036905e+01 +686 1.38 2.1681078e+00 2.3723852e+01 +687 1.382 2.1209701e+00 2.3414384e+01 +688 1.384 2.0744479e+00 2.3108464e+01 +689 1.386 2.0285339e+00 2.2806051e+01 +690 1.388 1.9832213e+00 2.2507108e+01 +691 1.39 1.9385032e+00 2.2211596e+01 +692 1.392 1.8943727e+00 2.1919477e+01 +693 1.394 1.8508231e+00 2.1630715e+01 +694 1.396 1.8078476e+00 2.1345273e+01 +695 1.398 1.7654398e+00 2.1063113e+01 +696 1.4 1.7235930e+00 2.0784200e+01 +697 1.402 1.6823008e+00 2.0508499e+01 +698 1.404 1.6415569e+00 2.0235973e+01 +699 1.406 1.6013549e+00 1.9966589e+01 +700 1.408 1.5616885e+00 1.9700311e+01 +701 1.41 1.5225516e+00 1.9437105e+01 +702 1.412 1.4839380e+00 1.9176938e+01 +703 1.414 1.4458418e+00 1.8919777e+01 +704 1.416 1.4082569e+00 1.8665588e+01 +705 1.418 1.3711775e+00 1.8414338e+01 +706 1.42 1.3345976e+00 1.8165996e+01 +707 1.422 1.2985116e+00 1.7920529e+01 +708 1.424 1.2629136e+00 1.7677905e+01 +709 1.426 1.2277981e+00 1.7438095e+01 +710 1.428 1.1931594e+00 1.7201065e+01 +711 1.43 1.1589920e+00 1.6966787e+01 +712 1.432 1.1252904e+00 1.6735229e+01 +713 1.434 1.0920493e+00 1.6506362e+01 +714 1.436 1.0592632e+00 1.6280157e+01 +715 1.438 1.0269269e+00 1.6056583e+01 +716 1.44 9.9503515e-01 1.5835612e+01 +717 1.442 9.6358275e-01 1.5617216e+01 +718 1.444 9.3256459e-01 1.5401365e+01 +719 1.446 9.0197561e-01 1.5188033e+01 +720 1.448 8.7181080e-01 1.4977190e+01 +721 1.45 8.4206521e-01 1.4768811e+01 +722 1.452 8.1273393e-01 1.4562867e+01 +723 1.454 7.8381213e-01 1.4359332e+01 +724 1.456 7.5529502e-01 1.4158179e+01 +725 1.458 7.2717784e-01 1.3959383e+01 +726 1.46 6.9945593e-01 1.3762916e+01 +727 1.462 6.7212464e-01 1.3568754e+01 +728 1.464 6.4517939e-01 1.3376871e+01 +729 1.466 6.1861565e-01 1.3187242e+01 +730 1.468 5.9242894e-01 1.2999843e+01 +731 1.47 5.6661481e-01 1.2814647e+01 +732 1.472 5.4116890e-01 1.2631632e+01 +733 1.474 5.1608685e-01 1.2450773e+01 +734 1.476 4.9136438e-01 1.2272046e+01 +735 1.478 4.6699726e-01 1.2095428e+01 +736 1.48 4.4298128e-01 1.1920895e+01 +737 1.482 4.1931230e-01 1.1748425e+01 +738 1.484 3.9598622e-01 1.1577995e+01 +739 1.486 3.7299898e-01 1.1409582e+01 +740 1.488 3.5034657e-01 1.1243163e+01 +741 1.49 3.2802501e-01 1.1078718e+01 +742 1.492 3.0603039e-01 1.0916223e+01 +743 1.494 2.8435883e-01 1.0755658e+01 +744 1.496 2.6300649e-01 1.0597001e+01 +745 1.498 2.4196957e-01 1.0440231e+01 +746 1.5 2.2124432e-01 1.0285328e+01 +747 1.502 2.0082703e-01 1.0132269e+01 +748 1.504 1.8071403e-01 9.9810359e+00 +749 1.506 1.6090168e-01 9.8316074e+00 +750 1.508 1.4138641e-01 9.6839637e+00 +751 1.51 1.2216465e-01 9.5380851e+00 +752 1.512 1.0323290e-01 9.3939520e+00 +753 1.514 8.4587691e-02 9.2515450e+00 +754 1.516 6.6225584e-02 9.1108450e+00 +755 1.518 4.8143186e-02 8.9718331e+00 +756 1.52 3.0337139e-02 8.8344905e+00 +757 1.522 1.2804123e-02 8.6987988e+00 +758 1.524 -4.4591446e-03 8.5647395e+00 +759 1.526 -2.1455911e-02 8.4322946e+00 +760 1.528 -3.8189387e-02 8.3014461e+00 +761 1.53 -5.4662748e-02 8.1721763e+00 +762 1.532 -7.0879133e-02 8.0444676e+00 +763 1.534 -8.6841648e-02 7.9183027e+00 +764 1.536 -1.0255336e-01 7.7936645e+00 +765 1.538 -1.1801731e-01 7.6705358e+00 +766 1.54 -1.3323650e-01 7.5489000e+00 +767 1.542 -1.4821390e-01 7.4287404e+00 +768 1.544 -1.6295243e-01 7.3100405e+00 +769 1.546 -1.7745502e-01 7.1927842e+00 +770 1.548 -1.9172452e-01 7.0769553e+00 +771 1.55 -2.0576378e-01 6.9625378e+00 +772 1.552 -2.1957561e-01 6.8495162e+00 +773 1.554 -2.3316277e-01 6.7378747e+00 +774 1.556 -2.4652801e-01 6.6275981e+00 +775 1.558 -2.5967406e-01 6.5186710e+00 +776 1.56 -2.7260359e-01 6.4110783e+00 +777 1.562 -2.8531925e-01 6.3048053e+00 +778 1.564 -2.9782368e-01 6.1998371e+00 +779 1.566 -3.1011946e-01 6.0961591e+00 +780 1.568 -3.2220917e-01 5.9937570e+00 +781 1.57 -3.3409533e-01 5.8926163e+00 +782 1.572 -3.4578046e-01 5.7927231e+00 +783 1.574 -3.5726704e-01 5.6940634e+00 +784 1.576 -3.6855753e-01 5.5966233e+00 +785 1.578 -3.7965434e-01 5.5003891e+00 +786 1.58 -3.9055988e-01 5.4053474e+00 +787 1.582 -4.0127652e-01 5.3114848e+00 +788 1.584 -4.1180660e-01 5.2187880e+00 +789 1.586 -4.2215244e-01 5.1272440e+00 +790 1.588 -4.3231633e-01 5.0368398e+00 +791 1.59 -4.4230055e-01 4.9475627e+00 +792 1.592 -4.5210733e-01 4.8593998e+00 +793 1.594 -4.6173888e-01 4.7723388e+00 +794 1.596 -4.7119741e-01 4.6863673e+00 +795 1.598 -4.8048507e-01 4.6014729e+00 +796 1.6 -4.8960401e-01 4.5176435e+00 +797 1.602 -4.9855635e-01 4.4348672e+00 +798 1.604 -5.0734417e-01 4.3531321e+00 +799 1.606 -5.1596956e-01 4.2724264e+00 +800 1.608 -5.2443456e-01 4.1927385e+00 +801 1.61 -5.3274119e-01 4.1140571e+00 +802 1.612 -5.4089145e-01 4.0363706e+00 +803 1.614 -5.4888732e-01 3.9596678e+00 +804 1.616 -5.5673077e-01 3.8839377e+00 +805 1.618 -5.6442372e-01 3.8091693e+00 +806 1.62 -5.7196808e-01 3.7353516e+00 +807 1.622 -5.7936575e-01 3.6624740e+00 +808 1.624 -5.8661859e-01 3.5905257e+00 +809 1.626 -5.9372846e-01 3.5194962e+00 +810 1.628 -6.0069718e-01 3.4493752e+00 +811 1.63 -6.0752656e-01 3.3801524e+00 +812 1.632 -6.1421839e-01 3.3118175e+00 +813 1.634 -6.2077442e-01 3.2443604e+00 +814 1.636 -6.2719641e-01 3.1777713e+00 +815 1.638 -6.3348608e-01 3.1120402e+00 +816 1.64 -6.3964513e-01 3.0471574e+00 +817 1.642 -6.4567526e-01 2.9831133e+00 +818 1.644 -6.5157814e-01 2.9198982e+00 +819 1.646 -6.5735540e-01 2.8575028e+00 +820 1.648 -6.6300869e-01 2.7959178e+00 +821 1.65 -6.6853961e-01 2.7351338e+00 +822 1.652 -6.7394975e-01 2.6751418e+00 +823 1.654 -6.7924070e-01 2.6159328e+00 +824 1.656 -6.8441400e-01 2.5574977e+00 +825 1.658 -6.8947120e-01 2.4998278e+00 +826 1.66 -6.9441382e-01 2.4429142e+00 +827 1.662 -6.9924335e-01 2.3867485e+00 +828 1.664 -7.0396130e-01 2.3313219e+00 +829 1.666 -7.0856913e-01 2.2766260e+00 +830 1.668 -7.1306829e-01 2.2226526e+00 +831 1.67 -7.1746022e-01 2.1693932e+00 +832 1.672 -7.2174633e-01 2.1168397e+00 +833 1.674 -7.2592804e-01 2.0649840e+00 +834 1.676 -7.3000673e-01 2.0138181e+00 +835 1.678 -7.3398377e-01 1.9633341e+00 +836 1.68 -7.3786051e-01 1.9135241e+00 +837 1.682 -7.4163831e-01 1.8643803e+00 +838 1.684 -7.4531847e-01 1.8158952e+00 +839 1.686 -7.4890232e-01 1.7680610e+00 +840 1.688 -7.5239115e-01 1.7208704e+00 +841 1.69 -7.5578623e-01 1.6743159e+00 +842 1.692 -7.5908883e-01 1.6283901e+00 +843 1.694 -7.6230020e-01 1.5830858e+00 +844 1.696 -7.6542158e-01 1.5383959e+00 +845 1.698 -7.6845419e-01 1.4943131e+00 +846 1.7 -7.7139923e-01 1.4508305e+00 +847 1.702 -7.7425791e-01 1.4079412e+00 +848 1.704 -7.7703139e-01 1.3656382e+00 +849 1.706 -7.7972085e-01 1.3239148e+00 +850 1.708 -7.8232743e-01 1.2827642e+00 +851 1.71 -7.8485228e-01 1.2421798e+00 +852 1.712 -7.8729652e-01 1.2021551e+00 +853 1.714 -7.8966127e-01 1.1626834e+00 +854 1.716 -7.9194762e-01 1.1237584e+00 +855 1.718 -7.9415666e-01 1.0853738e+00 +856 1.72 -7.9628947e-01 1.0475231e+00 +857 1.722 -7.9834711e-01 1.0102003e+00 +858 1.724 -8.0033062e-01 9.7339903e-01 +859 1.726 -8.0224105e-01 9.3711334e-01 +860 1.728 -8.0407941e-01 9.0133718e-01 +861 1.73 -8.0584673e-01 8.6606457e-01 +862 1.732 -8.0754400e-01 8.3128964e-01 +863 1.734 -8.0917222e-01 7.9700654e-01 +864 1.736 -8.1073236e-01 7.6320953e-01 +865 1.738 -8.1222538e-01 7.2989289e-01 +866 1.74 -8.1365224e-01 6.9705099e-01 +867 1.742 -8.1501389e-01 6.6467825e-01 +868 1.744 -8.1631127e-01 6.3276916e-01 +869 1.746 -8.1754528e-01 6.0131827e-01 +870 1.748 -8.1871684e-01 5.7032017e-01 +871 1.75 -8.1982686e-01 5.3976953e-01 +872 1.752 -8.2087621e-01 5.0966108e-01 +873 1.754 -8.2186579e-01 4.7998959e-01 +874 1.756 -8.2279646e-01 4.5074991e-01 +875 1.758 -8.2366908e-01 4.2193693e-01 +876 1.76 -8.2448449e-01 3.9354560e-01 +877 1.762 -8.2524354e-01 3.6557092e-01 +878 1.764 -8.2594705e-01 3.3800797e-01 +879 1.766 -8.2659584e-01 3.1085185e-01 +880 1.768 -8.2719072e-01 2.8409773e-01 +881 1.77 -8.2773249e-01 2.5774084e-01 +882 1.772 -8.2822195e-01 2.3177645e-01 +883 1.774 -8.2865986e-01 2.0619990e-01 +884 1.776 -8.2904700e-01 1.8100655e-01 +885 1.778 -8.2938414e-01 1.5619184e-01 +886 1.78 -8.2967202e-01 1.3175126e-01 +887 1.782 -8.2991139e-01 1.0768032e-01 +888 1.784 -8.3010298e-01 8.3974615e-02 +889 1.786 -8.3024753e-01 6.0629767e-02 +890 1.788 -8.3034574e-01 3.7641455e-02 +891 1.79 -8.3039833e-01 1.5005403e-02 +892 1.792 -8.3040599e-01 -7.2826174e-03 +893 1.794 -8.3036943e-01 -2.9226788e-02 +894 1.796 -8.3028931e-01 -5.0831243e-02 +895 1.798 -8.3016633e-01 -7.2100073e-02 +896 1.8 -8.3000113e-01 -9.3037321e-02 +897 1.802 -8.2979440e-01 -1.1364699e-01 +898 1.804 -8.2954676e-01 -1.3393303e-01 +899 1.806 -8.2925888e-01 -1.5389935e-01 +900 1.808 -8.2893137e-01 -1.7354983e-01 +901 1.81 -8.2856489e-01 -1.9288828e-01 +902 1.812 -8.2816003e-01 -2.1191849e-01 +903 1.814 -8.2771741e-01 -2.3064421e-01 +904 1.816 -8.2723765e-01 -2.4906912e-01 +905 1.818 -8.2672134e-01 -2.6719689e-01 +906 1.82 -8.2616906e-01 -2.8503114e-01 +907 1.822 -8.2558140e-01 -3.0257544e-01 +908 1.824 -8.2495895e-01 -3.1983333e-01 +909 1.826 -8.2430226e-01 -3.3680830e-01 +910 1.828 -8.2361190e-01 -3.5350382e-01 +911 1.83 -8.2288843e-01 -3.6992331e-01 +912 1.832 -8.2213239e-01 -3.8607015e-01 +913 1.834 -8.2134433e-01 -4.0194769e-01 +914 1.836 -8.2052478e-01 -4.1755922e-01 +915 1.838 -8.1967427e-01 -4.3290803e-01 +916 1.84 -8.1879332e-01 -4.4799735e-01 +917 1.842 -8.1788245e-01 -4.6283037e-01 +918 1.844 -8.1694216e-01 -4.7741026e-01 +919 1.846 -8.1597297e-01 -4.9174014e-01 +920 1.848 -8.1497537e-01 -5.0582311e-01 +921 1.85 -8.1394984e-01 -5.1966222e-01 +922 1.852 -8.1289688e-01 -5.3326050e-01 +923 1.854 -8.1181696e-01 -5.4662093e-01 +924 1.856 -8.1071055e-01 -5.5974648e-01 +925 1.858 -8.0957813e-01 -5.7264007e-01 +926 1.86 -8.0842015e-01 -5.8530458e-01 +927 1.862 -8.0723706e-01 -5.9774287e-01 +928 1.864 -8.0602932e-01 -6.0995777e-01 +929 1.866 -8.0479738e-01 -6.2195208e-01 +930 1.868 -8.0354166e-01 -6.3372855e-01 +931 1.87 -8.0226261e-01 -6.4528992e-01 +932 1.872 -8.0096064e-01 -6.5663889e-01 +933 1.874 -7.9963619e-01 -6.6777812e-01 +934 1.876 -7.9828967e-01 -6.7871027e-01 +935 1.878 -7.9692149e-01 -6.8943793e-01 +936 1.88 -7.9553205e-01 -6.9996370e-01 +937 1.882 -7.9412176e-01 -7.1029012e-01 +938 1.884 -7.9269102e-01 -7.2041971e-01 +939 1.886 -7.9124021e-01 -7.3035498e-01 +940 1.888 -7.8976973e-01 -7.4009839e-01 +941 1.89 -7.8827995e-01 -7.4965238e-01 +942 1.892 -7.8677124e-01 -7.5901936e-01 +943 1.894 -7.8524399e-01 -7.6820171e-01 +944 1.896 -7.8369856e-01 -7.7720179e-01 +945 1.898 -7.8213531e-01 -7.8602194e-01 +946 1.9 -7.8055459e-01 -7.9466445e-01 +947 1.902 -7.7895676e-01 -8.0313160e-01 +948 1.904 -7.7734218e-01 -8.1142566e-01 +949 1.906 -7.7571118e-01 -8.1954883e-01 +950 1.908 -7.7406410e-01 -8.2750334e-01 +951 1.91 -7.7240127e-01 -8.3529134e-01 +952 1.912 -7.7072304e-01 -8.4291501e-01 +953 1.914 -7.6902972e-01 -8.5037645e-01 +954 1.916 -7.6732164e-01 -8.5767777e-01 +955 1.918 -7.6559912e-01 -8.6482107e-01 +956 1.92 -7.6386246e-01 -8.7180838e-01 +957 1.922 -7.6211198e-01 -8.7864174e-01 +958 1.924 -7.6034799e-01 -8.8532317e-01 +959 1.926 -7.5857079e-01 -8.9185465e-01 +960 1.928 -7.5678067e-01 -8.9823813e-01 +961 1.93 -7.5497794e-01 -9.0447557e-01 +962 1.932 -7.5316287e-01 -9.1056888e-01 +963 1.934 -7.5133576e-01 -9.1651996e-01 +964 1.936 -7.4949688e-01 -9.2233069e-01 +965 1.938 -7.4764653e-01 -9.2800291e-01 +966 1.94 -7.4578496e-01 -9.3353846e-01 +967 1.942 -7.4391246e-01 -9.3893916e-01 +968 1.944 -7.4202929e-01 -9.4420679e-01 +969 1.946 -7.4013572e-01 -9.4934313e-01 +970 1.948 -7.3823201e-01 -9.5434992e-01 +971 1.95 -7.3631841e-01 -9.5922890e-01 +972 1.952 -7.3439518e-01 -9.6398177e-01 +973 1.954 -7.3246256e-01 -9.6861022e-01 +974 1.956 -7.3052082e-01 -9.7311593e-01 +975 1.958 -7.2857018e-01 -9.7750056e-01 +976 1.96 -7.2661089e-01 -9.8176572e-01 +977 1.962 -7.2464320e-01 -9.8591303e-01 +978 1.964 -7.2266732e-01 -9.8994410e-01 +979 1.966 -7.2068350e-01 -9.9386050e-01 +980 1.968 -7.1869195e-01 -9.9766378e-01 +981 1.97 -7.1669292e-01 -1.0013555e+00 +982 1.972 -7.1468660e-01 -1.0049371e+00 +983 1.974 -7.1267324e-01 -1.0084103e+00 +984 1.976 -7.1065304e-01 -1.0117763e+00 +985 1.978 -7.0862620e-01 -1.0150368e+00 +986 1.98 -7.0659296e-01 -1.0181931e+00 +987 1.982 -7.0455350e-01 -1.0212468e+00 +988 1.984 -7.0250804e-01 -1.0241991e+00 +989 1.986 -7.0045677e-01 -1.0270516e+00 +990 1.988 -6.9839990e-01 -1.0298056e+00 +991 1.99 -6.9633761e-01 -1.0324625e+00 +992 1.992 -6.9427011e-01 -1.0350236e+00 +993 1.994 -6.9219758e-01 -1.0374903e+00 +994 1.996 -6.9012021e-01 -1.0398640e+00 +995 1.998 -6.8803819e-01 -1.0421458e+00 +996 2.0 -6.8595169e-01 -1.0443371e+00 +997 2.002 -6.8386090e-01 -1.0464392e+00 +998 2.004 -6.8176599e-01 -1.0484534e+00 +999 2.006 -6.7966714e-01 -1.0503808e+00 +1000 2.008 -6.7756452e-01 -1.0522228e+00 +1001 2.01 -6.7545831e-01 -1.0539805e+00 +1002 2.012 -6.7334866e-01 -1.0556552e+00 +1003 2.014 -6.7123574e-01 -1.0572480e+00 +1004 2.016 -6.6911972e-01 -1.0587602e+00 +1005 2.018 -6.6700075e-01 -1.0601928e+00 +1006 2.02 -6.6487900e-01 -1.0615470e+00 +1007 2.022 -6.6275462e-01 -1.0628240e+00 +1008 2.024 -6.6062776e-01 -1.0640249e+00 +1009 2.026 -6.5849857e-01 -1.0651508e+00 +1010 2.028 -6.5636720e-01 -1.0662028e+00 +1011 2.03 -6.5423380e-01 -1.0671819e+00 +1012 2.032 -6.5209852e-01 -1.0680893e+00 +1013 2.034 -6.4996149e-01 -1.0689260e+00 +1014 2.036 -6.4782286e-01 -1.0696930e+00 +1015 2.038 -6.4568277e-01 -1.0703914e+00 +1016 2.04 -6.4354134e-01 -1.0710222e+00 +1017 2.042 -6.4139872e-01 -1.0715864e+00 +1018 2.044 -6.3925504e-01 -1.0720851e+00 +1019 2.046 -6.3711043e-01 -1.0725191e+00 +1020 2.048 -6.3496501e-01 -1.0728894e+00 +1021 2.05 -6.3281891e-01 -1.0731971e+00 +1022 2.052 -6.3067226e-01 -1.0734430e+00 +1023 2.054 -6.2852518e-01 -1.0736282e+00 +1024 2.056 -6.2637779e-01 -1.0737535e+00 +1025 2.058 -6.2423020e-01 -1.0738198e+00 +1026 2.06 -6.2208255e-01 -1.0738281e+00 +1027 2.062 -6.1993493e-01 -1.0737792e+00 +1028 2.064 -6.1778747e-01 -1.0736740e+00 +1029 2.066 -6.1564027e-01 -1.0735135e+00 +1030 2.068 -6.1349345e-01 -1.0732984e+00 +1031 2.07 -6.1134711e-01 -1.0730296e+00 +1032 2.072 -6.0920137e-01 -1.0727080e+00 +1033 2.074 -6.0705632e-01 -1.0723344e+00 +1034 2.076 -6.0491206e-01 -1.0719096e+00 +1035 2.078 -6.0276871e-01 -1.0714344e+00 +1036 2.08 -6.0062636e-01 -1.0709096e+00 +1037 2.082 -5.9848511e-01 -1.0703360e+00 +1038 2.084 -5.9634505e-01 -1.0697145e+00 +1039 2.086 -5.9420628e-01 -1.0690457e+00 +1040 2.088 -5.9206889e-01 -1.0683304e+00 +1041 2.09 -5.8993299e-01 -1.0675694e+00 +1042 2.092 -5.8779865e-01 -1.0667634e+00 +1043 2.094 -5.8566596e-01 -1.0659132e+00 +1044 2.096 -5.8353502e-01 -1.0650195e+00 +1045 2.098 -5.8140591e-01 -1.0640830e+00 +1046 2.1 -5.7927872e-01 -1.0631044e+00 +1047 2.102 -5.7715352e-01 -1.0620844e+00 +1048 2.104 -5.7503041e-01 -1.0610238e+00 +1049 2.106 -5.7290946e-01 -1.0599231e+00 +1050 2.108 -5.7079074e-01 -1.0587831e+00 +1051 2.11 -5.6867435e-01 -1.0576044e+00 +1052 2.112 -5.6656035e-01 -1.0563877e+00 +1053 2.114 -5.6444882e-01 -1.0551337e+00 +1054 2.116 -5.6233984e-01 -1.0538429e+00 +1055 2.118 -5.6023348e-01 -1.0525161e+00 +1056 2.12 -5.5812980e-01 -1.0511538e+00 +1057 2.122 -5.5602888e-01 -1.0497566e+00 +1058 2.124 -5.5393080e-01 -1.0483253e+00 +1059 2.126 -5.5183560e-01 -1.0468603e+00 +1060 2.128 -5.4974338e-01 -1.0453622e+00 +1061 2.13 -5.4765418e-01 -1.0438318e+00 +1062 2.132 -5.4556807e-01 -1.0422695e+00 +1063 2.134 -5.4348512e-01 -1.0406759e+00 +1064 2.136 -5.4140539e-01 -1.0390515e+00 +1065 2.138 -5.3932893e-01 -1.0373970e+00 +1066 2.14 -5.3725582e-01 -1.0357129e+00 +1067 2.142 -5.3518610e-01 -1.0339998e+00 +1068 2.144 -5.3311984e-01 -1.0322581e+00 +1069 2.146 -5.3105709e-01 -1.0304884e+00 +1070 2.148 -5.2899790e-01 -1.0286913e+00 +1071 2.15 -5.2694234e-01 -1.0268672e+00 +1072 2.152 -5.2489045e-01 -1.0250167e+00 +1073 2.154 -5.2284229e-01 -1.0231402e+00 +1074 2.156 -5.2079791e-01 -1.0212383e+00 +1075 2.158 -5.1875735e-01 -1.0193115e+00 +1076 2.16 -5.1672068e-01 -1.0173602e+00 +1077 2.162 -5.1468793e-01 -1.0153850e+00 +1078 2.164 -5.1265915e-01 -1.0133862e+00 +1079 2.166 -5.1063440e-01 -1.0113645e+00 +1080 2.168 -5.0861371e-01 -1.0093201e+00 +1081 2.17 -5.0659713e-01 -1.0072536e+00 +1082 2.172 -5.0458471e-01 -1.0051655e+00 +1083 2.174 -5.0257649e-01 -1.0030562e+00 +1084 2.176 -5.0057250e-01 -1.0009261e+00 +1085 2.178 -4.9857280e-01 -9.9877561e-01 +1086 2.18 -4.9657741e-01 -9.9660523e-01 +1087 2.182 -4.9458639e-01 -9.9441535e-01 +1088 2.184 -4.9259976e-01 -9.9220640e-01 +1089 2.186 -4.9061758e-01 -9.8997877e-01 +1090 2.188 -4.8863986e-01 -9.8773289e-01 +1091 2.19 -4.8666666e-01 -9.8546914e-01 +1092 2.192 -4.8469800e-01 -9.8318793e-01 +1093 2.194 -4.8273392e-01 -9.8088964e-01 +1094 2.196 -4.8077445e-01 -9.7857466e-01 +1095 2.198 -4.7881963e-01 -9.7624337e-01 +1096 2.2 -4.7686949e-01 -9.7389614e-01 +1097 2.202 -4.7492405e-01 -9.7153335e-01 +1098 2.204 -4.7298336e-01 -9.6915535e-01 +1099 2.206 -4.7104744e-01 -9.6676252e-01 +1100 2.208 -4.6911632e-01 -9.6435520e-01 +1101 2.21 -4.6719003e-01 -9.6193374e-01 +1102 2.212 -4.6526860e-01 -9.5949850e-01 +1103 2.214 -4.6335205e-01 -9.5704982e-01 +1104 2.216 -4.6144041e-01 -9.5458802e-01 +1105 2.218 -4.5953370e-01 -9.5211345e-01 +1106 2.22 -4.5763196e-01 -9.4962643e-01 +1107 2.222 -4.5573520e-01 -9.4712728e-01 +1108 2.224 -4.5384346e-01 -9.4461633e-01 +1109 2.226 -4.5195675e-01 -9.4209389e-01 +1110 2.228 -4.5007509e-01 -9.3956027e-01 +1111 2.23 -4.4819851e-01 -9.3701578e-01 +1112 2.232 -4.4632703e-01 -9.3446072e-01 +1113 2.234 -4.4446068e-01 -9.3189539e-01 +1114 2.236 -4.4259946e-01 -9.2932008e-01 +1115 2.238 -4.4074340e-01 -9.2673508e-01 +1116 2.24 -4.3889253e-01 -9.2414069e-01 +1117 2.242 -4.3704685e-01 -9.2153718e-01 +1118 2.244 -4.3520638e-01 -9.1892482e-01 +1119 2.246 -4.3337115e-01 -9.1630391e-01 +1120 2.248 -4.3154117e-01 -9.1367470e-01 +1121 2.25 -4.2971646e-01 -9.1103747e-01 +1122 2.252 -4.2789703e-01 -9.0839247e-01 +1123 2.254 -4.2608289e-01 -9.0573997e-01 +1124 2.256 -4.2427407e-01 -9.0308023e-01 +1125 2.258 -4.2247058e-01 -9.0041350e-01 +1126 2.26 -4.2067242e-01 -8.9774002e-01 +1127 2.262 -4.1887962e-01 -8.9506004e-01 +1128 2.264 -4.1709219e-01 -8.9237381e-01 +1129 2.266 -4.1531013e-01 -8.8968156e-01 +1130 2.268 -4.1353346e-01 -8.8698353e-01 +1131 2.27 -4.1176220e-01 -8.8427995e-01 +1132 2.272 -4.0999635e-01 -8.8157106e-01 +1133 2.274 -4.0823592e-01 -8.7885707e-01 +1134 2.276 -4.0648092e-01 -8.7613821e-01 +1135 2.278 -4.0473137e-01 -8.7341469e-01 +1136 2.28 -4.0298727e-01 -8.7068674e-01 +1137 2.282 -4.0124863e-01 -8.6795457e-01 +1138 2.284 -3.9951545e-01 -8.6521839e-01 +1139 2.286 -3.9778775e-01 -8.6247840e-01 +1140 2.288 -3.9606554e-01 -8.5973481e-01 +1141 2.29 -3.9434882e-01 -8.5698783e-01 +1142 2.292 -3.9263759e-01 -8.5423763e-01 +1143 2.294 -3.9093187e-01 -8.5148444e-01 +1144 2.296 -3.8923166e-01 -8.4872843e-01 +1145 2.298 -3.8753696e-01 -8.4596979e-01 +1146 2.3 -3.8584778e-01 -8.4320872e-01 +1147 2.302 -3.8416412e-01 -8.4044540e-01 +1148 2.304 -3.8248600e-01 -8.3768000e-01 +1149 2.306 -3.8081341e-01 -8.3491271e-01 +1150 2.308 -3.7914635e-01 -8.3214370e-01 +1151 2.31 -3.7748483e-01 -8.2937315e-01 +1152 2.312 -3.7582886e-01 -8.2660123e-01 +1153 2.314 -3.7417843e-01 -8.2382810e-01 +1154 2.316 -3.7253354e-01 -8.2105394e-01 +1155 2.318 -3.7089421e-01 -8.1827890e-01 +1156 2.32 -3.6926043e-01 -8.1550314e-01 +1157 2.322 -3.6763220e-01 -8.1272683e-01 +1158 2.324 -3.6600952e-01 -8.0995012e-01 +1159 2.326 -3.6439240e-01 -8.0717316e-01 +1160 2.328 -3.6278083e-01 -8.0439611e-01 +1161 2.33 -3.6117482e-01 -8.0161911e-01 +1162 2.332 -3.5957435e-01 -7.9884232e-01 +1163 2.334 -3.5797945e-01 -7.9606586e-01 +1164 2.336 -3.5639009e-01 -7.9328990e-01 +1165 2.338 -3.5480629e-01 -7.9051456e-01 +1166 2.34 -3.5322803e-01 -7.8773998e-01 +1167 2.342 -3.5165533e-01 -7.8496631e-01 +1168 2.344 -3.5008817e-01 -7.8219367e-01 +1169 2.346 -3.4852655e-01 -7.7942219e-01 +1170 2.348 -3.4697048e-01 -7.7665201e-01 +1171 2.35 -3.4541994e-01 -7.7388325e-01 +1172 2.352 -3.4387494e-01 -7.7111603e-01 +1173 2.354 -3.4233548e-01 -7.6835048e-01 +1174 2.356 -3.4080154e-01 -7.6558673e-01 +1175 2.358 -3.3927313e-01 -7.6282488e-01 +1176 2.36 -3.3775024e-01 -7.6006506e-01 +1177 2.362 -3.3623287e-01 -7.5730739e-01 +1178 2.364 -3.3472101e-01 -7.5455197e-01 +1179 2.366 -3.3321466e-01 -7.5179891e-01 +1180 2.368 -3.3171381e-01 -7.4904834e-01 +1181 2.37 -3.3021846e-01 -7.4630035e-01 +1182 2.372 -3.2872861e-01 -7.4355504e-01 +1183 2.374 -3.2724424e-01 -7.4081254e-01 +1184 2.376 -3.2576535e-01 -7.3807293e-01 +1185 2.378 -3.2429195e-01 -7.3533632e-01 +1186 2.38 -3.2282401e-01 -7.3260281e-01 +1187 2.382 -3.2136153e-01 -7.2987250e-01 +1188 2.384 -3.1990451e-01 -7.2714547e-01 +1189 2.386 -3.1845295e-01 -7.2442183e-01 +1190 2.388 -3.1700682e-01 -7.2170167e-01 +1191 2.39 -3.1556614e-01 -7.1898508e-01 +1192 2.392 -3.1413088e-01 -7.1627214e-01 +1193 2.394 -3.1270105e-01 -7.1356295e-01 +1194 2.396 -3.1127663e-01 -7.1085759e-01 +1195 2.398 -3.0985761e-01 -7.0815615e-01 +1196 2.4 -3.0844400e-01 -7.0545871e-01 +1197 2.402 -3.0703578e-01 -7.0276534e-01 +1198 2.404 -3.0563294e-01 -7.0007614e-01 +1199 2.406 -3.0423547e-01 -6.9739118e-01 +1200 2.408 -3.0284337e-01 -6.9471054e-01 +1201 2.41 -3.0145662e-01 -6.9203429e-01 +1202 2.412 -3.0007523e-01 -6.8936250e-01 +1203 2.414 -2.9869917e-01 -6.8669526e-01 +1204 2.416 -2.9732844e-01 -6.8403263e-01 +1205 2.418 -2.9596304e-01 -6.8137468e-01 +1206 2.42 -2.9460294e-01 -6.7872149e-01 +1207 2.422 -2.9324815e-01 -6.7607311e-01 +1208 2.424 -2.9189865e-01 -6.7342962e-01 +1209 2.426 -2.9055443e-01 -6.7079108e-01 +1210 2.428 -2.8921548e-01 -6.6815755e-01 +1211 2.43 -2.8788179e-01 -6.6552911e-01 +1212 2.432 -2.8655336e-01 -6.6290580e-01 +1213 2.434 -2.8523017e-01 -6.6028769e-01 +1214 2.436 -2.8391221e-01 -6.5767483e-01 +1215 2.438 -2.8259946e-01 -6.5506729e-01 +1216 2.44 -2.8129193e-01 -6.5246513e-01 +1217 2.442 -2.7998960e-01 -6.4986839e-01 +1218 2.444 -2.7869246e-01 -6.4727714e-01 +1219 2.446 -2.7740049e-01 -6.4469141e-01 +1220 2.448 -2.7611369e-01 -6.4211128e-01 +1221 2.45 -2.7483204e-01 -6.3953678e-01 +1222 2.452 -2.7355553e-01 -6.3696798e-01 +1223 2.454 -2.7228416e-01 -6.3440490e-01 +1224 2.456 -2.7101791e-01 -6.3184762e-01 +1225 2.458 -2.6975677e-01 -6.2929616e-01 +1226 2.46 -2.6850072e-01 -6.2675058e-01 +1227 2.462 -2.6724976e-01 -6.2421092e-01 +1228 2.464 -2.6600388e-01 -6.2167723e-01 +1229 2.466 -2.6476305e-01 -6.1914955e-01 +1230 2.468 -2.6352727e-01 -6.1662791e-01 +1231 2.47 -2.6229653e-01 -6.1411237e-01 +1232 2.472 -2.6107082e-01 -6.1160295e-01 +1233 2.474 -2.5985012e-01 -6.0909971e-01 +1234 2.476 -2.5863442e-01 -6.0660267e-01 +1235 2.478 -2.5742370e-01 -6.0411187e-01 +1236 2.48 -2.5621796e-01 -6.0162736e-01 +1237 2.482 -2.5501719e-01 -5.9914916e-01 +1238 2.484 -2.5382136e-01 -5.9667730e-01 +1239 2.486 -2.5263048e-01 -5.9421184e-01 +1240 2.488 -2.5144451e-01 -5.9175278e-01 +1241 2.49 -2.5026346e-01 -5.8930018e-01 +1242 2.492 -2.4908731e-01 -5.8685405e-01 +1243 2.494 -2.4791604e-01 -5.8441443e-01 +1244 2.496 -2.4674965e-01 -5.8198135e-01 +1245 2.498 -2.4558811e-01 -5.7955483e-01 +1246 2.5 -2.4443142e-01 -5.7713491e-01 +1247 2.502 -2.4327957e-01 -5.7472161e-01 +1248 2.504 -2.4213253e-01 -5.7231496e-01 +1249 2.506 -2.4099030e-01 -5.6991497e-01 +1250 2.508 -2.3985287e-01 -5.6752169e-01 +1251 2.51 -2.3872021e-01 -5.6513513e-01 +1252 2.512 -2.3759232e-01 -5.6275531e-01 +1253 2.514 -2.3646918e-01 -5.6038225e-01 +1254 2.516 -2.3535079e-01 -5.5801599e-01 +1255 2.518 -2.3423712e-01 -5.5565654e-01 +1256 2.52 -2.3312816e-01 -5.5330391e-01 +1257 2.522 -2.3202390e-01 -5.5095814e-01 +1258 2.524 -2.3092432e-01 -5.4861923e-01 +1259 2.526 -2.2982941e-01 -5.4628721e-01 +1260 2.528 -2.2873917e-01 -5.4396210e-01 +1261 2.53 -2.2765356e-01 -5.4164391e-01 +1262 2.532 -2.2657259e-01 -5.3933265e-01 +1263 2.534 -2.2549623e-01 -5.3702835e-01 +1264 2.536 -2.2442447e-01 -5.3473103e-01 +1265 2.538 -2.2335730e-01 -5.3244068e-01 +1266 2.54 -2.2229470e-01 -5.3015734e-01 +1267 2.542 -2.2123666e-01 -5.2788100e-01 +1268 2.544 -2.2018317e-01 -5.2561169e-01 +1269 2.546 -2.1913421e-01 -5.2334942e-01 +1270 2.548 -2.1808977e-01 -5.2109420e-01 +1271 2.55 -2.1704983e-01 -5.1884603e-01 +1272 2.552 -2.1601438e-01 -5.1660494e-01 +1273 2.554 -2.1498341e-01 -5.1437093e-01 +1274 2.556 -2.1395689e-01 -5.1214401e-01 +1275 2.558 -2.1293483e-01 -5.0992419e-01 +1276 2.56 -2.1191719e-01 -5.0771147e-01 +1277 2.562 -2.1090397e-01 -5.0550587e-01 +1278 2.564 -2.0989516e-01 -5.0330740e-01 +1279 2.566 -2.0889074e-01 -5.0111606e-01 +1280 2.568 -2.0789069e-01 -4.9893185e-01 +1281 2.57 -2.0689501e-01 -4.9675478e-01 +1282 2.572 -2.0590367e-01 -4.9458487e-01 +1283 2.574 -2.0491666e-01 -4.9242211e-01 +1284 2.576 -2.0393398e-01 -4.9026651e-01 +1285 2.578 -2.0295559e-01 -4.8811807e-01 +1286 2.58 -2.0198150e-01 -4.8597679e-01 +1287 2.582 -2.0101168e-01 -4.8384269e-01 +1288 2.584 -2.0004612e-01 -4.8171576e-01 +1289 2.586 -1.9908481e-01 -4.7959600e-01 +1290 2.588 -1.9812774e-01 -4.7748342e-01 +1291 2.59 -1.9717487e-01 -4.7537803e-01 +1292 2.592 -1.9622622e-01 -4.7327981e-01 +1293 2.594 -1.9528175e-01 -4.7118877e-01 +1294 2.596 -1.9434146e-01 -4.6910491e-01 +1295 2.598 -1.9340533e-01 -4.6702824e-01 +1296 2.6 -1.9247334e-01 -4.6495874e-01 +1297 2.602 -1.9154549e-01 -4.6289643e-01 +1298 2.604 -1.9062175e-01 -4.6084129e-01 +1299 2.606 -1.8970212e-01 -4.5879334e-01 +1300 2.608 -1.8878657e-01 -4.5675256e-01 +1301 2.61 -1.8787510e-01 -4.5471895e-01 +1302 2.612 -1.8696769e-01 -4.5269252e-01 +1303 2.614 -1.8606433e-01 -4.5067325e-01 +1304 2.616 -1.8516499e-01 -4.4866115e-01 +1305 2.618 -1.8426968e-01 -4.4665621e-01 +1306 2.62 -1.8337836e-01 -4.4465843e-01 +1307 2.622 -1.8249104e-01 -4.4266781e-01 +1308 2.624 -1.8160769e-01 -4.4068433e-01 +1309 2.626 -1.8072830e-01 -4.3870800e-01 +1310 2.628 -1.7985285e-01 -4.3673881e-01 +1311 2.63 -1.7898134e-01 -4.3477675e-01 +1312 2.632 -1.7811374e-01 -4.3282182e-01 +1313 2.634 -1.7725004e-01 -4.3087401e-01 +1314 2.636 -1.7639024e-01 -4.2893332e-01 +1315 2.638 -1.7553431e-01 -4.2699974e-01 +1316 2.64 -1.7468223e-01 -4.2507326e-01 +1317 2.642 -1.7383401e-01 -4.2315388e-01 +1318 2.644 -1.7298961e-01 -4.2124159e-01 +1319 2.646 -1.7214904e-01 -4.1933638e-01 +1320 2.648 -1.7131226e-01 -4.1743824e-01 +1321 2.65 -1.7047928e-01 -4.1554716e-01 +1322 2.652 -1.6965007e-01 -4.1366314e-01 +1323 2.654 -1.6882462e-01 -4.1178617e-01 +1324 2.656 -1.6800292e-01 -4.0991624e-01 +1325 2.658 -1.6718495e-01 -4.0805334e-01 +1326 2.66 -1.6637070e-01 -4.0619746e-01 +1327 2.662 -1.6556016e-01 -4.0434859e-01 +1328 2.664 -1.6475330e-01 -4.0250672e-01 +1329 2.666 -1.6395013e-01 -4.0067184e-01 +1330 2.668 -1.6315061e-01 -3.9884395e-01 +1331 2.67 -1.6235475e-01 -3.9702302e-01 +1332 2.672 -1.6156252e-01 -3.9520906e-01 +1333 2.674 -1.6077391e-01 -3.9340204e-01 +1334 2.676 -1.5998890e-01 -3.9160196e-01 +1335 2.678 -1.5920749e-01 -3.8980881e-01 +1336 2.68 -1.5842966e-01 -3.8802257e-01 +1337 2.682 -1.5765540e-01 -3.8624323e-01 +1338 2.684 -1.5688469e-01 -3.8447079e-01 +1339 2.686 -1.5611751e-01 -3.8270523e-01 +1340 2.688 -1.5535386e-01 -3.8094653e-01 +1341 2.69 -1.5459372e-01 -3.7919469e-01 +1342 2.692 -1.5383708e-01 -3.7744970e-01 +1343 2.694 -1.5308392e-01 -3.7571153e-01 +1344 2.696 -1.5233423e-01 -3.7398018e-01 +1345 2.698 -1.5158799e-01 -3.7225563e-01 +1346 2.7 -1.5084520e-01 -3.7053787e-01 +1347 2.702 -1.5010584e-01 -3.6882690e-01 +1348 2.704 -1.4936989e-01 -3.6712268e-01 +1349 2.706 -1.4863734e-01 -3.6542522e-01 +1350 2.708 -1.4790818e-01 -3.6373449e-01 +1351 2.71 -1.4718240e-01 -3.6205048e-01 +1352 2.712 -1.4645998e-01 -3.6037318e-01 +1353 2.714 -1.4574090e-01 -3.5870258e-01 +1354 2.716 -1.4502516e-01 -3.5703865e-01 +1355 2.718 -1.4431274e-01 -3.5538140e-01 +1356 2.72 -1.4360363e-01 -3.5373079e-01 +1357 2.722 -1.4289781e-01 -3.5208681e-01 +1358 2.724 -1.4219528e-01 -3.5044946e-01 +1359 2.726 -1.4149601e-01 -3.4881872e-01 +1360 2.728 -1.4080000e-01 -3.4719456e-01 +1361 2.73 -1.4010723e-01 -3.4557698e-01 +1362 2.732 -1.3941769e-01 -3.4396596e-01 +1363 2.734 -1.3873136e-01 -3.4236148e-01 +1364 2.736 -1.3804824e-01 -3.4076354e-01 +1365 2.738 -1.3736830e-01 -3.3917210e-01 +1366 2.74 -1.3669154e-01 -3.3758717e-01 +1367 2.742 -1.3601795e-01 -3.3600871e-01 +1368 2.744 -1.3534751e-01 -3.3443672e-01 +1369 2.746 -1.3468020e-01 -3.3287119e-01 +1370 2.748 -1.3401602e-01 -3.3131208e-01 +1371 2.75 -1.3335495e-01 -3.2975939e-01 +1372 2.752 -1.3269697e-01 -3.2821310e-01 +1373 2.754 -1.3204209e-01 -3.2667320e-01 +1374 2.756 -1.3139028e-01 -3.2513966e-01 +1375 2.758 -1.3074153e-01 -3.2361247e-01 +1376 2.76 -1.3009582e-01 -3.2209162e-01 +1377 2.762 -1.2945316e-01 -3.2057709e-01 +1378 2.764 -1.2881351e-01 -3.1906886e-01 +1379 2.766 -1.2817688e-01 -3.1756691e-01 +1380 2.768 -1.2754324e-01 -3.1607122e-01 +1381 2.77 -1.2691259e-01 -3.1458179e-01 +1382 2.772 -1.2628491e-01 -3.1309859e-01 +1383 2.774 -1.2566019e-01 -3.1162160e-01 +1384 2.776 -1.2503842e-01 -3.1015081e-01 +1385 2.778 -1.2441958e-01 -3.0868621e-01 +1386 2.78 -1.2380367e-01 -3.0722776e-01 +1387 2.782 -1.2319067e-01 -3.0577546e-01 +1388 2.784 -1.2258056e-01 -3.0432929e-01 +1389 2.786 -1.2197334e-01 -3.0288923e-01 +1390 2.788 -1.2136900e-01 -3.0145527e-01 +1391 2.79 -1.2076752e-01 -3.0002738e-01 +1392 2.792 -1.2016889e-01 -2.9860554e-01 +1393 2.794 -1.1957309e-01 -2.9718975e-01 +1394 2.796 -1.1898012e-01 -2.9577997e-01 +1395 2.798 -1.1838997e-01 -2.9437621e-01 +1396 2.8 -1.1780262e-01 -2.9297842e-01 +1397 2.802 -1.1721805e-01 -2.9158661e-01 +1398 2.804 -1.1663627e-01 -2.9020074e-01 +1399 2.806 -1.1605724e-01 -2.8882081e-01 +1400 2.808 -1.1548098e-01 -2.8744679e-01 +1401 2.81 -1.1490745e-01 -2.8607867e-01 +1402 2.812 -1.1433666e-01 -2.8471643e-01 +1403 2.814 -1.1376858e-01 -2.8336004e-01 +1404 2.816 -1.1320322e-01 -2.8200950e-01 +1405 2.818 -1.1264054e-01 -2.8066478e-01 +1406 2.82 -1.1208055e-01 -2.7932586e-01 +1407 2.822 -1.1152323e-01 -2.7799273e-01 +1408 2.824 -1.1096858e-01 -2.7666537e-01 +1409 2.826 -1.1041657e-01 -2.7534376e-01 +1410 2.828 -1.0986720e-01 -2.7402788e-01 +1411 2.83 -1.0932045e-01 -2.7271771e-01 +1412 2.832 -1.0877632e-01 -2.7141324e-01 +1413 2.834 -1.0823480e-01 -2.7011445e-01 +1414 2.836 -1.0769586e-01 -2.6882131e-01 +1415 2.838 -1.0715951e-01 -2.6753381e-01 +1416 2.84 -1.0662572e-01 -2.6625193e-01 +1417 2.842 -1.0609450e-01 -2.6497566e-01 +1418 2.844 -1.0556582e-01 -2.6370497e-01 +1419 2.846 -1.0503967e-01 -2.6243984e-01 +1420 2.848 -1.0451605e-01 -2.6118026e-01 +1421 2.85 -1.0399495e-01 -2.5992621e-01 +1422 2.852 -1.0347635e-01 -2.5867767e-01 +1423 2.854 -1.0296023e-01 -2.5743462e-01 +1424 2.856 -1.0244660e-01 -2.5619704e-01 +1425 2.858 -1.0193544e-01 -2.5496492e-01 +1426 2.86 -1.0142674e-01 -2.5373823e-01 +1427 2.862 -1.0092049e-01 -2.5251696e-01 +1428 2.864 -1.0041667e-01 -2.5130109e-01 +1429 2.866 -9.9915278e-02 -2.5009060e-01 +1430 2.868 -9.9416303e-02 -2.4888546e-01 +1431 2.87 -9.8919733e-02 -2.4768568e-01 +1432 2.872 -9.8425557e-02 -2.4649121e-01 +1433 2.874 -9.7933764e-02 -2.4530205e-01 +1434 2.876 -9.7444345e-02 -2.4411818e-01 +1435 2.878 -9.6957288e-02 -2.4293958e-01 +1436 2.88 -9.6472583e-02 -2.4176622e-01 +1437 2.882 -9.5990220e-02 -2.4059810e-01 +1438 2.884 -9.5510187e-02 -2.3943519e-01 +1439 2.886 -9.5032475e-02 -2.3827747e-01 +1440 2.888 -9.4557074e-02 -2.3712493e-01 +1441 2.89 -9.4083972e-02 -2.3597755e-01 +1442 2.892 -9.3613160e-02 -2.3483531e-01 +1443 2.894 -9.3144628e-02 -2.3369818e-01 +1444 2.896 -9.2678364e-02 -2.3256616e-01 +1445 2.898 -9.2214360e-02 -2.3143922e-01 +1446 2.9 -9.1752604e-02 -2.3031735e-01 +1447 2.902 -9.1293087e-02 -2.2920052e-01 +1448 2.904 -9.0835798e-02 -2.2808872e-01 +1449 2.906 -9.0380729e-02 -2.2698194e-01 +1450 2.908 -8.9927867e-02 -2.2588014e-01 +1451 2.91 -8.9477205e-02 -2.2478331e-01 +1452 2.912 -8.9028731e-02 -2.2369144e-01 +1453 2.914 -8.8582436e-02 -2.2260451e-01 +1454 2.916 -8.8138309e-02 -2.2152249e-01 +1455 2.918 -8.7696342e-02 -2.2044537e-01 +1456 2.92 -8.7256525e-02 -2.1937314e-01 +1457 2.922 -8.6818847e-02 -2.1830577e-01 +1458 2.924 -8.6383298e-02 -2.1724324e-01 +1459 2.926 -8.5949870e-02 -2.1618554e-01 +1460 2.928 -8.5518553e-02 -2.1513265e-01 +1461 2.93 -8.5089337e-02 -2.1408455e-01 +1462 2.932 -8.4662212e-02 -2.1304122e-01 +1463 2.934 -8.4237169e-02 -2.1200264e-01 +1464 2.936 -8.3814198e-02 -2.1096880e-01 +1465 2.938 -8.3393290e-02 -2.0993968e-01 +1466 2.94 -8.2974436e-02 -2.0891526e-01 +1467 2.942 -8.2557626e-02 -2.0789553e-01 +1468 2.944 -8.2142851e-02 -2.0688045e-01 +1469 2.946 -8.1730101e-02 -2.0587002e-01 +1470 2.948 -8.1319368e-02 -2.0486423e-01 +1471 2.95 -8.0910641e-02 -2.0386304e-01 +1472 2.952 -8.0503912e-02 -2.0286644e-01 +1473 2.954 -8.0099172e-02 -2.0187442e-01 +1474 2.956 -7.9696412e-02 -2.0088696e-01 +1475 2.958 -7.9295622e-02 -1.9990403e-01 +1476 2.96 -7.8896793e-02 -1.9892563e-01 +1477 2.962 -7.8499916e-02 -1.9795173e-01 +1478 2.964 -7.8104983e-02 -1.9698232e-01 +1479 2.966 -7.7711984e-02 -1.9601737e-01 +1480 2.968 -7.7320910e-02 -1.9505688e-01 +1481 2.97 -7.6931753e-02 -1.9410082e-01 +1482 2.972 -7.6544504e-02 -1.9314918e-01 +1483 2.974 -7.6159154e-02 -1.9220193e-01 +1484 2.976 -7.5775693e-02 -1.9125907e-01 +1485 2.978 -7.5394114e-02 -1.9032057e-01 +1486 2.98 -7.5014408e-02 -1.8938641e-01 +1487 2.982 -7.4636566e-02 -1.8845659e-01 +1488 2.984 -7.4260579e-02 -1.8753108e-01 +1489 2.986 -7.3886439e-02 -1.8660986e-01 +1490 2.988 -7.3514137e-02 -1.8569292e-01 +1491 2.99 -7.3143664e-02 -1.8478024e-01 +1492 2.992 -7.2775013e-02 -1.8387180e-01 +1493 2.994 -7.2408174e-02 -1.8296759e-01 +1494 2.996 -7.2043140e-02 -1.8206759e-01 +1495 2.998 -7.1679901e-02 -1.8117177e-01 +1496 3.0 -7.1318450e-02 -1.8028014e-01 +1497 3.002 -7.0958778e-02 -1.7939266e-01 +1498 3.004 -7.0600876e-02 -1.7850932e-01 +1499 3.006 -7.0244738e-02 -1.7763011e-01 +1500 3.008 -6.9890353e-02 -1.7675500e-01 +1501 3.01 -6.9537715e-02 -1.7588399e-01 +1502 3.012 -6.9186815e-02 -1.7501704e-01 +1503 3.014 -6.8837644e-02 -1.7415416e-01 +1504 3.016 -6.8490195e-02 -1.7329531e-01 +1505 3.018 -6.8144460e-02 -1.7244049e-01 +1506 3.02 -6.7800431e-02 -1.7158968e-01 +1507 3.022 -6.7458099e-02 -1.7074286e-01 +1508 3.024 -6.7117457e-02 -1.6990001e-01 +1509 3.026 -6.6778496e-02 -1.6906112e-01 +1510 3.028 -6.6441209e-02 -1.6822617e-01 +1511 3.03 -6.6105589e-02 -1.6739514e-01 +1512 3.032 -6.5771626e-02 -1.6656803e-01 +1513 3.034 -6.5439314e-02 -1.6574480e-01 +1514 3.036 -6.5108645e-02 -1.6492545e-01 +1515 3.038 -6.4779610e-02 -1.6410997e-01 +1516 3.04 -6.4452202e-02 -1.6329832e-01 +1517 3.042 -6.4126414e-02 -1.6249051e-01 +1518 3.044 -6.3802238e-02 -1.6168650e-01 +1519 3.046 -6.3479665e-02 -1.6088629e-01 +1520 3.048 -6.3158690e-02 -1.6008986e-01 +1521 3.05 -6.2839303e-02 -1.5929720e-01 +1522 3.052 -6.2521499e-02 -1.5850828e-01 +1523 3.054 -6.2205268e-02 -1.5772310e-01 +1524 3.056 -6.1890604e-02 -1.5694163e-01 +1525 3.058 -6.1577499e-02 -1.5616386e-01 +1526 3.06 -6.1265946e-02 -1.5538977e-01 +1527 3.062 -6.0955937e-02 -1.5461936e-01 +1528 3.064 -6.0647466e-02 -1.5385260e-01 +1529 3.066 -6.0340524e-02 -1.5308948e-01 +1530 3.068 -6.0035106e-02 -1.5232998e-01 +1531 3.07 -5.9731202e-02 -1.5157408e-01 +1532 3.072 -5.9428807e-02 -1.5082178e-01 +1533 3.074 -5.9127913e-02 -1.5007306e-01 +1534 3.076 -5.8828512e-02 -1.4932790e-01 +1535 3.078 -5.8530599e-02 -1.4858628e-01 +1536 3.08 -5.8234165e-02 -1.4784819e-01 +1537 3.082 -5.7939204e-02 -1.4711362e-01 +1538 3.084 -5.7645708e-02 -1.4638255e-01 +1539 3.086 -5.7353671e-02 -1.4565496e-01 +1540 3.088 -5.7063086e-02 -1.4493084e-01 +1541 3.09 -5.6773945e-02 -1.4421018e-01 +1542 3.092 -5.6486243e-02 -1.4349296e-01 +1543 3.094 -5.6199971e-02 -1.4277917e-01 +1544 3.096 -5.5915124e-02 -1.4206878e-01 +1545 3.098 -5.5631694e-02 -1.4136179e-01 +1546 3.1 -5.5349674e-02 -1.4065818e-01 +1547 3.102 -5.5069059e-02 -1.3995794e-01 +1548 3.104 -5.4789840e-02 -1.3926105e-01 +1549 3.106 -5.4512012e-02 -1.3856750e-01 +1550 3.108 -5.4235568e-02 -1.3787727e-01 +1551 3.11 -5.3960501e-02 -1.3719034e-01 +1552 3.112 -5.3686805e-02 -1.3650671e-01 +1553 3.114 -5.3414472e-02 -1.3582636e-01 +1554 3.116 -5.3143497e-02 -1.3514927e-01 +1555 3.118 -5.2873873e-02 -1.3447544e-01 +1556 3.12 -5.2605593e-02 -1.3380484e-01 +1557 3.122 -5.2338651e-02 -1.3313746e-01 +1558 3.124 -5.2073041e-02 -1.3247329e-01 +1559 3.126 -5.1808756e-02 -1.3181231e-01 +1560 3.128 -5.1545790e-02 -1.3115451e-01 +1561 3.13 -5.1284136e-02 -1.3049988e-01 +1562 3.132 -5.1023788e-02 -1.2984840e-01 +1563 3.134 -5.0764740e-02 -1.2920006e-01 +1564 3.136 -5.0506986e-02 -1.2855484e-01 +1565 3.138 -5.0250519e-02 -1.2791273e-01 +1566 3.14 -4.9995333e-02 -1.2727371e-01 +1567 3.142 -4.9741422e-02 -1.2663778e-01 +1568 3.144 -4.9488780e-02 -1.2600492e-01 +1569 3.146 -4.9237400e-02 -1.2537511e-01 +1570 3.148 -4.8987277e-02 -1.2474834e-01 +1571 3.15 -4.8738405e-02 -1.2412460e-01 +1572 3.152 -4.8490777e-02 -1.2350388e-01 +1573 3.154 -4.8244387e-02 -1.2288615e-01 +1574 3.156 -4.7999230e-02 -1.2227142e-01 +1575 3.158 -4.7755300e-02 -1.2165965e-01 +1576 3.16 -4.7512590e-02 -1.2105085e-01 +1577 3.162 -4.7271094e-02 -1.2044499e-01 +1578 3.164 -4.7030808e-02 -1.1984207e-01 +1579 3.166 -4.6791724e-02 -1.1924207e-01 +1580 3.168 -4.6553838e-02 -1.1864498e-01 +1581 3.17 -4.6317142e-02 -1.1805078e-01 +1582 3.172 -4.6081632e-02 -1.1745947e-01 +1583 3.174 -4.5847302e-02 -1.1687102e-01 +1584 3.176 -4.5614146e-02 -1.1628543e-01 +1585 3.178 -4.5382159e-02 -1.1570268e-01 +1586 3.18 -4.5151334e-02 -1.1512276e-01 +1587 3.182 -4.4921666e-02 -1.1454566e-01 +1588 3.184 -4.4693149e-02 -1.1397137e-01 +1589 3.186 -4.4465779e-02 -1.1339986e-01 +1590 3.188 -4.4239548e-02 -1.1283114e-01 +1591 3.19 -4.4014452e-02 -1.1226518e-01 +1592 3.192 -4.3790485e-02 -1.1170198e-01 +1593 3.194 -4.3567642e-02 -1.1114152e-01 +1594 3.196 -4.3345918e-02 -1.1058378e-01 +1595 3.198 -4.3125305e-02 -1.1002877e-01 +1596 3.2 -4.2905801e-02 -1.0947646e-01 +1597 3.202 -4.2687398e-02 -1.0892684e-01 +1598 3.204 -4.2470092e-02 -1.0837990e-01 +1599 3.206 -4.2253877e-02 -1.0783562e-01 +1600 3.208 -4.2038747e-02 -1.0729401e-01 +1601 3.21 -4.1824699e-02 -1.0675503e-01 +1602 3.212 -4.1611725e-02 -1.0621869e-01 +1603 3.214 -4.1399822e-02 -1.0568497e-01 +1604 3.216 -4.1188984e-02 -1.0515385e-01 +1605 3.218 -4.0979205e-02 -1.0462533e-01 +1606 3.22 -4.0770481e-02 -1.0409939e-01 +1607 3.222 -4.0562806e-02 -1.0357602e-01 +1608 3.224 -4.0356175e-02 -1.0305522e-01 +1609 3.226 -4.0150583e-02 -1.0253696e-01 +1610 3.228 -3.9946025e-02 -1.0202124e-01 +1611 3.23 -3.9742497e-02 -1.0150804e-01 +1612 3.232 -3.9539992e-02 -1.0099735e-01 +1613 3.234 -3.9338506e-02 -1.0048917e-01 +1614 3.236 -3.9138033e-02 -9.9983475e-02 +1615 3.238 -3.8938570e-02 -9.9480259e-02 +1616 3.24 -3.8740111e-02 -9.8979509e-02 +1617 3.242 -3.8542650e-02 -9.8481216e-02 +1618 3.244 -3.8346184e-02 -9.7985366e-02 +1619 3.246 -3.8150707e-02 -9.7491949e-02 +1620 3.248 -3.7956215e-02 -9.7000953e-02 +1621 3.25 -3.7762702e-02 -9.6512368e-02 +1622 3.252 -3.7570164e-02 -9.6026182e-02 +1623 3.254 -3.7378595e-02 -9.5542384e-02 +1624 3.256 -3.7187993e-02 -9.5060963e-02 +1625 3.258 -3.6998350e-02 -9.4581907e-02 +1626 3.26 -3.6809663e-02 -9.4105207e-02 +1627 3.262 -3.6621928e-02 -9.3630850e-02 +1628 3.264 -3.6435138e-02 -9.3158826e-02 +1629 3.266 -3.6249291e-02 -9.2689125e-02 +1630 3.268 -3.6064380e-02 -9.2221735e-02 +1631 3.27 -3.5880402e-02 -9.1756645e-02 +1632 3.272 -3.5697352e-02 -9.1293845e-02 +1633 3.274 -3.5515225e-02 -9.0833324e-02 +1634 3.276 -3.5334017e-02 -9.0375072e-02 +1635 3.278 -3.5153724e-02 -8.9919078e-02 +1636 3.28 -3.4974340e-02 -8.9465331e-02 +1637 3.282 -3.4795861e-02 -8.9013821e-02 +1638 3.284 -3.4618283e-02 -8.8564537e-02 +1639 3.286 -3.4441601e-02 -8.8117469e-02 +1640 3.288 -3.4265811e-02 -8.7672606e-02 +1641 3.29 -3.4090909e-02 -8.7229939e-02 +1642 3.292 -3.3916890e-02 -8.6789457e-02 +1643 3.294 -3.3743750e-02 -8.6351149e-02 +1644 3.296 -3.3571484e-02 -8.5915006e-02 +1645 3.298 -3.3400089e-02 -8.5481017e-02 +1646 3.3 -3.3229559e-02 -8.5049172e-02 +1647 3.302 -3.3059890e-02 -8.4619461e-02 +1648 3.304 -3.2891079e-02 -8.4191874e-02 +1649 3.306 -3.2723122e-02 -8.3766401e-02 +1650 3.308 -3.2556012e-02 -8.3343032e-02 +1651 3.31 -3.2389748e-02 -8.2921757e-02 +1652 3.312 -3.2224324e-02 -8.2502566e-02 +1653 3.314 -3.2059736e-02 -8.2085450e-02 +1654 3.316 -3.1895981e-02 -8.1670398e-02 +1655 3.318 -3.1733053e-02 -8.1257402e-02 +1656 3.32 -3.1570950e-02 -8.0846450e-02 +1657 3.322 -3.1409666e-02 -8.0437534e-02 +1658 3.324 -3.1249198e-02 -8.0030643e-02 +1659 3.326 -3.1089542e-02 -7.9625769e-02 +1660 3.328 -3.0930694e-02 -7.9222901e-02 +1661 3.33 -3.0772649e-02 -7.8822031e-02 +1662 3.332 -3.0615405e-02 -7.8423148e-02 +1663 3.334 -3.0458956e-02 -7.8026244e-02 +1664 3.336 -3.0303298e-02 -7.7631308e-02 +1665 3.338 -3.0148429e-02 -7.7238332e-02 +1666 3.34 -2.9994344e-02 -7.6847307e-02 +1667 3.342 -2.9841038e-02 -7.6458222e-02 +1668 3.344 -2.9688509e-02 -7.6071069e-02 +1669 3.346 -2.9536753e-02 -7.5685838e-02 +1670 3.348 -2.9385765e-02 -7.5302521e-02 +1671 3.35 -2.9235542e-02 -7.4921108e-02 +1672 3.352 -2.9086079e-02 -7.4541590e-02 +1673 3.354 -2.8937374e-02 -7.4163959e-02 +1674 3.356 -2.8789422e-02 -7.3788205e-02 +1675 3.358 -2.8642220e-02 -7.3414318e-02 +1676 3.36 -2.8495764e-02 -7.3042292e-02 +1677 3.362 -2.8350049e-02 -7.2672115e-02 +1678 3.364 -2.8205074e-02 -7.2303780e-02 +1679 3.366 -2.8060833e-02 -7.1937278e-02 +1680 3.368 -2.7917324e-02 -7.1572600e-02 +1681 3.37 -2.7774541e-02 -7.1209738e-02 +1682 3.372 -2.7632483e-02 -7.0848682e-02 +1683 3.374 -2.7491146e-02 -7.0489424e-02 +1684 3.376 -2.7350524e-02 -7.0131955e-02 +1685 3.378 -2.7210617e-02 -6.9776267e-02 +1686 3.38 -2.7071418e-02 -6.9422351e-02 +1687 3.382 -2.6932926e-02 -6.9070199e-02 +1688 3.384 -2.6795136e-02 -6.8719802e-02 +1689 3.386 -2.6658046e-02 -6.8371153e-02 +1690 3.388 -2.6521651e-02 -6.8024241e-02 +1691 3.39 -2.6385947e-02 -6.7679060e-02 +1692 3.392 -2.6250933e-02 -6.7335600e-02 +1693 3.394 -2.6116604e-02 -6.6993855e-02 +1694 3.396 -2.5982957e-02 -6.6653814e-02 +1695 3.398 -2.5849988e-02 -6.6315470e-02 +1696 3.4 -2.5717694e-02 -6.5978816e-02 +1697 3.402 -2.5586071e-02 -6.5643842e-02 +1698 3.404 -2.5455117e-02 -6.5310541e-02 +1699 3.406 -2.5324828e-02 -6.4978904e-02 +1700 3.408 -2.5195200e-02 -6.4648924e-02 +1701 3.41 -2.5066231e-02 -6.4320593e-02 +1702 3.412 -2.4937917e-02 -6.3993902e-02 +1703 3.414 -2.4810254e-02 -6.3668845e-02 +1704 3.416 -2.4683240e-02 -6.3345412e-02 +1705 3.418 -2.4556872e-02 -6.3023596e-02 +1706 3.42 -2.4431145e-02 -6.2703389e-02 +1707 3.422 -2.4306057e-02 -6.2384783e-02 +1708 3.424 -2.4181605e-02 -6.2067772e-02 +1709 3.426 -2.4057785e-02 -6.1752346e-02 +1710 3.428 -2.3934594e-02 -6.1438499e-02 +1711 3.43 -2.3812030e-02 -6.1126222e-02 +1712 3.432 -2.3690088e-02 -6.0815508e-02 +1713 3.434 -2.3568767e-02 -6.0506350e-02 +1714 3.436 -2.3448062e-02 -6.0198740e-02 +1715 3.438 -2.3327971e-02 -5.9892670e-02 +1716 3.44 -2.3208490e-02 -5.9588133e-02 +1717 3.442 -2.3089617e-02 -5.9285122e-02 +1718 3.444 -2.2971349e-02 -5.8983628e-02 +1719 3.446 -2.2853682e-02 -5.8683646e-02 +1720 3.448 -2.2736613e-02 -5.8385167e-02 +1721 3.45 -2.2620140e-02 -5.8088184e-02 +1722 3.452 -2.2504259e-02 -5.7792690e-02 +1723 3.454 -2.2388968e-02 -5.7498678e-02 +1724 3.456 -2.2274264e-02 -5.7206140e-02 +1725 3.458 -2.2160143e-02 -5.6915069e-02 +1726 3.46 -2.2046603e-02 -5.6625458e-02 +1727 3.462 -2.1933640e-02 -5.6337301e-02 +1728 3.464 -2.1821252e-02 -5.6050589e-02 +1729 3.466 -2.1709437e-02 -5.5765316e-02 +1730 3.468 -2.1598190e-02 -5.5481475e-02 +1731 3.47 -2.1487510e-02 -5.5199059e-02 +1732 3.472 -2.1377393e-02 -5.4918061e-02 +1733 3.474 -2.1267837e-02 -5.4638474e-02 +1734 3.476 -2.1158838e-02 -5.4360291e-02 +1735 3.478 -2.1050395e-02 -5.4083506e-02 +1736 3.48 -2.0942503e-02 -5.3808111e-02 +1737 3.482 -2.0835161e-02 -5.3534099e-02 +1738 3.484 -2.0728366e-02 -5.3261465e-02 +1739 3.486 -2.0622114e-02 -5.2990200e-02 +1740 3.488 -2.0516404e-02 -5.2720300e-02 +1741 3.49 -2.0411232e-02 -5.2451756e-02 +1742 3.492 -2.0306596e-02 -5.2184562e-02 +1743 3.494 -2.0202493e-02 -5.1918712e-02 +1744 3.496 -2.0098920e-02 -5.1654199e-02 +1745 3.498 -1.9995875e-02 -5.1391016e-02 +1746 3.5 -1.9893356e-02 -5.1129158e-02 +1747 3.502 -1.9791358e-02 -5.0868616e-02 +1748 3.504 -1.9689880e-02 -5.0609386e-02 +1749 3.506 -1.9588920e-02 -5.0351461e-02 +1750 3.508 -1.9488473e-02 -5.0094833e-02 +1751 3.51 -1.9388539e-02 -4.9839498e-02 +1752 3.512 -1.9289115e-02 -4.9585448e-02 +1753 3.514 -1.9190197e-02 -4.9332677e-02 +1754 3.516 -1.9091783e-02 -4.9081180e-02 +1755 3.518 -1.8993871e-02 -4.8830949e-02 +1756 3.52 -1.8896458e-02 -4.8581978e-02 +1757 3.522 -1.8799542e-02 -4.8334262e-02 +1758 3.524 -1.8703121e-02 -4.8087793e-02 +1759 3.526 -1.8607190e-02 -4.7842567e-02 +1760 3.528 -1.8511749e-02 -4.7598577e-02 +1761 3.53 -1.8416795e-02 -4.7355816e-02 +1762 3.532 -1.8322325e-02 -4.7114280e-02 +1763 3.534 -1.8228337e-02 -4.6873960e-02 +1764 3.536 -1.8134829e-02 -4.6634853e-02 +1765 3.538 -1.8041797e-02 -4.6396952e-02 +1766 3.54 -1.7949240e-02 -4.6160250e-02 +1767 3.542 -1.7857155e-02 -4.5924742e-02 +1768 3.544 -1.7765540e-02 -4.5690423e-02 +1769 3.546 -1.7674393e-02 -4.5457285e-02 +1770 3.548 -1.7583710e-02 -4.5225324e-02 +1771 3.55 -1.7493491e-02 -4.4994533e-02 +1772 3.552 -1.7403732e-02 -4.4764908e-02 +1773 3.554 -1.7314430e-02 -4.4536441e-02 +1774 3.556 -1.7225585e-02 -4.4309128e-02 +1775 3.558 -1.7137193e-02 -4.4082962e-02 +1776 3.56 -1.7049252e-02 -4.3857938e-02 +1777 3.562 -1.6961761e-02 -4.3634051e-02 +1778 3.564 -1.6874715e-02 -4.3411295e-02 +1779 3.566 -1.6788115e-02 -4.3189663e-02 +1780 3.568 -1.6701956e-02 -4.2969151e-02 +1781 3.57 -1.6616237e-02 -4.2749754e-02 +1782 3.572 -1.6530956e-02 -4.2531464e-02 +1783 3.574 -1.6446111e-02 -4.2314278e-02 +1784 3.576 -1.6361698e-02 -4.2098190e-02 +1785 3.578 -1.6277717e-02 -4.1883194e-02 +1786 3.58 -1.6194165e-02 -4.1669284e-02 +1787 3.582 -1.6111039e-02 -4.1456456e-02 +1788 3.584 -1.6028338e-02 -4.1244704e-02 +1789 3.586 -1.5946060e-02 -4.1034023e-02 +1790 3.588 -1.5864202e-02 -4.0824407e-02 +1791 3.59 -1.5782762e-02 -4.0615852e-02 +1792 3.592 -1.5701737e-02 -4.0408351e-02 +1793 3.594 -1.5621127e-02 -4.0201900e-02 +1794 3.596 -1.5540929e-02 -3.9996493e-02 +1795 3.598 -1.5461141e-02 -3.9792126e-02 +1796 3.6 -1.5381760e-02 -3.9588793e-02 +1797 3.602 -1.5302785e-02 -3.9386489e-02 +1798 3.604 -1.5224213e-02 -3.9185209e-02 +1799 3.606 -1.5146043e-02 -3.8984948e-02 +1800 3.608 -1.5068273e-02 -3.8785700e-02 +1801 3.61 -1.4990900e-02 -3.8587462e-02 +1802 3.612 -1.4913922e-02 -3.8390227e-02 +1803 3.614 -1.4837338e-02 -3.8193990e-02 +1804 3.616 -1.4761146e-02 -3.7998748e-02 +1805 3.618 -1.4685343e-02 -3.7804494e-02 +1806 3.62 -1.4609927e-02 -3.7611225e-02 +1807 3.622 -1.4534897e-02 -3.7418934e-02 +1808 3.624 -1.4460251e-02 -3.7227618e-02 +1809 3.626 -1.4385986e-02 -3.7037271e-02 +1810 3.628 -1.4312101e-02 -3.6847888e-02 +1811 3.63 -1.4238594e-02 -3.6659466e-02 +1812 3.632 -1.4165462e-02 -3.6471998e-02 +1813 3.634 -1.4092705e-02 -3.6285480e-02 +1814 3.636 -1.4020320e-02 -3.6099908e-02 +1815 3.638 -1.3948305e-02 -3.5915277e-02 +1816 3.64 -1.3876658e-02 -3.5731582e-02 +1817 3.642 -1.3805378e-02 -3.5548818e-02 +1818 3.644 -1.3734462e-02 -3.5366981e-02 +1819 3.646 -1.3663909e-02 -3.5186067e-02 +1820 3.648 -1.3593717e-02 -3.5006069e-02 +1821 3.65 -1.3523885e-02 -3.4826985e-02 +1822 3.652 -1.3454409e-02 -3.4648809e-02 +1823 3.654 -1.3385289e-02 -3.4471538e-02 +1824 3.656 -1.3316522e-02 -3.4295165e-02 +1825 3.658 -1.3248107e-02 -3.4119688e-02 +1826 3.66 -1.3180043e-02 -3.3945101e-02 +1827 3.662 -1.3112326e-02 -3.3771400e-02 +1828 3.664 -1.3044957e-02 -3.3598581e-02 +1829 3.666 -1.2977932e-02 -3.3426639e-02 +1830 3.668 -1.2911249e-02 -3.3255569e-02 +1831 3.67 -1.2844909e-02 -3.3085369e-02 +1832 3.672 -1.2778907e-02 -3.2916032e-02 +1833 3.674 -1.2713244e-02 -3.2747555e-02 +1834 3.676 -1.2647917e-02 -3.2579934e-02 +1835 3.678 -1.2582924e-02 -3.2413164e-02 +1836 3.68 -1.2518263e-02 -3.2247241e-02 +1837 3.682 -1.2453934e-02 -3.2082161e-02 +1838 3.684 -1.2389934e-02 -3.1917919e-02 +1839 3.686 -1.2326262e-02 -3.1754512e-02 +1840 3.688 -1.2262916e-02 -3.1591935e-02 +1841 3.69 -1.2199894e-02 -3.1430183e-02 +1842 3.692 -1.2137194e-02 -3.1269254e-02 +1843 3.694 -1.2074816e-02 -3.1109143e-02 +1844 3.696 -1.2012757e-02 -3.0949845e-02 +1845 3.698 -1.1951016e-02 -3.0791357e-02 +1846 3.7 -1.1889591e-02 -3.0633675e-02 +1847 3.702 -1.1828481e-02 -3.0476794e-02 +1848 3.704 -1.1767684e-02 -3.0320711e-02 +1849 3.706 -1.1707198e-02 -3.0165421e-02 +1850 3.708 -1.1647021e-02 -3.0010921e-02 +1851 3.71 -1.1587153e-02 -2.9857206e-02 +1852 3.712 -1.1527592e-02 -2.9704273e-02 +1853 3.714 -1.1468336e-02 -2.9552118e-02 +1854 3.716 -1.1409383e-02 -2.9400737e-02 +1855 3.718 -1.1350732e-02 -2.9250125e-02 +1856 3.72 -1.1292382e-02 -2.9100280e-02 +1857 3.722 -1.1234331e-02 -2.8951197e-02 +1858 3.724 -1.1176577e-02 -2.8802873e-02 +1859 3.726 -1.1119119e-02 -2.8655303e-02 +1860 3.728 -1.1061955e-02 -2.8508484e-02 +1861 3.73 -1.1005084e-02 -2.8362413e-02 +1862 3.732 -1.0948505e-02 -2.8217084e-02 +1863 3.734 -1.0892215e-02 -2.8072495e-02 +1864 3.736 -1.0836214e-02 -2.7928642e-02 +1865 3.738 -1.0780500e-02 -2.7785522e-02 +1866 3.74 -1.0725072e-02 -2.7643130e-02 +1867 3.742 -1.0669927e-02 -2.7501462e-02 +1868 3.744 -1.0615065e-02 -2.7360517e-02 +1869 3.746 -1.0560485e-02 -2.7220288e-02 +1870 3.748 -1.0506184e-02 -2.7080774e-02 +1871 3.75 -1.0452161e-02 -2.6941970e-02 +1872 3.752 -1.0398415e-02 -2.6803873e-02 +1873 3.754 -1.0344945e-02 -2.6666479e-02 +1874 3.756 -1.0291749e-02 -2.6529785e-02 +1875 3.758 -1.0238826e-02 -2.6393788e-02 +1876 3.76 -1.0186173e-02 -2.6258483e-02 +1877 3.762 -1.0133791e-02 -2.6123867e-02 +1878 3.764 -1.0081678e-02 -2.5989937e-02 +1879 3.766 -1.0029831e-02 -2.5856690e-02 +1880 3.768 -9.9782503e-03 -2.5724121e-02 +1881 3.77 -9.9269341e-03 -2.5592228e-02 +1882 3.772 -9.8758810e-03 -2.5461007e-02 +1883 3.774 -9.8250896e-03 -2.5330455e-02 +1884 3.776 -9.7745587e-03 -2.5200569e-02 +1885 3.778 -9.7242869e-03 -2.5071344e-02 +1886 3.78 -9.6742729e-03 -2.4942778e-02 +1887 3.782 -9.6245154e-03 -2.4814867e-02 +1888 3.784 -9.5750130e-03 -2.4687608e-02 +1889 3.786 -9.5257645e-03 -2.4560998e-02 +1890 3.788 -9.4767686e-03 -2.4435034e-02 +1891 3.79 -9.4280239e-03 -2.4309712e-02 +1892 3.792 -9.3795293e-03 -2.4185029e-02 +1893 3.794 -9.3312834e-03 -2.4060981e-02 +1894 3.796 -9.2832850e-03 -2.3937567e-02 +1895 3.798 -9.2355327e-03 -2.3814782e-02 +1896 3.8 -9.1880254e-03 -2.3692623e-02 +1897 3.802 -9.1407618e-03 -2.3571087e-02 +1898 3.804 -9.0937407e-03 -2.3450171e-02 +1899 3.806 -9.0469607e-03 -2.3329871e-02 +1900 3.808 -9.0004208e-03 -2.3210186e-02 +1901 3.81 -8.9541196e-03 -2.3091111e-02 +1902 3.812 -8.9080559e-03 -2.2972644e-02 +1903 3.814 -8.8622286e-03 -2.2854781e-02 +1904 3.816 -8.8166364e-03 -2.2737520e-02 +1905 3.818 -8.7712781e-03 -2.2620856e-02 +1906 3.82 -8.7261526e-03 -2.2504789e-02 +1907 3.822 -8.6812586e-03 -2.2389313e-02 +1908 3.824 -8.6365949e-03 -2.2274427e-02 +1909 3.826 -8.5921605e-03 -2.2160128e-02 +1910 3.828 -8.5479540e-03 -2.2046412e-02 +1911 3.83 -8.5039744e-03 -2.1933276e-02 +1912 3.832 -8.4602205e-03 -2.1820718e-02 +1913 3.834 -8.4166912e-03 -2.1708735e-02 +1914 3.836 -8.3733852e-03 -2.1597323e-02 +1915 3.838 -8.3303015e-03 -2.1486480e-02 +1916 3.84 -8.2874389e-03 -2.1376203e-02 +1917 3.842 -8.2447963e-03 -2.1266489e-02 +1918 3.844 -8.2023726e-03 -2.1157336e-02 +1919 3.846 -8.1601666e-03 -2.1048740e-02 +1920 3.848 -8.1181772e-03 -2.0940698e-02 +1921 3.85 -8.0764034e-03 -2.0833208e-02 +1922 3.852 -8.0348440e-03 -2.0726268e-02 +1923 3.854 -7.9934980e-03 -2.0619873e-02 +1924 3.856 -7.9523642e-03 -2.0514022e-02 +1925 3.858 -7.9114415e-03 -2.0408712e-02 +1926 3.86 -7.8707290e-03 -2.0303940e-02 +1927 3.862 -7.8302254e-03 -2.0199703e-02 +1928 3.864 -7.7899298e-03 -2.0095999e-02 +1929 3.866 -7.7498411e-03 -1.9992824e-02 +1930 3.868 -7.7099582e-03 -1.9890177e-02 +1931 3.87 -7.6702800e-03 -1.9788054e-02 +1932 3.872 -7.6308056e-03 -1.9686453e-02 +1933 3.874 -7.5915339e-03 -1.9585372e-02 +1934 3.876 -7.5524638e-03 -1.9484807e-02 +1935 3.878 -7.5135943e-03 -1.9384756e-02 +1936 3.88 -7.4749244e-03 -1.9285216e-02 +1937 3.882 -7.4364531e-03 -1.9186185e-02 +1938 3.884 -7.3981793e-03 -1.9087660e-02 +1939 3.886 -7.3601021e-03 -1.8989639e-02 +1940 3.888 -7.3222204e-03 -1.8892120e-02 +1941 3.89 -7.2845333e-03 -1.8795098e-02 +1942 3.892 -7.2470397e-03 -1.8698573e-02 +1943 3.894 -7.2097387e-03 -1.8602541e-02 +1944 3.896 -7.1726292e-03 -1.8507000e-02 +1945 3.898 -7.1357104e-03 -1.8411948e-02 +1946 3.9 -7.0989811e-03 -1.8317382e-02 +1947 3.902 -7.0624405e-03 -1.8223300e-02 +1948 3.904 -7.0260876e-03 -1.8129698e-02 +1949 3.906 -6.9899214e-03 -1.8036576e-02 +1950 3.908 -6.9539410e-03 -1.7943929e-02 +1951 3.91 -6.9181454e-03 -1.7851757e-02 +1952 3.912 -6.8825336e-03 -1.7760056e-02 +1953 3.914 -6.8471048e-03 -1.7668824e-02 +1954 3.916 -6.8118580e-03 -1.7578058e-02 +1955 3.918 -6.7767923e-03 -1.7487757e-02 +1956 3.92 -6.7419067e-03 -1.7397918e-02 +1957 3.922 -6.7072003e-03 -1.7308539e-02 +1958 3.924 -6.6726722e-03 -1.7219617e-02 +1959 3.926 -6.6383215e-03 -1.7131150e-02 +1960 3.928 -6.6041473e-03 -1.7043135e-02 +1961 3.93 -6.5701487e-03 -1.6955571e-02 +1962 3.932 -6.5363247e-03 -1.6868455e-02 +1963 3.934 -6.5026746e-03 -1.6781785e-02 +1964 3.936 -6.4691973e-03 -1.6695558e-02 +1965 3.938 -6.4358920e-03 -1.6609773e-02 +1966 3.94 -6.4027579e-03 -1.6524427e-02 +1967 3.942 -6.3697940e-03 -1.6439517e-02 +1968 3.944 -6.3369996e-03 -1.6355043e-02 +1969 3.946 -6.3043736e-03 -1.6271000e-02 +1970 3.948 -6.2719153e-03 -1.6187388e-02 +1971 3.95 -6.2396238e-03 -1.6104204e-02 +1972 3.952 -6.2074982e-03 -1.6021445e-02 +1973 3.954 -6.1755377e-03 -1.5939111e-02 +1974 3.956 -6.1437415e-03 -1.5857197e-02 +1975 3.958 -6.1121086e-03 -1.5775704e-02 +1976 3.96 -6.0806384e-03 -1.5694627e-02 +1977 3.962 -6.0493298e-03 -1.5613966e-02 +1978 3.964 -6.0181822e-03 -1.5533717e-02 +1979 3.966 -5.9871947e-03 -1.5453880e-02 +1980 3.968 -5.9563664e-03 -1.5374451e-02 +1981 3.97 -5.9256966e-03 -1.5295430e-02 +1982 3.972 -5.8951844e-03 -1.5216812e-02 +1983 3.974 -5.8648291e-03 -1.5138598e-02 +1984 3.976 -5.8346298e-03 -1.5060784e-02 +1985 3.978 -5.8045857e-03 -1.4983369e-02 +1986 3.98 -5.7746960e-03 -1.4906350e-02 +1987 3.982 -5.7449600e-03 -1.4829726e-02 +1988 3.984 -5.7153769e-03 -1.4753494e-02 +1989 3.986 -5.6859458e-03 -1.4677652e-02 +1990 3.988 -5.6566660e-03 -1.4602200e-02 +1991 3.99 -5.6275367e-03 -1.4527133e-02 +1992 3.992 -5.5985572e-03 -1.4452452e-02 +1993 3.994 -5.5697267e-03 -1.4378153e-02 +1994 3.996 -5.5410444e-03 -1.4304234e-02 +1995 3.998 -5.5125095e-03 -1.4230695e-02 +1996 4.0 -5.4841213e-03 -1.4157532e-02 +1997 4.002 -5.4558791e-03 -1.4084744e-02 +1998 4.004 -5.4277821e-03 -1.4012329e-02 +1999 4.006 -5.3998295e-03 -1.3940285e-02 +2000 4.008 -5.3720207e-03 -1.3868610e-02 +2001 4.01 -5.3443549e-03 -1.3797303e-02 +2002 4.012 -5.3168313e-03 -1.3726361e-02 +2003 4.014 -5.2894492e-03 -1.3655783e-02 +2004 4.016 -5.2622079e-03 -1.3585566e-02 +2005 4.018 -5.2351067e-03 -1.3515709e-02 +2006 4.02 -5.2081448e-03 -1.3446211e-02 +2007 4.022 -5.1813216e-03 -1.3377068e-02 +2008 4.024 -5.1546363e-03 -1.3308280e-02 +2009 4.026 -5.1280882e-03 -1.3239845e-02 +2010 4.028 -5.1016767e-03 -1.3171760e-02 +2011 4.03 -5.0754010e-03 -1.3104025e-02 +2012 4.032 -5.0492604e-03 -1.3036637e-02 +2013 4.034 -5.0232542e-03 -1.2969594e-02 +2014 4.036 -4.9973818e-03 -1.2902895e-02 +2015 4.038 -4.9716424e-03 -1.2836538e-02 +2016 4.04 -4.9460354e-03 -1.2770521e-02 +2017 4.042 -4.9205601e-03 -1.2704842e-02 +2018 4.044 -4.8952158e-03 -1.2639501e-02 +2019 4.046 -4.8700018e-03 -1.2574494e-02 +2020 4.048 -4.8449176e-03 -1.2509821e-02 +2021 4.05 -4.8199623e-03 -1.2445480e-02 +2022 4.052 -4.7951354e-03 -1.2381468e-02 +2023 4.054 -4.7704362e-03 -1.2317785e-02 +2024 4.056 -4.7458641e-03 -1.2254428e-02 +2025 4.058 -4.7214183e-03 -1.2191396e-02 +2026 4.06 -4.6970983e-03 -1.2128688e-02 +2027 4.062 -4.6729034e-03 -1.2066301e-02 +2028 4.064 -4.6488329e-03 -1.2004234e-02 +2029 4.066 -4.6248862e-03 -1.1942486e-02 +2030 4.068 -4.6010627e-03 -1.1881054e-02 +2031 4.07 -4.5773618e-03 -1.1819937e-02 +2032 4.072 -4.5537828e-03 -1.1759134e-02 +2033 4.074 -4.5303250e-03 -1.1698643e-02 +2034 4.076 -4.5069880e-03 -1.1638462e-02 +2035 4.078 -4.4837710e-03 -1.1578590e-02 +2036 4.08 -4.4606734e-03 -1.1519025e-02 +2037 4.082 -4.4376947e-03 -1.1459766e-02 +2038 4.084 -4.4148341e-03 -1.1400810e-02 +2039 4.086 -4.3920912e-03 -1.1342157e-02 +2040 4.088 -4.3694653e-03 -1.1283806e-02 +2041 4.09 -4.3469558e-03 -1.1225753e-02 +2042 4.092 -4.3245621e-03 -1.1167998e-02 +2043 4.094 -4.3022836e-03 -1.1110540e-02 +2044 4.096 -4.2801198e-03 -1.1053377e-02 +2045 4.098 -4.2580699e-03 -1.0996507e-02 +2046 4.1 -4.2361335e-03 -1.0939928e-02 +2047 4.102 -4.2143100e-03 -1.0883641e-02 +2048 4.104 -4.1925988e-03 -1.0827642e-02 +2049 4.106 -4.1709992e-03 -1.0771930e-02 +2050 4.108 -4.1495109e-03 -1.0716504e-02 +2051 4.11 -4.1281330e-03 -1.0661363e-02 +2052 4.112 -4.1068652e-03 -1.0606505e-02 +2053 4.114 -4.0857068e-03 -1.0551928e-02 +2054 4.116 -4.0646573e-03 -1.0497632e-02 +2055 4.118 -4.0437161e-03 -1.0443614e-02 +2056 4.12 -4.0228827e-03 -1.0389874e-02 +2057 4.122 -4.0021564e-03 -1.0336409e-02 +2058 4.124 -3.9815369e-03 -1.0283219e-02 +2059 4.126 -3.9610234e-03 -1.0230302e-02 +2060 4.128 -3.9406155e-03 -1.0177656e-02 +2061 4.13 -3.9203126e-03 -1.0125281e-02 +2062 4.132 -3.9001142e-03 -1.0073175e-02 +2063 4.134 -3.8800197e-03 -1.0021336e-02 +2064 4.136 -3.8600286e-03 -9.9697632e-03 +2065 4.138 -3.8401405e-03 -9.9184553e-03 +2066 4.14 -3.8203547e-03 -9.8674109e-03 +2067 4.142 -3.8006707e-03 -9.8166286e-03 +2068 4.144 -3.7810880e-03 -9.7661070e-03 +2069 4.146 -3.7616061e-03 -9.7158448e-03 +2070 4.148 -3.7422244e-03 -9.6658407e-03 +2071 4.15 -3.7229425e-03 -9.6160934e-03 +2072 4.152 -3.7037599e-03 -9.5666015e-03 +2073 4.154 -3.6846759e-03 -9.5173638e-03 +2074 4.156 -3.6656902e-03 -9.4683790e-03 +2075 4.158 -3.6468023e-03 -9.4196457e-03 +2076 4.16 -3.6280115e-03 -9.3711627e-03 +2077 4.162 -3.6093174e-03 -9.3229287e-03 +2078 4.164 -3.5907196e-03 -9.2749424e-03 +2079 4.166 -3.5722175e-03 -9.2272025e-03 +2080 4.168 -3.5538106e-03 -9.1797079e-03 +2081 4.17 -3.5354985e-03 -9.1324572e-03 +2082 4.172 -3.5172807e-03 -9.0854492e-03 +2083 4.174 -3.4991566e-03 -9.0386826e-03 +2084 4.176 -3.4811258e-03 -8.9921562e-03 +2085 4.178 -3.4631878e-03 -8.9458689e-03 +2086 4.18 -3.4453421e-03 -8.8998193e-03 +2087 4.182 -3.4275883e-03 -8.8540063e-03 +2088 4.184 -3.4099259e-03 -8.8084286e-03 +2089 4.186 -3.3923545e-03 -8.7630850e-03 +2090 4.188 -3.3748735e-03 -8.7179744e-03 +2091 4.19 -3.3574824e-03 -8.6730955e-03 +2092 4.192 -3.3401809e-03 -8.6284472e-03 +2093 4.194 -3.3229685e-03 -8.5840283e-03 +2094 4.196 -3.3058446e-03 -8.5398375e-03 +2095 4.198 -3.2888090e-03 -8.4958739e-03 +2096 4.2 -3.2718610e-03 -8.4521360e-03 +2097 4.202 -3.2550003e-03 -8.4086230e-03 +2098 4.204 -3.2382264e-03 -8.3653334e-03 +2099 4.206 -3.2215388e-03 -8.3222664e-03 +2100 4.208 -3.2049371e-03 -8.2794206e-03 +2101 4.21 -3.1884210e-03 -8.2367949e-03 +2102 4.212 -3.1719898e-03 -8.1943883e-03 +2103 4.214 -3.1556433e-03 -8.1521996e-03 +2104 4.216 -3.1393809e-03 -8.1102277e-03 +2105 4.218 -3.1232022e-03 -8.0684715e-03 +2106 4.22 -3.1071069e-03 -8.0269299e-03 +2107 4.222 -3.0910944e-03 -7.9856017e-03 +2108 4.224 -3.0751643e-03 -7.9444859e-03 +2109 4.226 -3.0593163e-03 -7.9035815e-03 +2110 4.228 -3.0435498e-03 -7.8628872e-03 +2111 4.23 -3.0278646e-03 -7.8224021e-03 +2112 4.232 -3.0122601e-03 -7.7821251e-03 +2113 4.234 -2.9967359e-03 -7.7420551e-03 +2114 4.236 -2.9812917e-03 -7.7021910e-03 +2115 4.238 -2.9659270e-03 -7.6625318e-03 +2116 4.24 -2.9506415e-03 -7.6230765e-03 +2117 4.242 -2.9354346e-03 -7.5838239e-03 +2118 4.244 -2.9203060e-03 -7.5447731e-03 +2119 4.246 -2.9052554e-03 -7.5059231e-03 +2120 4.248 -2.8902822e-03 -7.4672727e-03 +2121 4.25 -2.8753862e-03 -7.4288210e-03 +2122 4.252 -2.8605668e-03 -7.3905670e-03 +2123 4.254 -2.8458238e-03 -7.3525096e-03 +2124 4.256 -2.8311566e-03 -7.3146479e-03 +2125 4.258 -2.8165650e-03 -7.2769808e-03 +2126 4.26 -2.8020486e-03 -7.2395073e-03 +2127 4.262 -2.7876069e-03 -7.2022265e-03 +2128 4.264 -2.7732395e-03 -7.1651373e-03 +2129 4.266 -2.7589462e-03 -7.1282388e-03 +2130 4.268 -2.7447265e-03 -7.0915300e-03 +2131 4.27 -2.7305800e-03 -7.0550100e-03 +2132 4.272 -2.7165063e-03 -7.0186777e-03 +2133 4.274 -2.7025051e-03 -6.9825322e-03 +2134 4.276 -2.6885760e-03 -6.9465725e-03 +2135 4.278 -2.6747187e-03 -6.9107978e-03 +2136 4.28 -2.6609327e-03 -6.8752069e-03 +2137 4.282 -2.6472178e-03 -6.8397991e-03 +2138 4.284 -2.6335734e-03 -6.8045734e-03 +2139 4.286 -2.6199993e-03 -6.7695287e-03 +2140 4.288 -2.6064952e-03 -6.7346643e-03 +2141 4.29 -2.5930606e-03 -6.6999792e-03 +2142 4.292 -2.5796951e-03 -6.6654724e-03 +2143 4.294 -2.5663986e-03 -6.6311430e-03 +2144 4.296 -2.5531705e-03 -6.5969902e-03 +2145 4.298 -2.5400105e-03 -6.5630130e-03 +2146 4.3 -2.5269183e-03 -6.5292105e-03 +2147 4.302 -2.5138935e-03 -6.4955819e-03 +2148 4.304 -2.5009358e-03 -6.4621262e-03 +2149 4.306 -2.4880449e-03 -6.4288426e-03 +2150 4.308 -2.4752204e-03 -6.3957301e-03 +2151 4.31 -2.4624619e-03 -6.3627879e-03 +2152 4.312 -2.4497691e-03 -6.3300152e-03 +2153 4.314 -2.4371417e-03 -6.2974110e-03 +2154 4.316 -2.4245793e-03 -6.2649745e-03 +2155 4.318 -2.4120817e-03 -6.2327048e-03 +2156 4.32 -2.3996484e-03 -6.2006011e-03 +2157 4.322 -2.3872792e-03 -6.1686626e-03 +2158 4.324 -2.3749736e-03 -6.1368882e-03 +2159 4.326 -2.3627315e-03 -6.1052774e-03 +2160 4.328 -2.3505524e-03 -6.0738291e-03 +2161 4.33 -2.3384361e-03 -6.0425426e-03 +2162 4.332 -2.3263822e-03 -6.0114170e-03 +2163 4.334 -2.3143903e-03 -5.9804515e-03 +2164 4.336 -2.3024602e-03 -5.9496453e-03 +2165 4.338 -2.2905916e-03 -5.9189976e-03 +2166 4.34 -2.2787841e-03 -5.8885075e-03 +2167 4.342 -2.2670375e-03 -5.8581743e-03 +2168 4.344 -2.2553513e-03 -5.8279971e-03 +2169 4.346 -2.2437254e-03 -5.7979751e-03 +2170 4.348 -2.2321593e-03 -5.7681076e-03 +2171 4.35 -2.2206529e-03 -5.7383938e-03 +2172 4.352 -2.2092057e-03 -5.7088328e-03 +2173 4.354 -2.1978174e-03 -5.6794239e-03 +2174 4.356 -2.1864879e-03 -5.6501663e-03 +2175 4.358 -2.1752167e-03 -5.6210592e-03 +2176 4.36 -2.1640035e-03 -5.5921018e-03 +2177 4.362 -2.1528482e-03 -5.5632935e-03 +2178 4.364 -2.1417503e-03 -5.5346333e-03 +2179 4.366 -2.1307095e-03 -5.5061207e-03 +2180 4.368 -2.1197257e-03 -5.4777547e-03 +2181 4.37 -2.1087984e-03 -5.4495346e-03 +2182 4.372 -2.0979274e-03 -5.4214598e-03 +2183 4.374 -2.0871125e-03 -5.3935294e-03 +2184 4.376 -2.0763532e-03 -5.3657427e-03 +2185 4.378 -2.0656494e-03 -5.3380990e-03 +2186 4.38 -2.0550007e-03 -5.3105976e-03 +2187 4.382 -2.0444069e-03 -5.2832376e-03 +2188 4.384 -2.0338677e-03 -5.2560185e-03 +2189 4.386 -2.0233828e-03 -5.2289393e-03 +2190 4.388 -2.0129518e-03 -5.2019996e-03 +2191 4.39 -2.0025747e-03 -5.1751984e-03 +2192 4.392 -1.9922510e-03 -5.1485352e-03 +2193 4.394 -1.9819804e-03 -5.1220092e-03 +2194 4.396 -1.9717628e-03 -5.0956197e-03 +2195 4.398 -1.9615979e-03 -5.0693660e-03 +2196 4.4 -1.9514853e-03 -5.0432474e-03 +2197 4.402 -1.9414248e-03 -5.0172632e-03 +2198 4.404 -1.9314161e-03 -4.9914127e-03 +2199 4.406 -1.9214590e-03 -4.9656953e-03 +2200 4.408 -1.9115533e-03 -4.9401102e-03 +2201 4.41 -1.9016985e-03 -4.9146568e-03 +2202 4.412 -1.8918945e-03 -4.8893343e-03 +2203 4.414 -1.8821411e-03 -4.8641422e-03 +2204 4.416 -1.8724379e-03 -4.8390798e-03 +2205 4.418 -1.8627847e-03 -4.8141464e-03 +2206 4.42 -1.8531812e-03 -4.7893412e-03 +2207 4.422 -1.8436272e-03 -4.7646638e-03 +2208 4.424 -1.8341225e-03 -4.7401133e-03 +2209 4.426 -1.8246667e-03 -4.7156892e-03 +2210 4.428 -1.8152596e-03 -4.6913908e-03 +2211 4.43 -1.8059011e-03 -4.6672175e-03 +2212 4.432 -1.7965907e-03 -4.6431686e-03 +2213 4.434 -1.7873283e-03 -4.6192435e-03 +2214 4.436 -1.7781136e-03 -4.5954416e-03 +2215 4.438 -1.7689464e-03 -4.5717621e-03 +2216 4.44 -1.7598265e-03 -4.5482046e-03 +2217 4.442 -1.7507535e-03 -4.5247683e-03 +2218 4.444 -1.7417273e-03 -4.5014526e-03 +2219 4.446 -1.7327477e-03 -4.4782569e-03 +2220 4.448 -1.7238142e-03 -4.4551807e-03 +2221 4.45 -1.7149269e-03 -4.4322232e-03 +2222 4.452 -1.7060853e-03 -4.4093840e-03 +2223 4.454 -1.6972892e-03 -4.3866623e-03 +2224 4.456 -1.6885385e-03 -4.3640575e-03 +2225 4.458 -1.6798329e-03 -4.3415691e-03 +2226 4.46 -1.6711722e-03 -4.3191965e-03 +2227 4.462 -1.6625561e-03 -4.2969391e-03 +2228 4.464 -1.6539844e-03 -4.2747962e-03 +2229 4.466 -1.6454568e-03 -4.2527674e-03 +2230 4.468 -1.6369732e-03 -4.2308519e-03 +2231 4.47 -1.6285333e-03 -4.2090493e-03 +2232 4.472 -1.6201369e-03 -4.1873589e-03 +2233 4.474 -1.6117838e-03 -4.1657801e-03 +2234 4.476 -1.6034737e-03 -4.1443125e-03 +2235 4.478 -1.5952065e-03 -4.1229554e-03 +2236 4.48 -1.5869818e-03 -4.1017083e-03 +2237 4.482 -1.5787996e-03 -4.0805705e-03 +2238 4.484 -1.5706595e-03 -4.0595416e-03 +2239 4.486 -1.5625613e-03 -4.0386209e-03 +2240 4.488 -1.5545049e-03 -4.0178079e-03 +2241 4.49 -1.5464900e-03 -3.9971021e-03 +2242 4.492 -1.5385165e-03 -3.9765030e-03 +2243 4.494 -1.5305840e-03 -3.9560098e-03 +2244 4.496 -1.5226923e-03 -3.9356222e-03 +2245 4.498 -1.5148414e-03 -3.9153396e-03 +2246 4.5 -1.5070309e-03 -3.8951614e-03 +2247 4.502 -1.4992607e-03 -3.8750871e-03 +2248 4.504 -1.4915305e-03 -3.8551161e-03 +2249 4.506 -1.4838402e-03 -3.8352480e-03 +2250 4.508 -1.4761894e-03 -3.8154822e-03 +2251 4.51 -1.4685782e-03 -3.7958182e-03 +2252 4.512 -1.4610061e-03 -3.7762554e-03 +2253 4.514 -1.4534731e-03 -3.7567934e-03 +2254 4.516 -1.4459789e-03 -3.7374315e-03 +2255 4.518 -1.4385233e-03 -3.7181694e-03 +2256 4.52 -1.4311061e-03 -3.6990065e-03 +2257 4.522 -1.4237272e-03 -3.6799422e-03 +2258 4.524 -1.4163863e-03 -3.6609761e-03 +2259 4.526 -1.4090832e-03 -3.6421077e-03 +2260 4.528 -1.4018178e-03 -3.6233364e-03 +2261 4.53 -1.3945898e-03 -3.6046618e-03 +2262 4.532 -1.3873991e-03 -3.5860834e-03 +2263 4.534 -1.3802454e-03 -3.5676006e-03 +2264 4.536 -1.3731286e-03 -3.5492131e-03 +2265 4.538 -1.3660485e-03 -3.5309202e-03 +2266 4.54 -1.3590049e-03 -3.5127215e-03 +2267 4.542 -1.3519975e-03 -3.4946165e-03 +2268 4.544 -1.3450263e-03 -3.4766048e-03 +2269 4.546 -1.3380911e-03 -3.4586859e-03 +2270 4.548 -1.3311915e-03 -3.4408592e-03 +2271 4.55 -1.3243276e-03 -3.4231243e-03 +2272 4.552 -1.3174990e-03 -3.4054808e-03 +2273 4.554 -1.3107056e-03 -3.3879281e-03 +2274 4.556 -1.3039472e-03 -3.3704659e-03 +2275 4.558 -1.2972237e-03 -3.3530935e-03 +2276 4.56 -1.2905348e-03 -3.3358107e-03 +2277 4.562 -1.2838804e-03 -3.3186168e-03 +2278 4.564 -1.2772602e-03 -3.3015115e-03 +2279 4.566 -1.2706743e-03 -3.2844944e-03 +2280 4.568 -1.2641222e-03 -3.2675648e-03 +2281 4.57 -1.2576039e-03 -3.2507225e-03 +2282 4.572 -1.2511193e-03 -3.2339669e-03 +2283 4.574 -1.2446680e-03 -3.2172975e-03 +2284 4.576 -1.2382500e-03 -3.2007141e-03 +2285 4.578 -1.2318651e-03 -3.1842161e-03 +2286 4.58 -1.2255131e-03 -3.1678030e-03 +2287 4.582 -1.2191938e-03 -3.1514745e-03 +2288 4.584 -1.2129071e-03 -3.1352301e-03 +2289 4.586 -1.2066529e-03 -3.1190693e-03 +2290 4.588 -1.2004308e-03 -3.1029918e-03 +2291 4.59 -1.1942408e-03 -3.0869971e-03 +2292 4.592 -1.1880828e-03 -3.0710848e-03 +2293 4.594 -1.1819564e-03 -3.0552545e-03 +2294 4.596 -1.1758617e-03 -3.0395057e-03 +2295 4.598 -1.1697984e-03 -3.0238380e-03 +2296 4.6 -1.1637663e-03 -3.0082511e-03 +2297 4.602 -1.1577653e-03 -2.9927444e-03 +2298 4.604 -1.1517953e-03 -2.9773176e-03 +2299 4.606 -1.1458560e-03 -2.9619703e-03 +2300 4.608 -1.1399473e-03 -2.9467020e-03 +2301 4.61 -1.1340691e-03 -2.9315124e-03 +2302 4.612 -1.1282212e-03 -2.9164010e-03 +2303 4.614 -1.1224035e-03 -2.9013674e-03 +2304 4.616 -1.1166157e-03 -2.8864113e-03 +2305 4.618 -1.1108578e-03 -2.8715323e-03 +2306 4.62 -1.1051295e-03 -2.8567299e-03 +2307 4.622 -1.0994308e-03 -2.8420037e-03 +2308 4.624 -1.0937615e-03 -2.8273534e-03 +2309 4.626 -1.0881213e-03 -2.8127786e-03 +2310 4.628 -1.0825103e-03 -2.7982789e-03 +2311 4.63 -1.0769282e-03 -2.7838539e-03 +2312 4.632 -1.0713748e-03 -2.7695031e-03 +2313 4.634 -1.0658501e-03 -2.7552263e-03 +2314 4.636 -1.0603539e-03 -2.7410231e-03 +2315 4.638 -1.0548860e-03 -2.7268930e-03 +2316 4.64 -1.0494462e-03 -2.7128357e-03 +2317 4.642 -1.0440346e-03 -2.6988509e-03 +2318 4.644 -1.0386508e-03 -2.6849381e-03 +2319 4.646 -1.0332948e-03 -2.6710969e-03 +2320 4.648 -1.0279664e-03 -2.6573271e-03 +2321 4.65 -1.0226654e-03 -2.6436282e-03 +2322 4.652 -1.0173918e-03 -2.6299999e-03 +2323 4.654 -1.0121454e-03 -2.6164418e-03 +2324 4.656 -1.0069260e-03 -2.6029536e-03 +2325 4.658 -1.0017335e-03 -2.5895348e-03 +2326 4.66 -9.9656780e-04 -2.5761852e-03 +2327 4.662 -9.9142872e-04 -2.5629044e-03 +2328 4.664 -9.8631614e-04 -2.5496920e-03 +2329 4.666 -9.8122991e-04 -2.5365476e-03 +2330 4.668 -9.7616990e-04 -2.5234710e-03 +2331 4.67 -9.7113598e-04 -2.5104618e-03 +2332 4.672 -9.6612801e-04 -2.4975196e-03 +2333 4.674 -9.6114586e-04 -2.4846440e-03 +2334 4.676 -9.5618939e-04 -2.4718349e-03 +2335 4.678 -9.5125847e-04 -2.4590917e-03 +2336 4.68 -9.4635298e-04 -2.4464141e-03 +2337 4.682 -9.4147277e-04 -2.4338019e-03 +2338 4.684 -9.3661773e-04 -2.4212547e-03 +2339 4.686 -9.3178771e-04 -2.4087721e-03 +2340 4.688 -9.2698260e-04 -2.3963538e-03 +2341 4.69 -9.2220225e-04 -2.3839995e-03 +2342 4.692 -9.1744656e-04 -2.3717089e-03 +2343 4.694 -9.1271538e-04 -2.3594816e-03 +2344 4.696 -9.0800859e-04 -2.3473173e-03 +2345 4.698 -9.0332606e-04 -2.3352157e-03 +2346 4.7 -8.9866768e-04 -2.3231765e-03 +2347 4.702 -8.9403332e-04 -2.3111992e-03 +2348 4.704 -8.8942284e-04 -2.2992837e-03 +2349 4.706 -8.8483614e-04 -2.2874296e-03 +2350 4.708 -8.8027308e-04 -2.2756366e-03 +2351 4.71 -8.7573355e-04 -2.2639044e-03 +2352 4.712 -8.7121743e-04 -2.2522325e-03 +2353 4.714 -8.6672458e-04 -2.2406209e-03 +2354 4.716 -8.6225490e-04 -2.2290691e-03 +2355 4.718 -8.5780827e-04 -2.2175768e-03 +2356 4.72 -8.5338456e-04 -2.2061437e-03 +2357 4.722 -8.4898365e-04 -2.1947695e-03 +2358 4.724 -8.4460544e-04 -2.1834540e-03 +2359 4.726 -8.4024980e-04 -2.1721967e-03 +2360 4.728 -8.3591661e-04 -2.1609975e-03 +2361 4.73 -8.3160577e-04 -2.1498560e-03 +2362 4.732 -8.2731715e-04 -2.1387719e-03 +2363 4.734 -8.2305065e-04 -2.1277449e-03 +2364 4.736 -8.1880613e-04 -2.1167747e-03 +2365 4.738 -8.1458351e-04 -2.1058611e-03 +2366 4.74 -8.1038265e-04 -2.0950037e-03 +2367 4.742 -8.0620346e-04 -2.0842022e-03 +2368 4.744 -8.0204581e-04 -2.0734565e-03 +2369 4.746 -7.9790959e-04 -2.0627661e-03 +2370 4.748 -7.9379471e-04 -2.0521308e-03 +2371 4.75 -7.8970103e-04 -2.0415503e-03 +2372 4.752 -7.8562847e-04 -2.0310243e-03 +2373 4.754 -7.8157690e-04 -2.0205526e-03 +2374 4.756 -7.7754622e-04 -2.0101348e-03 +2375 4.758 -7.7353633e-04 -1.9997707e-03 +2376 4.76 -7.6954710e-04 -1.9894600e-03 +2377 4.762 -7.6557845e-04 -1.9792025e-03 +2378 4.764 -7.6163026e-04 -1.9689978e-03 +2379 4.766 -7.5770242e-04 -1.9588458e-03 +2380 4.768 -7.5379484e-04 -1.9487460e-03 +2381 4.77 -7.4990741e-04 -1.9386983e-03 +2382 4.772 -7.4604001e-04 -1.9287024e-03 +2383 4.774 -7.4219256e-04 -1.9187580e-03 +2384 4.776 -7.3836495e-04 -1.9088648e-03 +2385 4.778 -7.3455707e-04 -1.8990227e-03 +2386 4.78 -7.3076882e-04 -1.8892312e-03 +2387 4.782 -7.2700011e-04 -1.8794902e-03 +2388 4.784 -7.2325083e-04 -1.8697994e-03 +2389 4.786 -7.1952088e-04 -1.8601586e-03 +2390 4.788 -7.1581016e-04 -1.8505675e-03 +2391 4.79 -7.1211858e-04 -1.8410257e-03 +2392 4.792 -7.0844602e-04 -1.8315332e-03 +2393 4.794 -7.0479241e-04 -1.8220896e-03 +2394 4.796 -7.0115763e-04 -1.8126946e-03 +2395 4.798 -6.9754160e-04 -1.8033481e-03 +2396 4.8 -6.9394421e-04 -1.7940498e-03 +2397 4.802 -6.9036537e-04 -1.7847993e-03 +2398 4.804 -6.8680498e-04 -1.7755966e-03 +2399 4.806 -6.8326295e-04 -1.7664413e-03 +2400 4.808 -6.7973918e-04 -1.7573332e-03 +2401 4.81 -6.7623359e-04 -1.7482720e-03 +2402 4.812 -6.7274606e-04 -1.7392575e-03 +2403 4.814 -6.6927653e-04 -1.7302895e-03 +2404 4.816 -6.6582488e-04 -1.7213677e-03 +2405 4.818 -6.6239102e-04 -1.7124918e-03 +2406 4.82 -6.5897488e-04 -1.7036618e-03 +2407 4.822 -6.5557635e-04 -1.6948772e-03 +2408 4.824 -6.5219534e-04 -1.6861379e-03 +2409 4.826 -6.4883176e-04 -1.6774437e-03 +2410 4.828 -6.4548553e-04 -1.6687943e-03 +2411 4.83 -6.4215656e-04 -1.6601895e-03 +2412 4.832 -6.3884475e-04 -1.6516290e-03 +2413 4.834 -6.3555001e-04 -1.6431126e-03 +2414 4.836 -6.3227227e-04 -1.6346401e-03 +2415 4.838 -6.2901142e-04 -1.6262113e-03 +2416 4.84 -6.2576739e-04 -1.6178260e-03 +2417 4.842 -6.2254009e-04 -1.6094839e-03 +2418 4.844 -6.1932943e-04 -1.6011847e-03 +2419 4.846 -6.1613532e-04 -1.5929284e-03 +2420 4.848 -6.1295769e-04 -1.5847146e-03 +2421 4.85 -6.0979644e-04 -1.5765431e-03 +2422 4.852 -6.0665149e-04 -1.5684138e-03 +2423 4.854 -6.0352275e-04 -1.5603264e-03 +2424 4.856 -6.0041015e-04 -1.5522806e-03 +2425 4.858 -5.9731360e-04 -1.5442763e-03 +2426 4.86 -5.9423302e-04 -1.5363133e-03 +2427 4.862 -5.9116832e-04 -1.5283914e-03 +2428 4.864 -5.8811943e-04 -1.5205102e-03 +2429 4.866 -5.8508625e-04 -1.5126697e-03 +2430 4.868 -5.8206872e-04 -1.5048696e-03 +2431 4.87 -5.7906675e-04 -1.4971097e-03 +2432 4.872 -5.7608026e-04 -1.4893899e-03 +2433 4.874 -5.7310916e-04 -1.4817098e-03 +2434 4.876 -5.7015339e-04 -1.4740693e-03 +2435 4.878 -5.6721286e-04 -1.4664681e-03 +2436 4.88 -5.6428749e-04 -1.4589062e-03 +2437 4.882 -5.6137721e-04 -1.4513833e-03 +2438 4.884 -5.5848193e-04 -1.4438991e-03 +2439 4.886 -5.5560159e-04 -1.4364535e-03 +2440 4.888 -5.5273609e-04 -1.4290463e-03 +2441 4.89 -5.4988538e-04 -1.4216772e-03 +2442 4.892 -5.4704936e-04 -1.4143462e-03 +2443 4.894 -5.4422797e-04 -1.4070529e-03 +2444 4.896 -5.4142112e-04 -1.3997973e-03 +2445 4.898 -5.3862875e-04 -1.3925790e-03 +2446 4.9 -5.3585078e-04 -1.3853980e-03 +2447 4.902 -5.3308714e-04 -1.3782540e-03 +2448 4.904 -5.3033774e-04 -1.3711468e-03 +2449 4.906 -5.2760252e-04 -1.3640762e-03 +2450 4.908 -5.2488141e-04 -1.3570421e-03 +2451 4.91 -5.2217433e-04 -1.3500442e-03 +2452 4.912 -5.1948121e-04 -1.3430825e-03 +2453 4.914 -5.1680198e-04 -1.3361566e-03 +2454 4.916 -5.1413656e-04 -1.3292664e-03 +2455 4.918 -5.1148489e-04 -1.3224117e-03 +2456 4.92 -5.0884689e-04 -1.3155924e-03 +2457 4.922 -5.0622250e-04 -1.3088082e-03 +2458 4.924 -5.0361163e-04 -1.3020590e-03 +2459 4.926 -5.0101424e-04 -1.2953446e-03 +2460 4.928 -4.9843023e-04 -1.2886648e-03 +2461 4.93 -4.9585955e-04 -1.2820195e-03 +2462 4.932 -4.9330213e-04 -1.2754084e-03 +2463 4.934 -4.9075790e-04 -1.2688314e-03 +2464 4.936 -4.8822678e-04 -1.2622883e-03 +2465 4.938 -4.8570872e-04 -1.2557789e-03 +2466 4.94 -4.8320365e-04 -1.2493031e-03 +2467 4.942 -4.8071149e-04 -1.2428606e-03 +2468 4.944 -4.7823218e-04 -1.2364514e-03 +2469 4.946 -4.7576566e-04 -1.2300752e-03 +2470 4.948 -4.7331186e-04 -1.2237319e-03 +2471 4.95 -4.7087071e-04 -1.2174213e-03 +2472 4.952 -4.6844215e-04 -1.2111432e-03 +2473 4.954 -4.6602612e-04 -1.2048975e-03 +2474 4.956 -4.6362254e-04 -1.1986840e-03 +2475 4.958 -4.6123136e-04 -1.1925025e-03 +2476 4.96 -4.5885251e-04 -1.1863529e-03 +2477 4.962 -4.5648593e-04 -1.1802350e-03 +2478 4.964 -4.5413155e-04 -1.1741487e-03 +2479 4.966 -4.5178931e-04 -1.1680937e-03 +2480 4.968 -4.4945915e-04 -1.1620699e-03 +2481 4.97 -4.4714101e-04 -1.1560772e-03 +2482 4.972 -4.4483482e-04 -1.1501154e-03 +2483 4.974 -4.4254053e-04 -1.1441843e-03 +2484 4.976 -4.4025806e-04 -1.1382838e-03 +2485 4.978 -4.3798737e-04 -1.1324137e-03 +2486 4.98 -4.3572839e-04 -1.1265739e-03 +2487 4.982 -4.3348106e-04 -1.1207642e-03 +2488 4.984 -4.3124531e-04 -1.1149845e-03 +2489 4.986 -4.2902110e-04 -1.1092345e-03 +2490 4.988 -4.2680835e-04 -1.1035142e-03 +2491 4.99 -4.2460702e-04 -1.0978234e-03 +2492 4.992 -4.2241704e-04 -1.0921619e-03 +2493 4.994 -4.2023836e-04 -1.0865296e-03 +2494 4.996 -4.1807090e-04 -1.0809263e-03 +2495 4.998 -4.1591463e-04 -1.0753520e-03 +2496 5.0 -4.1376948e-04 -1.0698064e-03 +2497 5.002 -4.1163539e-04 -1.0642893e-03 +2498 5.004 -4.0951230e-04 -1.0588007e-03 +2499 5.006 -4.0740016e-04 -1.0533405e-03 +2500 5.008 -4.0529892e-04 -1.0479083e-03 +2501 5.01 -4.0320851e-04 -1.0425042e-03 +2502 5.012 -4.0112888e-04 -1.0371279e-03 +2503 5.014 -3.9905998e-04 -1.0317794e-03 +2504 5.016 -3.9700175e-04 -1.0264584e-03 +2505 5.018 -3.9495413e-04 -1.0211649e-03 +2506 5.02 -3.9291707e-04 -1.0158986e-03 +2507 5.022 -3.9089052e-04 -1.0106595e-03 +2508 5.024 -3.8887442e-04 -1.0054474e-03 +2509 5.026 -3.8686871e-04 -1.0002622e-03 +2510 5.028 -3.8487335e-04 -9.9510375e-04 +2511 5.03 -3.8288828e-04 -9.8997188e-04 +2512 5.032 -3.8091344e-04 -9.8486646e-04 +2513 5.034 -3.7894879e-04 -9.7978736e-04 +2514 5.036 -3.7699428e-04 -9.7473446e-04 +2515 5.038 -3.7504984e-04 -9.6970760e-04 +2516 5.04 -3.7311543e-04 -9.6470667e-04 +2517 5.042 -3.7119099e-04 -9.5973152e-04 +2518 5.044 -3.6927649e-04 -9.5478202e-04 +2519 5.046 -3.6737185e-04 -9.4985804e-04 +2520 5.048 -3.6547704e-04 -9.4495945e-04 +2521 5.05 -3.6359200e-04 -9.4008612e-04 +2522 5.052 -3.6171668e-04 -9.3523791e-04 +2523 5.054 -3.5985103e-04 -9.3041470e-04 +2524 5.056 -3.5799500e-04 -9.2561636e-04 +2525 5.058 -3.5614854e-04 -9.2084276e-04 +2526 5.06 -3.5431161e-04 -9.1609378e-04 +2527 5.062 -3.5248415e-04 -9.1136928e-04 +2528 5.064 -3.5066612e-04 -9.0666914e-04 +2529 5.066 -3.4885746e-04 -9.0199323e-04 +2530 5.068 -3.4705813e-04 -8.9734144e-04 +2531 5.07 -3.4526808e-04 -8.9271363e-04 +2532 5.072 -3.4348726e-04 -8.8810968e-04 +2533 5.074 -3.4171562e-04 -8.8352947e-04 +2534 5.076 -3.3995313e-04 -8.7897288e-04 +2535 5.078 -3.3819972e-04 -8.7443978e-04 +2536 5.08 -3.3645535e-04 -8.6993006e-04 +2537 5.082 -3.3471998e-04 -8.6544359e-04 +2538 5.084 -3.3299356e-04 -8.6098025e-04 +2539 5.086 -3.3127605e-04 -8.5653993e-04 +2540 5.088 -3.2956739e-04 -8.5212250e-04 +2541 5.09 -3.2786754e-04 -8.4772785e-04 +2542 5.092 -3.2617646e-04 -8.4335586e-04 +2543 5.094 -3.2449410e-04 -8.3900641e-04 +2544 5.096 -3.2282042e-04 -8.3467939e-04 +2545 5.098 -3.2115537e-04 -8.3037468e-04 +2546 5.1 -3.1949891e-04 -8.2609217e-04 +2547 5.102 -3.1785099e-04 -8.2183174e-04 +2548 5.104 -3.1621156e-04 -8.1759328e-04 +2549 5.106 -3.1458060e-04 -8.1337667e-04 +2550 5.108 -3.1295804e-04 -8.0918181e-04 +2551 5.11 -3.1134386e-04 -8.0500857e-04 +2552 5.112 -3.0973799e-04 -8.0085686e-04 +2553 5.114 -3.0814041e-04 -7.9672655e-04 +2554 5.116 -3.0655107e-04 -7.9261754e-04 +2555 5.118 -3.0496993e-04 -7.8852972e-04 +2556 5.12 -3.0339694e-04 -7.8446297e-04 +2557 5.122 -3.0183206e-04 -7.8041720e-04 +2558 5.124 -3.0027526e-04 -7.7639229e-04 +2559 5.126 -2.9872648e-04 -7.7238813e-04 +2560 5.128 -2.9718569e-04 -7.6840462e-04 +2561 5.13 -2.9565285e-04 -7.6444165e-04 +2562 5.132 -2.9412791e-04 -7.6049912e-04 +2563 5.134 -2.9261084e-04 -7.5657691e-04 +2564 5.136 -2.9110159e-04 -7.5267493e-04 +2565 5.138 -2.8960013e-04 -7.4879307e-04 +2566 5.14 -2.8810641e-04 -7.4493123e-04 +2567 5.142 -2.8662039e-04 -7.4108930e-04 +2568 5.144 -2.8514203e-04 -7.3726718e-04 +2569 5.146 -2.8367131e-04 -7.3346477e-04 +2570 5.148 -2.8220816e-04 -7.2968197e-04 +2571 5.15 -2.8075257e-04 -7.2591868e-04 +2572 5.152 -2.7930447e-04 -7.2217479e-04 +2573 5.154 -2.7786385e-04 -7.1845020e-04 +2574 5.156 -2.7643066e-04 -7.1474483e-04 +2575 5.158 -2.7500486e-04 -7.1105856e-04 +2576 5.16 -2.7358641e-04 -7.0739129e-04 +2577 5.162 -2.7217528e-04 -7.0374294e-04 +2578 5.164 -2.7077143e-04 -7.0011340e-04 +2579 5.166 -2.6937482e-04 -6.9650258e-04 +2580 5.168 -2.6798541e-04 -6.9291038e-04 +2581 5.17 -2.6660316e-04 -6.8933670e-04 +2582 5.172 -2.6522805e-04 -6.8578145e-04 +2583 5.174 -2.6386003e-04 -6.8224454e-04 +2584 5.176 -2.6249906e-04 -6.7872586e-04 +2585 5.178 -2.6114511e-04 -6.7522532e-04 +2586 5.18 -2.5979814e-04 -6.7174284e-04 +2587 5.182 -2.5845813e-04 -6.6827832e-04 +2588 5.184 -2.5712502e-04 -6.6483166e-04 +2589 5.186 -2.5579879e-04 -6.6140277e-04 +2590 5.188 -2.5447940e-04 -6.5799157e-04 +2591 5.19 -2.5316681e-04 -6.5459796e-04 +2592 5.192 -2.5186099e-04 -6.5122185e-04 +2593 5.194 -2.5056191e-04 -6.4786314e-04 +2594 5.196 -2.4926953e-04 -6.4452176e-04 +2595 5.198 -2.4798381e-04 -6.4119761e-04 +2596 5.2 -2.4670473e-04 -6.3789060e-04 +2597 5.202 -2.4543224e-04 -6.3460064e-04 +2598 5.204 -2.4416631e-04 -6.3132765e-04 +2599 5.206 -2.4290692e-04 -6.2807154e-04 +2600 5.208 -2.4165402e-04 -6.2483222e-04 +2601 5.21 -2.4040758e-04 -6.2160960e-04 +2602 5.212 -2.3916757e-04 -6.1840360e-04 +2603 5.214 -2.3793395e-04 -6.1521414e-04 +2604 5.216 -2.3670670e-04 -6.1204112e-04 +2605 5.218 -2.3548578e-04 -6.0888446e-04 +2606 5.22 -2.3427115e-04 -6.0574409e-04 +2607 5.222 -2.3306279e-04 -6.0261990e-04 +2608 5.224 -2.3186066e-04 -5.9951183e-04 +2609 5.226 -2.3066473e-04 -5.9641979e-04 +2610 5.228 -2.2947497e-04 -5.9334369e-04 +2611 5.23 -2.2829135e-04 -5.9028346e-04 +2612 5.232 -2.2711383e-04 -5.8723900e-04 +2613 5.234 -2.2594238e-04 -5.8421025e-04 +2614 5.236 -2.2477697e-04 -5.8119711e-04 +2615 5.238 -2.2361758e-04 -5.7819952e-04 +2616 5.24 -2.2246417e-04 -5.7521738e-04 +2617 5.242 -2.2131670e-04 -5.7225062e-04 +2618 5.244 -2.2017515e-04 -5.6929916e-04 +2619 5.246 -2.1903949e-04 -5.6636292e-04 +2620 5.248 -2.1790969e-04 -5.6344183e-04 +2621 5.25 -2.1678572e-04 -5.6053579e-04 +2622 5.252 -2.1566754e-04 -5.5764475e-04 +2623 5.254 -2.1455513e-04 -5.5476861e-04 +2624 5.256 -2.1344845e-04 -5.5190730e-04 +2625 5.258 -2.1234749e-04 -5.4906075e-04 +2626 5.26 -2.1125220e-04 -5.4622888e-04 +2627 5.262 -2.1016256e-04 -5.4341162e-04 +2628 5.264 -2.0907854e-04 -5.4060888e-04 +2629 5.266 -2.0800012e-04 -5.3782060e-04 +2630 5.268 -2.0692725e-04 -5.3504669e-04 +2631 5.27 -2.0585992e-04 -5.3228709e-04 +2632 5.272 -2.0479810e-04 -5.2954172e-04 +2633 5.274 -2.0374175e-04 -5.2681051e-04 +2634 5.276 -2.0269084e-04 -5.2409339e-04 +2635 5.278 -2.0164536e-04 -5.2139028e-04 +2636 5.28 -2.0060527e-04 -5.1870110e-04 +2637 5.282 -1.9957055e-04 -5.1602580e-04 +2638 5.284 -1.9854116e-04 -5.1336429e-04 +2639 5.286 -1.9751708e-04 -5.1071651e-04 +2640 5.288 -1.9649829e-04 -5.0808238e-04 +2641 5.29 -1.9548474e-04 -5.0546184e-04 +2642 5.292 -1.9447643e-04 -5.0285481e-04 +2643 5.294 -1.9347332e-04 -5.0026123e-04 +2644 5.296 -1.9247538e-04 -4.9768102e-04 +2645 5.298 -1.9148258e-04 -4.9511412e-04 +2646 5.3 -1.9049491e-04 -4.9256046e-04 +2647 5.302 -1.8951233e-04 -4.9001996e-04 +2648 5.304 -1.8853482e-04 -4.8749257e-04 +2649 5.306 -1.8756235e-04 -4.8497821e-04 +2650 5.308 -1.8659490e-04 -4.8247682e-04 +2651 5.31 -1.8563244e-04 -4.7998833e-04 +2652 5.312 -1.8467494e-04 -4.7751267e-04 +2653 5.314 -1.8372238e-04 -4.7504978e-04 +2654 5.316 -1.8277473e-04 -4.7259959e-04 +2655 5.318 -1.8183197e-04 -4.7016204e-04 +2656 5.32 -1.8089407e-04 -4.6773706e-04 +2657 5.322 -1.7996101e-04 -4.6532458e-04 +2658 5.324 -1.7903277e-04 -4.6292455e-04 +2659 5.326 -1.7810931e-04 -4.6053689e-04 +2660 5.328 -1.7719061e-04 -4.5816155e-04 +2661 5.33 -1.7627665e-04 -4.5579846e-04 +2662 5.332 -1.7536741e-04 -4.5344755e-04 +2663 5.334 -1.7446286e-04 -4.5110877e-04 +2664 5.336 -1.7356297e-04 -4.4878205e-04 +2665 5.338 -1.7266772e-04 -4.4646733e-04 +2666 5.34 -1.7177709e-04 -4.4416455e-04 +2667 5.342 -1.7089105e-04 -4.4187364e-04 +2668 5.344 -1.7000959e-04 -4.3959455e-04 +2669 5.346 -1.6913267e-04 -4.3732721e-04 +2670 5.348 -1.6826027e-04 -4.3507157e-04 +2671 5.35 -1.6739237e-04 -4.3282755e-04 +2672 5.352 -1.6652895e-04 -4.3059512e-04 +2673 5.354 -1.6566998e-04 -4.2837419e-04 +2674 5.356 -1.6481545e-04 -4.2616472e-04 +2675 5.358 -1.6396532e-04 -4.2396664e-04 +2676 5.36 -1.6311957e-04 -4.2177990e-04 +2677 5.362 -1.6227819e-04 -4.1960444e-04 +2678 5.364 -1.6144115e-04 -4.1744019e-04 +2679 5.366 -1.6060842e-04 -4.1528711e-04 +2680 5.368 -1.5977999e-04 -4.1314514e-04 +2681 5.37 -1.5895584e-04 -4.1101420e-04 +2682 5.372 -1.5813593e-04 -4.0889426e-04 +2683 5.374 -1.5732025e-04 -4.0678526e-04 +2684 5.376 -1.5650878e-04 -4.0468713e-04 +2685 5.378 -1.5570150e-04 -4.0259982e-04 +2686 5.38 -1.5489837e-04 -4.0052327e-04 +2687 5.382 -1.5409939e-04 -3.9845744e-04 +2688 5.384 -1.5330454e-04 -3.9640225e-04 +2689 5.386 -1.5251378e-04 -3.9435767e-04 +2690 5.388 -1.5172710e-04 -3.9232364e-04 +2691 5.39 -1.5094448e-04 -3.9030009e-04 +2692 5.392 -1.5016589e-04 -3.8828698e-04 +2693 5.394 -1.4939132e-04 -3.8628425e-04 +2694 5.396 -1.4862075e-04 -3.8429185e-04 +2695 5.398 -1.4785415e-04 -3.8230973e-04 +2696 5.4 -1.4709150e-04 -3.8033783e-04 +2697 5.402 -1.4633279e-04 -3.7837609e-04 +2698 5.404 -1.4557799e-04 -3.7642448e-04 +2699 5.406 -1.4482709e-04 -3.7448293e-04 +2700 5.408 -1.4408005e-04 -3.7255140e-04 +2701 5.41 -1.4333687e-04 -3.7062982e-04 +2702 5.412 -1.4259753e-04 -3.6871816e-04 +2703 5.414 -1.4186199e-04 -3.6681636e-04 +2704 5.416 -1.4113025e-04 -3.6492436e-04 +2705 5.418 -1.4040229e-04 -3.6304212e-04 +2706 5.42 -1.3967808e-04 -3.6116959e-04 +2707 5.422 -1.3895761e-04 -3.5930672e-04 +2708 5.424 -1.3824085e-04 -3.5745346e-04 +2709 5.426 -1.3752779e-04 -3.5560975e-04 +2710 5.428 -1.3681840e-04 -3.5377555e-04 +2711 5.43 -1.3611268e-04 -3.5195081e-04 +2712 5.432 -1.3541059e-04 -3.5013549e-04 +2713 5.434 -1.3471213e-04 -3.4832952e-04 +2714 5.436 -1.3401727e-04 -3.4653287e-04 +2715 5.438 -1.3332599e-04 -3.4474549e-04 +2716 5.44 -1.3263828e-04 -3.4296732e-04 +2717 5.442 -1.3195412e-04 -3.4119833e-04 +2718 5.444 -1.3127348e-04 -3.3943846e-04 +2719 5.446 -1.3059636e-04 -3.3768766e-04 +2720 5.448 -1.2992272e-04 -3.3594590e-04 +2721 5.45 -1.2925257e-04 -3.3421312e-04 +2722 5.452 -1.2858586e-04 -3.3248927e-04 +2723 5.454 -1.2792260e-04 -3.3077432e-04 +2724 5.456 -1.2726276e-04 -3.2906821e-04 +2725 5.458 -1.2660632e-04 -3.2737090e-04 +2726 5.46 -1.2595327e-04 -3.2568234e-04 +2727 5.462 -1.2530359e-04 -3.2400250e-04 +2728 5.464 -1.2465726e-04 -3.2233131e-04 +2729 5.466 -1.2401426e-04 -3.2066875e-04 +2730 5.468 -1.2337458e-04 -3.1901476e-04 +2731 5.47 -1.2273819e-04 -3.1736930e-04 +2732 5.472 -1.2210509e-04 -3.1573233e-04 +2733 5.474 -1.2147526e-04 -3.1410380e-04 +2734 5.476 -1.2084867e-04 -3.1248367e-04 +2735 5.478 -1.2022532e-04 -3.1087190e-04 +2736 5.48 -1.1960518e-04 -3.0926843e-04 +2737 5.482 -1.1898824e-04 -3.0767324e-04 +2738 5.484 -1.1837448e-04 -3.0608628e-04 +2739 5.486 -1.1776389e-04 -3.0450750e-04 +2740 5.488 -1.1715645e-04 -3.0293686e-04 +2741 5.49 -1.1655214e-04 -3.0137433e-04 +2742 5.492 -1.1595094e-04 -2.9981985e-04 +2743 5.494 -1.1535285e-04 -2.9827339e-04 +2744 5.496 -1.1475784e-04 -2.9673491e-04 +2745 5.498 -1.1416591e-04 -2.9520436e-04 +2746 5.5 -1.1357702e-04 -2.9368170e-04 +2747 5.502 -1.1299117e-04 -2.9216690e-04 +2748 5.504 -1.1240835e-04 -2.9065991e-04 +2749 5.506 -1.1182853e-04 -2.8916070e-04 +2750 5.508 -1.1125170e-04 -2.8766921e-04 +2751 5.51 -1.1067785e-04 -2.8618542e-04 +2752 5.512 -1.1010695e-04 -2.8470928e-04 +2753 5.514 -1.0953900e-04 -2.8324076e-04 +2754 5.516 -1.0897399e-04 -2.8177981e-04 +2755 5.518 -1.0841188e-04 -2.8032639e-04 +2756 5.52 -1.0785267e-04 -2.7888047e-04 +2757 5.522 -1.0729635e-04 -2.7744201e-04 +2758 5.524 -1.0674290e-04 -2.7601097e-04 +2759 5.526 -1.0619230e-04 -2.7458731e-04 +2760 5.528 -1.0564455e-04 -2.7317099e-04 +2761 5.53 -1.0509962e-04 -2.7176197e-04 +2762 5.532 -1.0455749e-04 -2.7036023e-04 +2763 5.534 -1.0401817e-04 -2.6896571e-04 +2764 5.536 -1.0348163e-04 -2.6757838e-04 +2765 5.538 -1.0294785e-04 -2.6619821e-04 +2766 5.54 -1.0241683e-04 -2.6482516e-04 +2767 5.542 -1.0188855e-04 -2.6345919e-04 +2768 5.544 -1.0136299e-04 -2.6210027e-04 +2769 5.546 -1.0084014e-04 -2.6074835e-04 +2770 5.548 -1.0031999e-04 -2.5940341e-04 +2771 5.55 -9.9802522e-05 -2.5806541e-04 +2772 5.552 -9.9287724e-05 -2.5673430e-04 +2773 5.554 -9.8775581e-05 -2.5541006e-04 +2774 5.556 -9.8266079e-05 -2.5409265e-04 +2775 5.558 -9.7759206e-05 -2.5278204e-04 +2776 5.56 -9.7254946e-05 -2.5147818e-04 +2777 5.562 -9.6753288e-05 -2.5018105e-04 +2778 5.564 -9.6254218e-05 -2.4889061e-04 +2779 5.566 -9.5757721e-05 -2.4760683e-04 +2780 5.568 -9.5263786e-05 -2.4632967e-04 +2781 5.57 -9.4772398e-05 -2.4505909e-04 +2782 5.572 -9.4283545e-05 -2.4379507e-04 +2783 5.574 -9.3797214e-05 -2.4253757e-04 +2784 5.576 -9.3313391e-05 -2.4128655e-04 +2785 5.578 -9.2832063e-05 -2.4004199e-04 +2786 5.58 -9.2353218e-05 -2.3880384e-04 +2787 5.582 -9.1876844e-05 -2.3757209e-04 +2788 5.584 -9.1402926e-05 -2.3634668e-04 +2789 5.586 -9.0931453e-05 -2.3512759e-04 +2790 5.588 -9.0462411e-05 -2.3391480e-04 +2791 5.59 -8.9995789e-05 -2.3270825e-04 +2792 5.592 -8.9531574e-05 -2.3150794e-04 +2793 5.594 -8.9069753e-05 -2.3031381e-04 +2794 5.596 -8.8610315e-05 -2.2912584e-04 +2795 5.598 -8.8153246e-05 -2.2794400e-04 +2796 5.6 -8.7698535e-05 -2.2676825e-04 +2797 5.602 -8.7246169e-05 -2.2559857e-04 +2798 5.604 -8.6796136e-05 -2.2443492e-04 +2799 5.606 -8.6348425e-05 -2.2327727e-04 +2800 5.608 -8.5903023e-05 -2.2212559e-04 +2801 5.61 -8.5459919e-05 -2.2097986e-04 +2802 5.612 -8.5019100e-05 -2.1984003e-04 +2803 5.614 -8.4580555e-05 -2.1870608e-04 +2804 5.616 -8.4144272e-05 -2.1757798e-04 +2805 5.618 -8.3710239e-05 -2.1645570e-04 +2806 5.62 -8.3278445e-05 -2.1533921e-04 +2807 5.622 -8.2848878e-05 -2.1422848e-04 +2808 5.624 -8.2421527e-05 -2.1312347e-04 +2809 5.626 -8.1996381e-05 -2.1202417e-04 +2810 5.628 -8.1573427e-05 -2.1093053e-04 +2811 5.63 -8.1152655e-05 -2.0984254e-04 +2812 5.632 -8.0734053e-05 -2.0876016e-04 +2813 5.634 -8.0317610e-05 -2.0768336e-04 +2814 5.636 -7.9903316e-05 -2.0661211e-04 +2815 5.638 -7.9491158e-05 -2.0554639e-04 +2816 5.64 -7.9081127e-05 -2.0448617e-04 +2817 5.642 -7.8673210e-05 -2.0343141e-04 +2818 5.644 -7.8267397e-05 -2.0238210e-04 +2819 5.646 -7.7863678e-05 -2.0133819e-04 +2820 5.648 -7.7462041e-05 -2.0029967e-04 +2821 5.65 -7.7062476e-05 -1.9926651e-04 +2822 5.652 -7.6664971e-05 -1.9823868e-04 +2823 5.654 -7.6269517e-05 -1.9721615e-04 +2824 5.656 -7.5876103e-05 -1.9619889e-04 +2825 5.658 -7.5484718e-05 -1.9518688e-04 +2826 5.66 -7.5095352e-05 -1.9418009e-04 +2827 5.662 -7.4707995e-05 -1.9317849e-04 +2828 5.664 -7.4322635e-05 -1.9218205e-04 +2829 5.666 -7.3939263e-05 -1.9119076e-04 +2830 5.668 -7.3557868e-05 -1.9020458e-04 +2831 5.67 -7.3178441e-05 -1.8922349e-04 +2832 5.672 -7.2800971e-05 -1.8824746e-04 +2833 5.674 -7.2425448e-05 -1.8727646e-04 +2834 5.676 -7.2051862e-05 -1.8631047e-04 +2835 5.678 -7.1680203e-05 -1.8534946e-04 +2836 5.68 -7.1310461e-05 -1.8439341e-04 +2837 5.682 -7.0942626e-05 -1.8344229e-04 +2838 5.684 -7.0576688e-05 -1.8249607e-04 +2839 5.686 -7.0212638e-05 -1.8155474e-04 +2840 5.688 -6.9850466e-05 -1.8061826e-04 +2841 5.69 -6.9490162e-05 -1.7968661e-04 +2842 5.692 -6.9131717e-05 -1.7875977e-04 +2843 5.694 -6.8775120e-05 -1.7783771e-04 +2844 5.696 -6.8420363e-05 -1.7692040e-04 +2845 5.698 -6.8067435e-05 -1.7600783e-04 +2846 5.7 -6.7716328e-05 -1.7509996e-04 +2847 5.702 -6.7367032e-05 -1.7419677e-04 +2848 5.704 -6.7019538e-05 -1.7329825e-04 +2849 5.706 -6.6673836e-05 -1.7240435e-04 +2850 5.708 -6.6329917e-05 -1.7151507e-04 +2851 5.71 -6.5987773e-05 -1.7063038e-04 +2852 5.712 -6.5647393e-05 -1.6975025e-04 +2853 5.714 -6.5308769e-05 -1.6887465e-04 +2854 5.716 -6.4971891e-05 -1.6800358e-04 +2855 5.718 -6.4636751e-05 -1.6713699e-04 +2856 5.72 -6.4303340e-05 -1.6627488e-04 +2857 5.722 -6.3971649e-05 -1.6541722e-04 +2858 5.724 -6.3641669e-05 -1.6456397e-04 +2859 5.726 -6.3313390e-05 -1.6371513e-04 +2860 5.728 -6.2986805e-05 -1.6287067e-04 +2861 5.73 -6.2661905e-05 -1.6203056e-04 +2862 5.732 -6.2338680e-05 -1.6119478e-04 +2863 5.734 -6.2017123e-05 -1.6036332e-04 +2864 5.736 -6.1697224e-05 -1.5953615e-04 +2865 5.738 -6.1378975e-05 -1.5871324e-04 +2866 5.74 -6.1062368e-05 -1.5789457e-04 +2867 5.742 -6.0747394e-05 -1.5708013e-04 +2868 5.744 -6.0434045e-05 -1.5626989e-04 +2869 5.746 -6.0122312e-05 -1.5546383e-04 +2870 5.748 -5.9812187e-05 -1.5466193e-04 +2871 5.75 -5.9503661e-05 -1.5386416e-04 +2872 5.752 -5.9196727e-05 -1.5307051e-04 +2873 5.754 -5.8891376e-05 -1.5228095e-04 +2874 5.756 -5.8587601e-05 -1.5149546e-04 +2875 5.758 -5.8285392e-05 -1.5071403e-04 +2876 5.76 -5.7984742e-05 -1.4993662e-04 +2877 5.762 -5.7685643e-05 -1.4916323e-04 +2878 5.764 -5.7388086e-05 -1.4839382e-04 +2879 5.766 -5.7092065e-05 -1.4762838e-04 +2880 5.768 -5.6797570e-05 -1.4686690e-04 +2881 5.77 -5.6504595e-05 -1.4610933e-04 +2882 5.772 -5.6213130e-05 -1.4535568e-04 +2883 5.774 -5.5923169e-05 -1.4460591e-04 +2884 5.776 -5.5634704e-05 -1.4386002e-04 +2885 5.778 -5.5347727e-05 -1.4311796e-04 +2886 5.78 -5.5062230e-05 -1.4237974e-04 +2887 5.782 -5.4778205e-05 -1.4164532e-04 +2888 5.784 -5.4495646e-05 -1.4091469e-04 +2889 5.786 -5.4214544e-05 -1.4018783e-04 +2890 5.788 -5.3934892e-05 -1.3946472e-04 +2891 5.79 -5.3656682e-05 -1.3874534e-04 +2892 5.792 -5.3379908e-05 -1.3802967e-04 +2893 5.794 -5.3104561e-05 -1.3731769e-04 +2894 5.796 -5.2830635e-05 -1.3660939e-04 +2895 5.798 -5.2558121e-05 -1.3590473e-04 +2896 5.8 -5.2287014e-05 -1.3520372e-04 +2897 5.802 -5.2017304e-05 -1.3450631e-04 +2898 5.804 -5.1748986e-05 -1.3381251e-04 +2899 5.806 -5.1482052e-05 -1.3312228e-04 +2900 5.808 -5.1216494e-05 -1.3243561e-04 +2901 5.81 -5.0952307e-05 -1.3175249e-04 +2902 5.812 -5.0689482e-05 -1.3107289e-04 +2903 5.814 -5.0428013e-05 -1.3039679e-04 +2904 5.816 -5.0167893e-05 -1.2972418e-04 +2905 5.818 -4.9909114e-05 -1.2905504e-04 +2906 5.82 -4.9651670e-05 -1.2838936e-04 +2907 5.822 -4.9395554e-05 -1.2772710e-04 +2908 5.824 -4.9140759e-05 -1.2706826e-04 +2909 5.826 -4.8887279e-05 -1.2641282e-04 +2910 5.828 -4.8635106e-05 -1.2576077e-04 +2911 5.83 -4.8384234e-05 -1.2511207e-04 +2912 5.832 -4.8134655e-05 -1.2446672e-04 +2913 5.834 -4.7886364e-05 -1.2382470e-04 +2914 5.836 -4.7639354e-05 -1.2318599e-04 +2915 5.838 -4.7393618e-05 -1.2255057e-04 +2916 5.84 -4.7149150e-05 -1.2191844e-04 +2917 5.842 -4.6905942e-05 -1.2128956e-04 +2918 5.844 -4.6663989e-05 -1.2066393e-04 +2919 5.846 -4.6423285e-05 -1.2004152e-04 +2920 5.848 -4.6183821e-05 -1.1942232e-04 +2921 5.85 -4.5945593e-05 -1.1880632e-04 +2922 5.852 -4.5708594e-05 -1.1819350e-04 +2923 5.854 -4.5472817e-05 -1.1758383e-04 +2924 5.856 -4.5238256e-05 -1.1697731e-04 +2925 5.858 -4.5004906e-05 -1.1637392e-04 +2926 5.86 -4.4772759e-05 -1.1577365e-04 +2927 5.862 -4.4541809e-05 -1.1517646e-04 +2928 5.864 -4.4312051e-05 -1.1458236e-04 +2929 5.866 -4.4083478e-05 -1.1399133e-04 +2930 5.868 -4.3856083e-05 -1.1340334e-04 +2931 5.87 -4.3629862e-05 -1.1281838e-04 +2932 5.872 -4.3404808e-05 -1.1223644e-04 +2933 5.874 -4.3180914e-05 -1.1165751e-04 +2934 5.876 -4.2958176e-05 -1.1108155e-04 +2935 5.878 -4.2736586e-05 -1.1050857e-04 +2936 5.88 -4.2516140e-05 -1.0993855e-04 +2937 5.882 -4.2296830e-05 -1.0937147e-04 +2938 5.884 -4.2078652e-05 -1.0880731e-04 +2939 5.886 -4.1861599e-05 -1.0824606e-04 +2940 5.888 -4.1645666e-05 -1.0768770e-04 +2941 5.89 -4.1430846e-05 -1.0713223e-04 +2942 5.892 -4.1217135e-05 -1.0657962e-04 +2943 5.894 -4.1004526e-05 -1.0602986e-04 +2944 5.896 -4.0793013e-05 -1.0548294e-04 +2945 5.898 -4.0582592e-05 -1.0493884e-04 +2946 5.9 -4.0373256e-05 -1.0439754e-04 +2947 5.902 -4.0165000e-05 -1.0385904e-04 +2948 5.904 -3.9957818e-05 -1.0332331e-04 +2949 5.906 -3.9751705e-05 -1.0279035e-04 +2950 5.908 -3.9546655e-05 -1.0226014e-04 +2951 5.91 -3.9342663e-05 -1.0173266e-04 +2952 5.912 -3.9139723e-05 -1.0120790e-04 +2953 5.914 -3.8937829e-05 -1.0068585e-04 +2954 5.916 -3.8736977e-05 -1.0016649e-04 +2955 5.918 -3.8537161e-05 -9.9649811e-05 +2956 5.92 -3.8338376e-05 -9.9135797e-05 +2957 5.922 -3.8140617e-05 -9.8624434e-05 +2958 5.924 -3.7943877e-05 -9.8115709e-05 +2959 5.926 -3.7748152e-05 -9.7609608e-05 +2960 5.928 -3.7553437e-05 -9.7106117e-05 +2961 5.93 -3.7359726e-05 -9.6605224e-05 +2962 5.932 -3.7167014e-05 -9.6106914e-05 +2963 5.934 -3.6975296e-05 -9.5611174e-05 +2964 5.936 -3.6784568e-05 -9.5117991e-05 +2965 5.938 -3.6594823e-05 -9.4627353e-05 +2966 5.94 -3.6406057e-05 -9.4139245e-05 +2967 5.942 -3.6218264e-05 -9.3653655e-05 +2968 5.944 -3.6031440e-05 -9.3170569e-05 +2969 5.946 -3.5845580e-05 -9.2689975e-05 +2970 5.948 -3.5660679e-05 -9.2211861e-05 +2971 5.95 -3.5476731e-05 -9.1736212e-05 +2972 5.952 -3.5293732e-05 -9.1263017e-05 +2973 5.954 -3.5111677e-05 -9.0792263e-05 +2974 5.956 -3.4930562e-05 -9.0323936e-05 +2975 5.958 -3.4750380e-05 -8.9858026e-05 +2976 5.96 -3.4571128e-05 -8.9394519e-05 +2977 5.962 -3.4392800e-05 -8.8933402e-05 +2978 5.964 -3.4215393e-05 -8.8474664e-05 +2979 5.966 -3.4038900e-05 -8.8018293e-05 +2980 5.968 -3.3863318e-05 -8.7564275e-05 +2981 5.97 -3.3688641e-05 -8.7112599e-05 +2982 5.972 -3.3514866e-05 -8.6663253e-05 +2983 5.974 -3.3341987e-05 -8.6216225e-05 +2984 5.976 -3.3170000e-05 -8.5771502e-05 +2985 5.978 -3.2998899e-05 -8.5329074e-05 +2986 5.98 -3.2828682e-05 -8.4888927e-05 +2987 5.982 -3.2659342e-05 -8.4451051e-05 +2988 5.984 -3.2490876e-05 -8.4015434e-05 +2989 5.986 -3.2323279e-05 -8.3582063e-05 +2990 5.988 -3.2156546e-05 -8.3150928e-05 +2991 5.99 -3.1990674e-05 -8.2722017e-05 +2992 5.992 -3.1825657e-05 -8.2295318e-05 +2993 5.994 -3.1661491e-05 -8.1870820e-05 +2994 5.996 -3.1498172e-05 -8.1448512e-05 +2995 5.998 -3.1335695e-05 -8.1028382e-05 +2996 6.0 -3.1174057e-05 -8.0610419e-05 +2997 6.002 -3.1013252e-05 -8.0194612e-05 +2998 6.004 -3.0853277e-05 -7.9780949e-05 +2999 6.006 -3.0694127e-05 -7.9369421e-05 +3000 6.008 -3.0535798e-05 -7.8960015e-05 +3001 6.01 -3.0378286e-05 -7.8552721e-05 +3002 6.012 -3.0221586e-05 -7.8147528e-05 +3003 6.014 -3.0065694e-05 -7.7744425e-05 +3004 6.016 -2.9910607e-05 -7.7343401e-05 +3005 6.018 -2.9756319e-05 -7.6944446e-05 +3006 6.02 -2.9602828e-05 -7.6547548e-05 +3007 6.022 -2.9450128e-05 -7.6152698e-05 +3008 6.024 -2.9298215e-05 -7.5759885e-05 +3009 6.026 -2.9147087e-05 -7.5369097e-05 +3010 6.028 -2.8996738e-05 -7.4980326e-05 +3011 6.03 -2.8847164e-05 -7.4593559e-05 +3012 6.032 -2.8698362e-05 -7.4208788e-05 +3013 6.034 -2.8550328e-05 -7.3826002e-05 +3014 6.036 -2.8403057e-05 -7.3445190e-05 +3015 6.038 -2.8256546e-05 -7.3066342e-05 +3016 6.04 -2.8110790e-05 -7.2689448e-05 +3017 6.042 -2.7965786e-05 -7.2314499e-05 +3018 6.044 -2.7821531e-05 -7.1941483e-05 +3019 6.046 -2.7678019e-05 -7.1570392e-05 +3020 6.048 -2.7535248e-05 -7.1201214e-05 +3021 6.05 -2.7393213e-05 -7.0833941e-05 +3022 6.052 -2.7251911e-05 -7.0468563e-05 +3023 6.054 -2.7111338e-05 -7.0105069e-05 +3024 6.056 -2.6971489e-05 -6.9743450e-05 +3025 6.058 -2.6832363e-05 -6.9383696e-05 +3026 6.06 -2.6693953e-05 -6.9025798e-05 +3027 6.062 -2.6556258e-05 -6.8669746e-05 +3028 6.064 -2.6419273e-05 -6.8315531e-05 +3029 6.066 -2.6282995e-05 -6.7963143e-05 +3030 6.068 -2.6147419e-05 -6.7612572e-05 +3031 6.07 -2.6012543e-05 -6.7263810e-05 +3032 6.072 -2.5878363e-05 -6.6916847e-05 +3033 6.074 -2.5744875e-05 -6.6571673e-05 +3034 6.076 -2.5612075e-05 -6.6228280e-05 +3035 6.078 -2.5479960e-05 -6.5886658e-05 +3036 6.08 -2.5348527e-05 -6.5546798e-05 +3037 6.082 -2.5217772e-05 -6.5208692e-05 +3038 6.084 -2.5087691e-05 -6.4872329e-05 +3039 6.086 -2.4958282e-05 -6.4537701e-05 +3040 6.088 -2.4829539e-05 -6.4204800e-05 +3041 6.09 -2.4701461e-05 -6.3873616e-05 +3042 6.092 -2.4574044e-05 -6.3544139e-05 +3043 6.094 -2.4447284e-05 -6.3216363e-05 +3044 6.096 -2.4321177e-05 -6.2890277e-05 +3045 6.098 -2.4195721e-05 -6.2565873e-05 +3046 6.1 -2.4070913e-05 -6.2243143e-05 +3047 6.102 -2.3946748e-05 -6.1922077e-05 +3048 6.104 -2.3823223e-05 -6.1602667e-05 +3049 6.106 -2.3700336e-05 -6.1284905e-05 +3050 6.108 -2.3578082e-05 -6.0968782e-05 +3051 6.11 -2.3456460e-05 -6.0654289e-05 +3052 6.112 -2.3335464e-05 -6.0341419e-05 +3053 6.114 -2.3215093e-05 -6.0030163e-05 +3054 6.116 -2.3095342e-05 -5.9720512e-05 +3055 6.118 -2.2976210e-05 -5.9412458e-05 +3056 6.12 -2.2857692e-05 -5.9105993e-05 +3057 6.122 -2.2739785e-05 -5.8801109e-05 +3058 6.124 -2.2622486e-05 -5.8497798e-05 +3059 6.126 -2.2505793e-05 -5.8196052e-05 +3060 6.128 -2.2389701e-05 -5.7895861e-05 +3061 6.13 -2.2274208e-05 -5.7597220e-05 +3062 6.132 -2.2159311e-05 -5.7300118e-05 +3063 6.134 -2.2045007e-05 -5.7004549e-05 +3064 6.136 -2.1931292e-05 -5.6710505e-05 +3065 6.138 -2.1818164e-05 -5.6417978e-05 +3066 6.14 -2.1705619e-05 -5.6126959e-05 +3067 6.142 -2.1593655e-05 -5.5837442e-05 +3068 6.144 -2.1482268e-05 -5.5549417e-05 +3069 6.146 -2.1371456e-05 -5.5262879e-05 +3070 6.148 -2.1261216e-05 -5.4977819e-05 +3071 6.15 -2.1151544e-05 -5.4694229e-05 +3072 6.152 -2.1042438e-05 -5.4412102e-05 +3073 6.154 -2.0933894e-05 -5.4131430e-05 +3074 6.156 -2.0825911e-05 -5.3852205e-05 +3075 6.158 -2.0718485e-05 -5.3574422e-05 +3076 6.16 -2.0611612e-05 -5.3298071e-05 +3077 6.162 -2.0505291e-05 -5.3023145e-05 +3078 6.164 -2.0399519e-05 -5.2749638e-05 +3079 6.166 -2.0294292e-05 -5.2477541e-05 +3080 6.168 -2.0189608e-05 -5.2206848e-05 +3081 6.17 -2.0085464e-05 -5.1937551e-05 +3082 6.172 -1.9981857e-05 -5.1669644e-05 +3083 6.174 -1.9878784e-05 -5.1403118e-05 +3084 6.176 -1.9776243e-05 -5.1137967e-05 +3085 6.178 -1.9674231e-05 -5.0874184e-05 +3086 6.18 -1.9572746e-05 -5.0611761e-05 +3087 6.182 -1.9471783e-05 -5.0350692e-05 +3088 6.184 -1.9371342e-05 -5.0090970e-05 +3089 6.186 -1.9271419e-05 -4.9832587e-05 +3090 6.188 -1.9172011e-05 -4.9575537e-05 +3091 6.19 -1.9073116e-05 -4.9319813e-05 +3092 6.192 -1.8974731e-05 -4.9065408e-05 +3093 6.194 -1.8876853e-05 -4.8812316e-05 +3094 6.196 -1.8779480e-05 -4.8560529e-05 +3095 6.198 -1.8682610e-05 -4.8310040e-05 +3096 6.2 -1.8586239e-05 -4.8060844e-05 +3097 6.202 -1.8490366e-05 -4.7812933e-05 +3098 6.204 -1.8394987e-05 -4.7566301e-05 +3099 6.206 -1.8300100e-05 -4.7320941e-05 +3100 6.208 -1.8205702e-05 -4.7076847e-05 +3101 6.21 -1.8111792e-05 -4.6834012e-05 +3102 6.212 -1.8018365e-05 -4.6592429e-05 +3103 6.214 -1.7925421e-05 -4.6352093e-05 +3104 6.216 -1.7832956e-05 -4.6112996e-05 +3105 6.218 -1.7740968e-05 -4.5875133e-05 +3106 6.22 -1.7649455e-05 -4.5638496e-05 +3107 6.222 -1.7558413e-05 -4.5403080e-05 +3108 6.224 -1.7467842e-05 -4.5168879e-05 +3109 6.226 -1.7377737e-05 -4.4935885e-05 +3110 6.228 -1.7288097e-05 -4.4704094e-05 +3111 6.23 -1.7198920e-05 -4.4473498e-05 +3112 6.232 -1.7110202e-05 -4.4244091e-05 +3113 6.234 -1.7021943e-05 -4.4015868e-05 +3114 6.236 -1.6934138e-05 -4.3788822e-05 +3115 6.238 -1.6846787e-05 -4.3562947e-05 +3116 6.24 -1.6759886e-05 -4.3338237e-05 +3117 6.242 -1.6673433e-05 -4.3114687e-05 +3118 6.244 -1.6587426e-05 -4.2892289e-05 +3119 6.246 -1.6501863e-05 -4.2671039e-05 +3120 6.248 -1.6416741e-05 -4.2450930e-05 +3121 6.25 -1.6332059e-05 -4.2231956e-05 +3122 6.252 -1.6247813e-05 -4.2014112e-05 +3123 6.254 -1.6164001e-05 -4.1797391e-05 +3124 6.256 -1.6080622e-05 -4.1581789e-05 +3125 6.258 -1.5997673e-05 -4.1367298e-05 +3126 6.26 -1.5915152e-05 -4.1153914e-05 +3127 6.262 -1.5833057e-05 -4.0941631e-05 +3128 6.264 -1.5751385e-05 -4.0730442e-05 +3129 6.266 -1.5670135e-05 -4.0520343e-05 +3130 6.268 -1.5589303e-05 -4.0311328e-05 +3131 6.27 -1.5508889e-05 -4.0103391e-05 +3132 6.272 -1.5428889e-05 -3.9896526e-05 +3133 6.274 -1.5349302e-05 -3.9690729e-05 +3134 6.276 -1.5270125e-05 -3.9485993e-05 +3135 6.278 -1.5191357e-05 -3.9282313e-05 +3136 6.28 -1.5112995e-05 -3.9079684e-05 +3137 6.282 -1.5035038e-05 -3.8878099e-05 +3138 6.284 -1.4957482e-05 -3.8677555e-05 +3139 6.286 -1.4880327e-05 -3.8478045e-05 +3140 6.288 -1.4803569e-05 -3.8279565e-05 +3141 6.29 -1.4727208e-05 -3.8082108e-05 +3142 6.292 -1.4651240e-05 -3.7885670e-05 +3143 6.294 -1.4575664e-05 -3.7690245e-05 +3144 6.296 -1.4500479e-05 -3.7495828e-05 +3145 6.298 -1.4425680e-05 -3.7302413e-05 +3146 6.3 -1.4351268e-05 -3.7109997e-05 +3147 6.302 -1.4277240e-05 -3.6918573e-05 +3148 6.304 -1.4203593e-05 -3.6728136e-05 +3149 6.306 -1.4130327e-05 -3.6538682e-05 +3150 6.308 -1.4057438e-05 -3.6350205e-05 +3151 6.31 -1.3984925e-05 -3.6162700e-05 +3152 6.312 -1.3912786e-05 -3.5976163e-05 +3153 6.314 -1.3841020e-05 -3.5790588e-05 +3154 6.316 -1.3769623e-05 -3.5605969e-05 +3155 6.318 -1.3698595e-05 -3.5422304e-05 +3156 6.32 -1.3627934e-05 -3.5239585e-05 +3157 6.322 -1.3557636e-05 -3.5057809e-05 +3158 6.324 -1.3487702e-05 -3.4876971e-05 +3159 6.326 -1.3418128e-05 -3.4697065e-05 +3160 6.328 -1.3348913e-05 -3.4518088e-05 +3161 6.33 -1.3280055e-05 -3.4340034e-05 +3162 6.332 -1.3211552e-05 -3.4162898e-05 +3163 6.334 -1.3143403e-05 -3.3986676e-05 +3164 6.336 -1.3075605e-05 -3.3811363e-05 +3165 6.338 -1.3008157e-05 -3.3636954e-05 +3166 6.34 -1.2941056e-05 -3.3463445e-05 +3167 6.342 -1.2874302e-05 -3.3290831e-05 +3168 6.344 -1.2807892e-05 -3.3119107e-05 +3169 6.346 -1.2741825e-05 -3.2948269e-05 +3170 6.348 -1.2676099e-05 -3.2778312e-05 +3171 6.35 -1.2610711e-05 -3.2609232e-05 +3172 6.352 -1.2545661e-05 -3.2441024e-05 +3173 6.354 -1.2480947e-05 -3.2273684e-05 +3174 6.356 -1.2416566e-05 -3.2107207e-05 +3175 6.358 -1.2352517e-05 -3.1941588e-05 +3176 6.36 -1.2288799e-05 -3.1776824e-05 +3177 6.362 -1.2225409e-05 -3.1612910e-05 +3178 6.364 -1.2162347e-05 -3.1449841e-05 +3179 6.366 -1.2099610e-05 -3.1287614e-05 +3180 6.368 -1.2037196e-05 -3.1126223e-05 +3181 6.37 -1.1975104e-05 -3.0965665e-05 +3182 6.372 -1.1913333e-05 -3.0805935e-05 +3183 6.374 -1.1851880e-05 -3.0647029e-05 +3184 6.376 -1.1790744e-05 -3.0488943e-05 +3185 6.378 -1.1729923e-05 -3.0331672e-05 +3186 6.38 -1.1669417e-05 -3.0175212e-05 +3187 6.382 -1.1609222e-05 -3.0019559e-05 +3188 6.384 -1.1549338e-05 -2.9864710e-05 +3189 6.386 -1.1489763e-05 -2.9710659e-05 +3190 6.388 -1.1430495e-05 -2.9557402e-05 +3191 6.39 -1.1371533e-05 -2.9404936e-05 +3192 6.392 -1.1312875e-05 -2.9253257e-05 +3193 6.394 -1.1254519e-05 -2.9102360e-05 +3194 6.396 -1.1196465e-05 -2.8952241e-05 +3195 6.398 -1.1138710e-05 -2.8802897e-05 +3196 6.4 -1.1081252e-05 -2.8654323e-05 +3197 6.402 -1.1024092e-05 -2.8506516e-05 +3198 6.404 -1.0967226e-05 -2.8359471e-05 +3199 6.406 -1.0910653e-05 -2.8213184e-05 +3200 6.408 -1.0854373e-05 -2.8067652e-05 +3201 6.41 -1.0798382e-05 -2.7922871e-05 +3202 6.412 -1.0742681e-05 -2.7778836e-05 +3203 6.414 -1.0687266e-05 -2.7635545e-05 +3204 6.416 -1.0632138e-05 -2.7492992e-05 +3205 6.418 -1.0577294e-05 -2.7351175e-05 +3206 6.42 -1.0522733e-05 -2.7210090e-05 +3207 6.422 -1.0468453e-05 -2.7069732e-05 +3208 6.424 -1.0414453e-05 -2.6930098e-05 +3209 6.426 -1.0360732e-05 -2.6791185e-05 +3210 6.428 -1.0307288e-05 -2.6652988e-05 +3211 6.43 -1.0254120e-05 -2.6515504e-05 +3212 6.432 -1.0201226e-05 -2.6378729e-05 +3213 6.434 -1.0148604e-05 -2.6242659e-05 +3214 6.436 -1.0096255e-05 -2.6107292e-05 +3215 6.438 -1.0044175e-05 -2.5972623e-05 +3216 6.44 -9.9923636e-06 -2.5838648e-05 +3217 6.442 -9.9408197e-06 -2.5705364e-05 +3218 6.444 -9.8895417e-06 -2.5572768e-05 +3219 6.446 -9.8385282e-06 -2.5440856e-05 +3220 6.448 -9.7877778e-06 -2.5309625e-05 +3221 6.45 -9.7372892e-06 -2.5179070e-05 +3222 6.452 -9.6870611e-06 -2.5049189e-05 +3223 6.454 -9.6370920e-06 -2.4919978e-05 +3224 6.456 -9.5873807e-06 -2.4791433e-05 +3225 6.458 -9.5379259e-06 -2.4663551e-05 +3226 6.46 -9.4887261e-06 -2.4536329e-05 +3227 6.462 -9.4397801e-06 -2.4409763e-05 +3228 6.464 -9.3910866e-06 -2.4283850e-05 +3229 6.466 -9.3426443e-06 -2.4158587e-05 +3230 6.468 -9.2944518e-06 -2.4033969e-05 +3231 6.47 -9.2465080e-06 -2.3909995e-05 +3232 6.472 -9.1988114e-06 -2.3786660e-05 +3233 6.474 -9.1513609e-06 -2.3663961e-05 +3234 6.476 -9.1041552e-06 -2.3541895e-05 +3235 6.478 -9.0571929e-06 -2.3420459e-05 +3236 6.48 -9.0104729e-06 -2.3299649e-05 +3237 6.482 -8.9639939e-06 -2.3179462e-05 +3238 6.484 -8.9177547e-06 -2.3059896e-05 +3239 6.486 -8.8717539e-06 -2.2940946e-05 +3240 6.488 -8.8259905e-06 -2.2822609e-05 +3241 6.49 -8.7804631e-06 -2.2704883e-05 +3242 6.492 -8.7351705e-06 -2.2587764e-05 +3243 6.494 -8.6901116e-06 -2.2471250e-05 +3244 6.496 -8.6452851e-06 -2.2355336e-05 +3245 6.498 -8.6006899e-06 -2.2240021e-05 +3246 6.5 -8.5563246e-06 -2.2125300e-05 +3247 6.502 -8.5121883e-06 -2.2011171e-05 +3248 6.504 -8.4682796e-06 -2.1897630e-05 +3249 6.506 -8.4245974e-06 -2.1784676e-05 +3250 6.508 -8.3811405e-06 -2.1672304e-05 +3251 6.51 -8.3379078e-06 -2.1560511e-05 +3252 6.512 -8.2948980e-06 -2.1449295e-05 +3253 6.514 -8.2521102e-06 -2.1338653e-05 +3254 6.516 -8.2095431e-06 -2.1228582e-05 +3255 6.518 -8.1671955e-06 -2.1119078e-05 +3256 6.52 -8.1250664e-06 -2.1010140e-05 +3257 6.522 -8.0831546e-06 -2.0901763e-05 +3258 6.524 -8.0414589e-06 -2.0793945e-05 +3259 6.526 -7.9999784e-06 -2.0686684e-05 +3260 6.528 -7.9587118e-06 -2.0579975e-05 +3261 6.53 -7.9176581e-06 -2.0473817e-05 +3262 6.532 -7.8768162e-06 -2.0368207e-05 +3263 6.534 -7.8361849e-06 -2.0263142e-05 +3264 6.536 -7.7957633e-06 -2.0158618e-05 +3265 6.538 -7.7555501e-06 -2.0054634e-05 +3266 6.54 -7.7155444e-06 -1.9951186e-05 +3267 6.542 -7.6757450e-06 -1.9848271e-05 +3268 6.544 -7.6361509e-06 -1.9745888e-05 +3269 6.546 -7.5967611e-06 -1.9644032e-05 +3270 6.548 -7.5575745e-06 -1.9542702e-05 +3271 6.55 -7.5185900e-06 -1.9441895e-05 +3272 6.552 -7.4798065e-06 -1.9341608e-05 +3273 6.554 -7.4412232e-06 -1.9241838e-05 +3274 6.556 -7.4028388e-06 -1.9142582e-05 +3275 6.558 -7.3646525e-06 -1.9043839e-05 +3276 6.56 -7.3266631e-06 -1.8945605e-05 +3277 6.562 -7.2888698e-06 -1.8847877e-05 +3278 6.564 -7.2512713e-06 -1.8750654e-05 +3279 6.566 -7.2138668e-06 -1.8653932e-05 +3280 6.568 -7.1766552e-06 -1.8557710e-05 +3281 6.57 -7.1396356e-06 -1.8461983e-05 +3282 6.572 -7.1028070e-06 -1.8366751e-05 +3283 6.574 -7.0661683e-06 -1.8272009e-05 +3284 6.576 -7.0297186e-06 -1.8177756e-05 +3285 6.578 -6.9934570e-06 -1.8083990e-05 +3286 6.58 -6.9573823e-06 -1.7990707e-05 +3287 6.582 -6.9214938e-06 -1.7897905e-05 +3288 6.584 -6.8857904e-06 -1.7805582e-05 +3289 6.586 -6.8502712e-06 -1.7713735e-05 +3290 6.588 -6.8149351e-06 -1.7622362e-05 +3291 6.59 -6.7797814e-06 -1.7531461e-05 +3292 6.592 -6.7448090e-06 -1.7441028e-05 +3293 6.594 -6.7100170e-06 -1.7351062e-05 +3294 6.596 -6.6754044e-06 -1.7261559e-05 +3295 6.598 -6.6409704e-06 -1.7172519e-05 +3296 6.6 -6.6067140e-06 -1.7083938e-05 +3297 6.602 -6.5726344e-06 -1.6995813e-05 +3298 6.604 -6.5387305e-06 -1.6908144e-05 +3299 6.606 -6.5050015e-06 -1.6820926e-05 +3300 6.608 -6.4714465e-06 -1.6734158e-05 +3301 6.61 -6.4380646e-06 -1.6647838e-05 +3302 6.612 -6.4048548e-06 -1.6561964e-05 +3303 6.614 -6.3718164e-06 -1.6476532e-05 +3304 6.616 -6.3389484e-06 -1.6391541e-05 +3305 6.618 -6.3062500e-06 -1.6306988e-05 +3306 6.62 -6.2737202e-06 -1.6222871e-05 +3307 6.622 -6.2413582e-06 -1.6139188e-05 +3308 6.624 -6.2091631e-06 -1.6055937e-05 +3309 6.626 -6.1771341e-06 -1.5973116e-05 +3310 6.628 -6.1452704e-06 -1.5890721e-05 +3311 6.63 -6.1135710e-06 -1.5808752e-05 +3312 6.632 -6.0820351e-06 -1.5727206e-05 +3313 6.634 -6.0506619e-06 -1.5646080e-05 +3314 6.636 -6.0194505e-06 -1.5565372e-05 +3315 6.638 -5.9884001e-06 -1.5485081e-05 +3316 6.64 -5.9575099e-06 -1.5405204e-05 +3317 6.642 -5.9267790e-06 -1.5325739e-05 +3318 6.644 -5.8962067e-06 -1.5246684e-05 +3319 6.646 -5.8657920e-06 -1.5168037e-05 +3320 6.648 -5.8355342e-06 -1.5089795e-05 +3321 6.65 -5.8054326e-06 -1.5011957e-05 +3322 6.652 -5.7754862e-06 -1.4934521e-05 +3323 6.654 -5.7456942e-06 -1.4857484e-05 +3324 6.656 -5.7160559e-06 -1.4780844e-05 +3325 6.658 -5.6865706e-06 -1.4704600e-05 +3326 6.66 -5.6572373e-06 -1.4628749e-05 +3327 6.662 -5.6280553e-06 -1.4553289e-05 +3328 6.664 -5.5990239e-06 -1.4478219e-05 +3329 6.666 -5.5701422e-06 -1.4403535e-05 +3330 6.668 -5.5414095e-06 -1.4329237e-05 +3331 6.67 -5.5128250e-06 -1.4255323e-05 +3332 6.672 -5.4843879e-06 -1.4181789e-05 +3333 6.674 -5.4560976e-06 -1.4108635e-05 +3334 6.676 -5.4279531e-06 -1.4035858e-05 +3335 6.678 -5.3999539e-06 -1.3963457e-05 +3336 6.68 -5.3720991e-06 -1.3891429e-05 +3337 6.682 -5.3443879e-06 -1.3819772e-05 +3338 6.684 -5.3168197e-06 -1.3748485e-05 +3339 6.686 -5.2893937e-06 -1.3677566e-05 +3340 6.688 -5.2621092e-06 -1.3607013e-05 +3341 6.69 -5.2349654e-06 -1.3536824e-05 +3342 6.692 -5.2079617e-06 -1.3466996e-05 +3343 6.694 -5.1810972e-06 -1.3397529e-05 +3344 6.696 -5.1543713e-06 -1.3328421e-05 +3345 6.698 -5.1277833e-06 -1.3259668e-05 +3346 6.7 -5.1013324e-06 -1.3191271e-05 +3347 6.702 -5.0750180e-06 -1.3123226e-05 +3348 6.704 -5.0488393e-06 -1.3055532e-05 +3349 6.706 -5.0227956e-06 -1.2988187e-05 +3350 6.708 -4.9968863e-06 -1.2921190e-05 +3351 6.71 -4.9711106e-06 -1.2854538e-05 +3352 6.712 -4.9454679e-06 -1.2788231e-05 +3353 6.714 -4.9199575e-06 -1.2722265e-05 +3354 6.716 -4.8945786e-06 -1.2656639e-05 +3355 6.718 -4.8693307e-06 -1.2591352e-05 +3356 6.72 -4.8442130e-06 -1.2526402e-05 +3357 6.722 -4.8192249e-06 -1.2461787e-05 +3358 6.724 -4.7943656e-06 -1.2397505e-05 +3359 6.726 -4.7696346e-06 -1.2333554e-05 +3360 6.728 -4.7450312e-06 -1.2269934e-05 +3361 6.73 -4.7205547e-06 -1.2206642e-05 +3362 6.732 -4.6962044e-06 -1.2143676e-05 +3363 6.734 -4.6719797e-06 -1.2081035e-05 +3364 6.736 -4.6478801e-06 -1.2018717e-05 +3365 6.738 -4.6239047e-06 -1.1956721e-05 +3366 6.74 -4.6000530e-06 -1.1895044e-05 +3367 6.742 -4.5763243e-06 -1.1833685e-05 +3368 6.744 -4.5527180e-06 -1.1772643e-05 +3369 6.746 -4.5292335e-06 -1.1711916e-05 +3370 6.748 -4.5058701e-06 -1.1651502e-05 +3371 6.75 -4.4826273e-06 -1.1591400e-05 +3372 6.752 -4.4595043e-06 -1.1531608e-05 +3373 6.754 -4.4365006e-06 -1.1472124e-05 +3374 6.756 -4.4136156e-06 -1.1412947e-05 +3375 6.758 -4.3908486e-06 -1.1354076e-05 +3376 6.76 -4.3681991e-06 -1.1295508e-05 +3377 6.762 -4.3456664e-06 -1.1237242e-05 +3378 6.764 -4.3232499e-06 -1.1179276e-05 +3379 6.766 -4.3009491e-06 -1.1121610e-05 +3380 6.768 -4.2787633e-06 -1.1064241e-05 +3381 6.77 -4.2566919e-06 -1.1007168e-05 +3382 6.772 -4.2347344e-06 -1.0950390e-05 +3383 6.774 -4.2128902e-06 -1.0893904e-05 +3384 6.776 -4.1911586e-06 -1.0837710e-05 +3385 6.778 -4.1695392e-06 -1.0781805e-05 +3386 6.78 -4.1480312e-06 -1.0726189e-05 +3387 6.782 -4.1266342e-06 -1.0670860e-05 +3388 6.784 -4.1053476e-06 -1.0615816e-05 +3389 6.786 -4.0841708e-06 -1.0561056e-05 +3390 6.788 -4.0631032e-06 -1.0506579e-05 +3391 6.79 -4.0421443e-06 -1.0452383e-05 +3392 6.792 -4.0212935e-06 -1.0398466e-05 +3393 6.794 -4.0005502e-06 -1.0344827e-05 +3394 6.796 -3.9799140e-06 -1.0291465e-05 +3395 6.798 -3.9593842e-06 -1.0238378e-05 +3396 6.8 -3.9389603e-06 -1.0185565e-05 +3397 6.802 -3.9186417e-06 -1.0133025e-05 +3398 6.804 -3.8984280e-06 -1.0080755e-05 +3399 6.806 -3.8783185e-06 -1.0028756e-05 +3400 6.808 -3.8583128e-06 -9.9770240e-06 +3401 6.81 -3.8384102e-06 -9.9255592e-06 +3402 6.812 -3.8186104e-06 -9.8743599e-06 +3403 6.814 -3.7989126e-06 -9.8234247e-06 +3404 6.816 -3.7793165e-06 -9.7727523e-06 +3405 6.818 -3.7598214e-06 -9.7223412e-06 +3406 6.82 -3.7404270e-06 -9.6721902e-06 +3407 6.822 -3.7211325e-06 -9.6222979e-06 +3408 6.824 -3.7019376e-06 -9.5726629e-06 +3409 6.826 -3.6828417e-06 -9.5232839e-06 +3410 6.828 -3.6638443e-06 -9.4741597e-06 +3411 6.83 -3.6449449e-06 -9.4252889e-06 +3412 6.832 -3.6261430e-06 -9.3766701e-06 +3413 6.834 -3.6074380e-06 -9.3283022e-06 +3414 6.836 -3.5888296e-06 -9.2801837e-06 +3415 6.838 -3.5703171e-06 -9.2323135e-06 +3416 6.84 -3.5519002e-06 -9.1846902e-06 +3417 6.842 -3.5335782e-06 -9.1373125e-06 +3418 6.844 -3.5153508e-06 -9.0901792e-06 +3419 6.846 -3.4972173e-06 -9.0432891e-06 +3420 6.848 -3.4791774e-06 -8.9966408e-06 +3421 6.85 -3.4612306e-06 -8.9502332e-06 +3422 6.852 -3.4433764e-06 -8.9040649e-06 +3423 6.854 -3.4256142e-06 -8.8581348e-06 +3424 6.856 -3.4079437e-06 -8.8124416e-06 +3425 6.858 -3.3903643e-06 -8.7669841e-06 +3426 6.86 -3.3728756e-06 -8.7217611e-06 +3427 6.862 -3.3554771e-06 -8.6767714e-06 +3428 6.864 -3.3381683e-06 -8.6320137e-06 +3429 6.866 -3.3209489e-06 -8.5874869e-06 +3430 6.868 -3.3038182e-06 -8.5431898e-06 +3431 6.87 -3.2867759e-06 -8.4991212e-06 +3432 6.872 -3.2698216e-06 -8.4552799e-06 +3433 6.874 -3.2529547e-06 -8.4116648e-06 +3434 6.876 -3.2361748e-06 -8.3682746e-06 +3435 6.878 -3.2194814e-06 -8.3251083e-06 +3436 6.88 -3.2028742e-06 -8.2821646e-06 +3437 6.882 -3.1863526e-06 -8.2394425e-06 +3438 6.884 -3.1699163e-06 -8.1969407e-06 +3439 6.886 -3.1535647e-06 -8.1546582e-06 +3440 6.888 -3.1372975e-06 -8.1125937e-06 +3441 6.89 -3.1211142e-06 -8.0707463e-06 +3442 6.892 -3.1050144e-06 -8.0291147e-06 +3443 6.894 -3.0889976e-06 -7.9876978e-06 +3444 6.896 -3.0730634e-06 -7.9464946e-06 +3445 6.898 -3.0572115e-06 -7.9055040e-06 +3446 6.9 -3.0414413e-06 -7.8647247e-06 +3447 6.902 -3.0257524e-06 -7.8241559e-06 +3448 6.904 -3.0101445e-06 -7.7837963e-06 +3449 6.906 -2.9946171e-06 -7.7436448e-06 +3450 6.908 -2.9791698e-06 -7.7037005e-06 +3451 6.91 -2.9638022e-06 -7.6639623e-06 +3452 6.912 -2.9485138e-06 -7.6244290e-06 +3453 6.914 -2.9333043e-06 -7.5850997e-06 +3454 6.916 -2.9181733e-06 -7.5459732e-06 +3455 6.918 -2.9031203e-06 -7.5070485e-06 +3456 6.92 -2.8881450e-06 -7.4683247e-06 +3457 6.922 -2.8732469e-06 -7.4298006e-06 +3458 6.924 -2.8584256e-06 -7.3914752e-06 +3459 6.926 -2.8436808e-06 -7.3533475e-06 +3460 6.928 -2.8290121e-06 -7.3154164e-06 +3461 6.93 -2.8144190e-06 -7.2776811e-06 +3462 6.932 -2.7999012e-06 -7.2401404e-06 +3463 6.934 -2.7854583e-06 -7.2027933e-06 +3464 6.936 -2.7710899e-06 -7.1656389e-06 +3465 6.938 -2.7567957e-06 -7.1286761e-06 +3466 6.94 -2.7425751e-06 -7.0919040e-06 +3467 6.942 -2.7284279e-06 -7.0553216e-06 +3468 6.944 -2.7143537e-06 -7.0189279e-06 +3469 6.946 -2.7003521e-06 -6.9827219e-06 +3470 6.948 -2.6864227e-06 -6.9467027e-06 +3471 6.95 -2.6725651e-06 -6.9108692e-06 +3472 6.952 -2.6587791e-06 -6.8752207e-06 +3473 6.954 -2.6450641e-06 -6.8397560e-06 +3474 6.956 -2.6314199e-06 -6.8044742e-06 +3475 6.958 -2.6178461e-06 -6.7693744e-06 +3476 6.96 -2.6043423e-06 -6.7344557e-06 +3477 6.962 -2.5909082e-06 -6.6997171e-06 +3478 6.964 -2.5775433e-06 -6.6651577e-06 +3479 6.966 -2.5642474e-06 -6.6307766e-06 +3480 6.968 -2.5510201e-06 -6.5965728e-06 +3481 6.97 -2.5378610e-06 -6.5625455e-06 +3482 6.972 -2.5247698e-06 -6.5286937e-06 +3483 6.974 -2.5117461e-06 -6.4950165e-06 +3484 6.976 -2.4987896e-06 -6.4615130e-06 +3485 6.978 -2.4859000e-06 -6.4281823e-06 +3486 6.98 -2.4730768e-06 -6.3950236e-06 +3487 6.982 -2.4603198e-06 -6.3620359e-06 +3488 6.984 -2.4476285e-06 -6.3292184e-06 +3489 6.986 -2.4350028e-06 -6.2965701e-06 +3490 6.988 -2.4224421e-06 -6.2640903e-06 +3491 6.99 -2.4099463e-06 -6.2317780e-06 +3492 6.992 -2.3975149e-06 -6.1996324e-06 +3493 6.994 -2.3851477e-06 -6.1676526e-06 +3494 6.996 -2.3728442e-06 -6.1358378e-06 +3495 6.998 -2.3606042e-06 -6.1041870e-06 +3496 7.0 -2.3484273e-06 -6.0726996e-06 +3497 7.002 -2.3363133e-06 -6.0413745e-06 +3498 7.004 -2.3242617e-06 -6.0102111e-06 +3499 7.006 -2.3122723e-06 -5.9792084e-06 +3500 7.008 -2.3003448e-06 -5.9483656e-06 +3501 7.01 -2.2884788e-06 -5.9176819e-06 +3502 7.012 -2.2766740e-06 -5.8871565e-06 +3503 7.014 -2.2649300e-06 -5.8567886e-06 +3504 7.016 -2.2532467e-06 -5.8265773e-06 +3505 7.018 -2.2416236e-06 -5.7965218e-06 +3506 7.02 -2.2300605e-06 -5.7666214e-06 +3507 7.022 -2.2185570e-06 -5.7368752e-06 +3508 7.024 -2.2071129e-06 -5.7072824e-06 +3509 7.026 -2.1957278e-06 -5.6778423e-06 +3510 7.028 -2.1844014e-06 -5.6485541e-06 +3511 7.03 -2.1731335e-06 -5.6194169e-06 +3512 7.032 -2.1619237e-06 -5.5904301e-06 +3513 7.034 -2.1507717e-06 -5.5615927e-06 +3514 7.036 -2.1396772e-06 -5.5329041e-06 +3515 7.038 -2.1286399e-06 -5.5043635e-06 +3516 7.04 -2.1176596e-06 -5.4759702e-06 +3517 7.042 -2.1067360e-06 -5.4477232e-06 +3518 7.044 -2.0958687e-06 -5.4196220e-06 +3519 7.046 -2.0850574e-06 -5.3916658e-06 +3520 7.048 -2.0743019e-06 -5.3638537e-06 +3521 7.05 -2.0636019e-06 -5.3361851e-06 +3522 7.052 -2.0529571e-06 -5.3086593e-06 +3523 7.054 -2.0423671e-06 -5.2812754e-06 +3524 7.056 -2.0318319e-06 -5.2540328e-06 +3525 7.058 -2.0213509e-06 -5.2269307e-06 +3526 7.06 -2.0109240e-06 -5.1999684e-06 +3527 7.062 -2.0005510e-06 -5.1731452e-06 +3528 7.064 -1.9902314e-06 -5.1464603e-06 +3529 7.066 -1.9799650e-06 -5.1199131e-06 +3530 7.068 -1.9697516e-06 -5.0935029e-06 +3531 7.07 -1.9595909e-06 -5.0672288e-06 +3532 7.072 -1.9494826e-06 -5.0410903e-06 +3533 7.074 -1.9394265e-06 -5.0150867e-06 +3534 7.076 -1.9294222e-06 -4.9892171e-06 +3535 7.078 -1.9194695e-06 -4.9634811e-06 +3536 7.08 -1.9095682e-06 -4.9378777e-06 +3537 7.082 -1.8997179e-06 -4.9124065e-06 +3538 7.084 -1.8899185e-06 -4.8870666e-06 +3539 7.086 -1.8801696e-06 -4.8618574e-06 +3540 7.088 -1.8704709e-06 -4.8367783e-06 +3541 7.09 -1.8608224e-06 -4.8118285e-06 +3542 7.092 -1.8512235e-06 -4.7870075e-06 +3543 7.094 -1.8416742e-06 -4.7623144e-06 +3544 7.096 -1.8321742e-06 -4.7377488e-06 +3545 7.098 -1.8227232e-06 -4.7133099e-06 +3546 7.1 -1.8133209e-06 -4.6889970e-06 +3547 7.102 -1.8039671e-06 -4.6648095e-06 +3548 7.104 -1.7946616e-06 -4.6407468e-06 +3549 7.106 -1.7854040e-06 -4.6168083e-06 +3550 7.108 -1.7761942e-06 -4.5929932e-06 +3551 7.11 -1.7670320e-06 -4.5693010e-06 +3552 7.112 -1.7579170e-06 -4.5457309e-06 +3553 7.114 -1.7488490e-06 -4.5222825e-06 +3554 7.116 -1.7398277e-06 -4.4989550e-06 +3555 7.118 -1.7308531e-06 -4.4757478e-06 +3556 7.12 -1.7219247e-06 -4.4526604e-06 +3557 7.122 -1.7130423e-06 -4.4296920e-06 +3558 7.124 -1.7042058e-06 -4.4068422e-06 +3559 7.126 -1.6954149e-06 -4.3841101e-06 +3560 7.128 -1.6866693e-06 -4.3614954e-06 +3561 7.13 -1.6779688e-06 -4.3389973e-06 +3562 7.132 -1.6693132e-06 -4.3166153e-06 +3563 7.134 -1.6607023e-06 -4.2943487e-06 +3564 7.136 -1.6521358e-06 -4.2721969e-06 +3565 7.138 -1.6436134e-06 -4.2501595e-06 +3566 7.14 -1.6351351e-06 -4.2282357e-06 +3567 7.142 -1.6267004e-06 -4.2064250e-06 +3568 7.144 -1.6183093e-06 -4.1847268e-06 +3569 7.146 -1.6099614e-06 -4.1631405e-06 +3570 7.148 -1.6016566e-06 -4.1416656e-06 +3571 7.15 -1.5933947e-06 -4.1203014e-06 +3572 7.152 -1.5851754e-06 -4.0990475e-06 +3573 7.154 -1.5769984e-06 -4.0779032e-06 +3574 7.156 -1.5688637e-06 -4.0568680e-06 +3575 7.158 -1.5607709e-06 -4.0359412e-06 +3576 7.16 -1.5527198e-06 -4.0151225e-06 +3577 7.162 -1.5447103e-06 -3.9944111e-06 +3578 7.164 -1.5367421e-06 -3.9738065e-06 +3579 7.166 -1.5288150e-06 -3.9533082e-06 +3580 7.168 -1.5209288e-06 -3.9329157e-06 +3581 7.17 -1.5130833e-06 -3.9126284e-06 +3582 7.172 -1.5052782e-06 -3.8924457e-06 +3583 7.174 -1.4975134e-06 -3.8723671e-06 +3584 7.176 -1.4897887e-06 -3.8523921e-06 +3585 7.178 -1.4821038e-06 -3.8325201e-06 +3586 7.18 -1.4744586e-06 -3.8127506e-06 +3587 7.182 -1.4668527e-06 -3.7930831e-06 +3588 7.184 -1.4592862e-06 -3.7735171e-06 +3589 7.186 -1.4517586e-06 -3.7540520e-06 +3590 7.188 -1.4442699e-06 -3.7346873e-06 +3591 7.19 -1.4368198e-06 -3.7154224e-06 +3592 7.192 -1.4294081e-06 -3.6962570e-06 +3593 7.194 -1.4220347e-06 -3.6771904e-06 +3594 7.196 -1.4146993e-06 -3.6582222e-06 +3595 7.198 -1.4074017e-06 -3.6393518e-06 +3596 7.2 -1.4001418e-06 -3.6205788e-06 +3597 7.202 -1.3929194e-06 -3.6019026e-06 +3598 7.204 -1.3857341e-06 -3.5833227e-06 +3599 7.206 -1.3785860e-06 -3.5648387e-06 +3600 7.208 -1.3714747e-06 -3.5464500e-06 +3601 7.21 -1.3644001e-06 -3.5281562e-06 +3602 7.212 -1.3573620e-06 -3.5099567e-06 +3603 7.214 -1.3503603e-06 -3.4918511e-06 +3604 7.216 -1.3433946e-06 -3.4738389e-06 +3605 7.218 -1.3364648e-06 -3.4559197e-06 +3606 7.22 -1.3295708e-06 -3.4380928e-06 +3607 7.222 -1.3227124e-06 -3.4203579e-06 +3608 7.224 -1.3158893e-06 -3.4027145e-06 +3609 7.226 -1.3091015e-06 -3.3851621e-06 +3610 7.228 -1.3023486e-06 -3.3677003e-06 +3611 7.23 -1.2956306e-06 -3.3503285e-06 +3612 7.232 -1.2889473e-06 -3.3330463e-06 +3613 7.234 -1.2822984e-06 -3.3158533e-06 +3614 7.236 -1.2756838e-06 -3.2987490e-06 +3615 7.238 -1.2691033e-06 -3.2817329e-06 +3616 7.24 -1.2625568e-06 -3.2648046e-06 +3617 7.242 -1.2560440e-06 -3.2479635e-06 +3618 7.244 -1.2495649e-06 -3.2312094e-06 +3619 7.246 -1.2431192e-06 -3.2145417e-06 +3620 7.248 -1.2367067e-06 -3.1979600e-06 +3621 7.25 -1.2303273e-06 -3.1814638e-06 +3622 7.252 -1.2239808e-06 -3.1650527e-06 +3623 7.254 -1.2176670e-06 -3.1487262e-06 +3624 7.256 -1.2113858e-06 -3.1324840e-06 +3625 7.258 -1.2051370e-06 -3.1163255e-06 +3626 7.26 -1.1989204e-06 -3.1002504e-06 +3627 7.262 -1.1927359e-06 -3.0842582e-06 +3628 7.264 -1.1865833e-06 -3.0683485e-06 +3629 7.266 -1.1804625e-06 -3.0525209e-06 +3630 7.268 -1.1743732e-06 -3.0367749e-06 +3631 7.27 -1.1683153e-06 -3.0211102e-06 +3632 7.272 -1.1622887e-06 -3.0055262e-06 +3633 7.274 -1.1562932e-06 -2.9900227e-06 +3634 7.276 -1.1503286e-06 -2.9745991e-06 +3635 7.278 -1.1443947e-06 -2.9592551e-06 +3636 7.28 -1.1384915e-06 -2.9439902e-06 +3637 7.282 -1.1326187e-06 -2.9288040e-06 +3638 7.284 -1.1267762e-06 -2.9136962e-06 +3639 7.286 -1.1209639e-06 -2.8986664e-06 +3640 7.288 -1.1151815e-06 -2.8837140e-06 +3641 7.29 -1.1094290e-06 -2.8688388e-06 +3642 7.292 -1.1037061e-06 -2.8540403e-06 +3643 7.294 -1.0980128e-06 -2.8393182e-06 +3644 7.296 -1.0923488e-06 -2.8246720e-06 +3645 7.298 -1.0867140e-06 -2.8101013e-06 +3646 7.3 -1.0811083e-06 -2.7956058e-06 +3647 7.302 -1.0755315e-06 -2.7811851e-06 +3648 7.304 -1.0699835e-06 -2.7668387e-06 +3649 7.306 -1.0644641e-06 -2.7525664e-06 +3650 7.308 -1.0589732e-06 -2.7383677e-06 +3651 7.31 -1.0535106e-06 -2.7242422e-06 +3652 7.312 -1.0480762e-06 -2.7101896e-06 +3653 7.314 -1.0426698e-06 -2.6962095e-06 +3654 7.316 -1.0372913e-06 -2.6823015e-06 +3655 7.318 -1.0319406e-06 -2.6684652e-06 +3656 7.32 -1.0266174e-06 -2.6547003e-06 +3657 7.322 -1.0213217e-06 -2.6410065e-06 +3658 7.324 -1.0160533e-06 -2.6273832e-06 +3659 7.326 -1.0108121e-06 -2.6138302e-06 +3660 7.328 -1.0055980e-06 -2.6003472e-06 +3661 7.33 -1.0004107e-06 -2.5869337e-06 +3662 7.332 -9.9525019e-07 -2.5735893e-06 +3663 7.334 -9.9011629e-07 -2.5603138e-06 +3664 7.336 -9.8500889e-07 -2.5471068e-06 +3665 7.338 -9.7992782e-07 -2.5339679e-06 +3666 7.34 -9.7487297e-07 -2.5208968e-06 +3667 7.342 -9.6984419e-07 -2.5078932e-06 +3668 7.344 -9.6484135e-07 -2.4949566e-06 +3669 7.346 -9.5986432e-07 -2.4820867e-06 +3670 7.348 -9.5491296e-07 -2.4692832e-06 +3671 7.35 -9.4998714e-07 -2.4565457e-06 +3672 7.352 -9.4508673e-07 -2.4438740e-06 +3673 7.354 -9.4021160e-07 -2.4312676e-06 +3674 7.356 -9.3536162e-07 -2.4187263e-06 +3675 7.358 -9.3053665e-07 -2.4062496e-06 +3676 7.36 -9.2573658e-07 -2.3938373e-06 +3677 7.362 -9.2096126e-07 -2.3814891e-06 +3678 7.364 -9.1621058e-07 -2.3692045e-06 +3679 7.366 -9.1148440e-07 -2.3569833e-06 +3680 7.368 -9.0678260e-07 -2.3448251e-06 +3681 7.37 -9.0210506e-07 -2.3327297e-06 +3682 7.372 -8.9745164e-07 -2.3206966e-06 +3683 7.374 -8.9282223e-07 -2.3087257e-06 +3684 7.376 -8.8821670e-07 -2.2968164e-06 +3685 7.378 -8.8363493e-07 -2.2849686e-06 +3686 7.38 -8.7907678e-07 -2.2731819e-06 +3687 7.382 -8.7454216e-07 -2.2614560e-06 +3688 7.384 -8.7003092e-07 -2.2497906e-06 +3689 7.386 -8.6554295e-07 -2.2381854e-06 +3690 7.388 -8.6107814e-07 -2.2266401e-06 +3691 7.39 -8.5663635e-07 -2.2151542e-06 +3692 7.392 -8.5221748e-07 -2.2037277e-06 +3693 7.394 -8.4782140e-07 -2.1923601e-06 +3694 7.396 -8.4344800e-07 -2.1810511e-06 +3695 7.398 -8.3909716e-07 -2.1698004e-06 +3696 7.4 -8.3476876e-07 -2.1586078e-06 +3697 7.402 -8.3046269e-07 -2.1474730e-06 +3698 7.404 -8.2617883e-07 -2.1363955e-06 +3699 7.406 -8.2191707e-07 -2.1253752e-06 +3700 7.408 -8.1767729e-07 -2.1144118e-06 +3701 7.41 -8.1345939e-07 -2.1035049e-06 +3702 7.412 -8.0926324e-07 -2.0926542e-06 +3703 7.414 -8.0508873e-07 -2.0818596e-06 +3704 7.416 -8.0093576e-07 -2.0711206e-06 +3705 7.418 -7.9680421e-07 -2.0604370e-06 +3706 7.42 -7.9269398e-07 -2.0498085e-06 +3707 7.422 -7.8860494e-07 -2.0392349e-06 +3708 7.424 -7.8453700e-07 -2.0287158e-06 +3709 7.426 -7.8049004e-07 -2.0182509e-06 +3710 7.428 -7.7646396e-07 -2.0078401e-06 +3711 7.43 -7.7245865e-07 -1.9974829e-06 +3712 7.432 -7.6847399e-07 -1.9871792e-06 +3713 7.434 -7.6450989e-07 -1.9769286e-06 +3714 7.436 -7.6056624e-07 -1.9667309e-06 +3715 7.438 -7.5664294e-07 -1.9565857e-06 +3716 7.44 -7.5273987e-07 -1.9464930e-06 +3717 7.442 -7.4885693e-07 -1.9364523e-06 +3718 7.444 -7.4499402e-07 -1.9264633e-06 +3719 7.446 -7.4115104e-07 -1.9165259e-06 +3720 7.448 -7.3732788e-07 -1.9066398e-06 +3721 7.45 -7.3352445e-07 -1.8968047e-06 +3722 7.452 -7.2974063e-07 -1.8870203e-06 +3723 7.454 -7.2597633e-07 -1.8772863e-06 +3724 7.456 -7.2223145e-07 -1.8676026e-06 +3725 7.458 -7.1850589e-07 -1.8579688e-06 +3726 7.46 -7.1479955e-07 -1.8483848e-06 +3727 7.462 -7.1111232e-07 -1.8388501e-06 +3728 7.464 -7.0744411e-07 -1.8293647e-06 +3729 7.466 -7.0379483e-07 -1.8199281e-06 +3730 7.468 -7.0016437e-07 -1.8105403e-06 +3731 7.47 -6.9655263e-07 -1.8012009e-06 +3732 7.472 -6.9295953e-07 -1.7919096e-06 +3733 7.474 -6.8938496e-07 -1.7826663e-06 +3734 7.476 -6.8582883e-07 -1.7734706e-06 +3735 7.478 -6.8229105e-07 -1.7643224e-06 +3736 7.48 -6.7877151e-07 -1.7552214e-06 +3737 7.482 -6.7527013e-07 -1.7461673e-06 +3738 7.484 -6.7178681e-07 -1.7371600e-06 +3739 7.486 -6.6832146e-07 -1.7281991e-06 +3740 7.488 -6.6487399e-07 -1.7192844e-06 +3741 7.49 -6.6144429e-07 -1.7104157e-06 +3742 7.492 -6.5803229e-07 -1.7015927e-06 +3743 7.494 -6.5463789e-07 -1.6928153e-06 +3744 7.496 -6.5126100e-07 -1.6840832e-06 +3745 7.498 -6.4790153e-07 -1.6753960e-06 +3746 7.5 -6.4455939e-07 -1.6667537e-06 +3747 7.502 -6.4123448e-07 -1.6581560e-06 +3748 7.504 -6.3792673e-07 -1.6496026e-06 +3749 7.506 -6.3463604e-07 -1.6410934e-06 +3750 7.508 -6.3136233e-07 -1.6326280e-06 +3751 7.51 -6.2810550e-07 -1.6242063e-06 +3752 7.512 -6.2486548e-07 -1.6158281e-06 +3753 7.514 -6.2164216e-07 -1.6074930e-06 +3754 7.516 -6.1843548e-07 -1.5992010e-06 +3755 7.518 -6.1524533e-07 -1.5909517e-06 +3756 7.52 -6.1207164e-07 -1.5827450e-06 +3757 7.522 -6.0891432e-07 -1.5745806e-06 +3758 7.524 -6.0577329e-07 -1.5664584e-06 +3759 7.526 -6.0264846e-07 -1.5583780e-06 +3760 7.528 -5.9953975e-07 -1.5503393e-06 +3761 7.53 -5.9644707e-07 -1.5423421e-06 +3762 7.532 -5.9337035e-07 -1.5343861e-06 +3763 7.534 -5.9030950e-07 -1.5264712e-06 +3764 7.536 -5.8726444e-07 -1.5185971e-06 +3765 7.538 -5.8423509e-07 -1.5107636e-06 +3766 7.54 -5.8122136e-07 -1.5029706e-06 +3767 7.542 -5.7822318e-07 -1.4952177e-06 +3768 7.544 -5.7524046e-07 -1.4875048e-06 +3769 7.546 -5.7227313e-07 -1.4798317e-06 +3770 7.548 -5.6932111e-07 -1.4721982e-06 +3771 7.55 -5.6638431e-07 -1.4646040e-06 +3772 7.552 -5.6346267e-07 -1.4570491e-06 +3773 7.554 -5.6055609e-07 -1.4495331e-06 +3774 7.556 -5.5766451e-07 -1.4420559e-06 +3775 7.558 -5.5478784e-07 -1.4346172e-06 +3776 7.56 -5.5192601e-07 -1.4272169e-06 +3777 7.562 -5.4907895e-07 -1.4198548e-06 +3778 7.564 -5.4624657e-07 -1.4125307e-06 +3779 7.566 -5.4342880e-07 -1.4052443e-06 +3780 7.568 -5.4062557e-07 -1.3979955e-06 +3781 7.57 -5.3783679e-07 -1.3907842e-06 +3782 7.572 -5.3506241e-07 -1.3836100e-06 +3783 7.574 -5.3230233e-07 -1.3764728e-06 +3784 7.576 -5.2955649e-07 -1.3693725e-06 +3785 7.578 -5.2682482e-07 -1.3623087e-06 +3786 7.58 -5.2410723e-07 -1.3552814e-06 +3787 7.582 -5.2140367e-07 -1.3482904e-06 +3788 7.584 -5.1871405e-07 -1.3413354e-06 +3789 7.586 -5.1603830e-07 -1.3344163e-06 +3790 7.588 -5.1337636e-07 -1.3275329e-06 +3791 7.59 -5.1072814e-07 -1.3206850e-06 +3792 7.592 -5.0809359e-07 -1.3138724e-06 +3793 7.594 -5.0547263e-07 -1.3070950e-06 +3794 7.596 -5.0286519e-07 -1.3003525e-06 +3795 7.598 -5.0027120e-07 -1.2936448e-06 +3796 7.6 -4.9769059e-07 -1.2869717e-06 +3797 7.602 -4.9512329e-07 -1.2803330e-06 +3798 7.604 -4.9256923e-07 -1.2737286e-06 +3799 7.606 -4.9002835e-07 -1.2671582e-06 +3800 7.608 -4.8750058e-07 -1.2606217e-06 +3801 7.61 -4.8498584e-07 -1.2541190e-06 +3802 7.612 -4.8248408e-07 -1.2476497e-06 +3803 7.614 -4.7999522e-07 -1.2412139e-06 +3804 7.616 -4.7751920e-07 -1.2348113e-06 +3805 7.618 -4.7505595e-07 -1.2284416e-06 +3806 7.62 -4.7260541e-07 -1.2221049e-06 +3807 7.622 -4.7016751e-07 -1.2158008e-06 +3808 7.624 -4.6774219e-07 -1.2095293e-06 +3809 7.626 -4.6532937e-07 -1.2032901e-06 +3810 7.628 -4.6292901e-07 -1.1970830e-06 +3811 7.63 -4.6054102e-07 -1.1909080e-06 +3812 7.632 -4.5816535e-07 -1.1847649e-06 +3813 7.634 -4.5580194e-07 -1.1786534e-06 +3814 7.636 -4.5345072e-07 -1.1725735e-06 +3815 7.638 -4.5111163e-07 -1.1665249e-06 +3816 7.64 -4.4878460e-07 -1.1605075e-06 +3817 7.642 -4.4646957e-07 -1.1545212e-06 +3818 7.644 -4.4416649e-07 -1.1485658e-06 +3819 7.646 -4.4187529e-07 -1.1426410e-06 +3820 7.648 -4.3959591e-07 -1.1367468e-06 +3821 7.65 -4.3732828e-07 -1.1308831e-06 +3822 7.652 -4.3507236e-07 -1.1250496e-06 +3823 7.654 -4.3282807e-07 -1.1192461e-06 +3824 7.656 -4.3059535e-07 -1.1134726e-06 +3825 7.658 -4.2837415e-07 -1.1077289e-06 +3826 7.66 -4.2616442e-07 -1.1020148e-06 +3827 7.662 -4.2396608e-07 -1.0963302e-06 +3828 7.664 -4.2177908e-07 -1.0906750e-06 +3829 7.666 -4.1960336e-07 -1.0850488e-06 +3830 7.668 -4.1743886e-07 -1.0794518e-06 +3831 7.67 -4.1528553e-07 -1.0738835e-06 +3832 7.672 -4.1314331e-07 -1.0683440e-06 +3833 7.674 -4.1101214e-07 -1.0628331e-06 +3834 7.676 -4.0889196e-07 -1.0573506e-06 +3835 7.678 -4.0678271e-07 -1.0518964e-06 +3836 7.68 -4.0468435e-07 -1.0464703e-06 +3837 7.682 -4.0259681e-07 -1.0410722e-06 +3838 7.684 -4.0052004e-07 -1.0357020e-06 +3839 7.686 -3.9845399e-07 -1.0303595e-06 +3840 7.688 -3.9639859e-07 -1.0250445e-06 +3841 7.69 -3.9435379e-07 -1.0197569e-06 +3842 7.692 -3.9231954e-07 -1.0144966e-06 +3843 7.694 -3.9029579e-07 -1.0092635e-06 +3844 7.696 -3.8828247e-07 -1.0040573e-06 +3845 7.698 -3.8627954e-07 -9.9887798e-07 +3846 7.7 -3.8428694e-07 -9.9372539e-07 +3847 7.702 -3.8230462e-07 -9.8859938e-07 +3848 7.704 -3.8033253e-07 -9.8349981e-07 +3849 7.706 -3.7837060e-07 -9.7842654e-07 +3850 7.708 -3.7641880e-07 -9.7337944e-07 +3851 7.71 -3.7447707e-07 -9.6835838e-07 +3852 7.712 -3.7254535e-07 -9.6336322e-07 +3853 7.714 -3.7062360e-07 -9.5839383e-07 +3854 7.716 -3.6871176e-07 -9.5345007e-07 +3855 7.718 -3.6680978e-07 -9.4853181e-07 +3856 7.72 -3.6491761e-07 -9.4363892e-07 +3857 7.722 -3.6303521e-07 -9.3877127e-07 +3858 7.724 -3.6116251e-07 -9.3392873e-07 +3859 7.726 -3.5929948e-07 -9.2911117e-07 +3860 7.728 -3.5744605e-07 -9.2431846e-07 +3861 7.73 -3.5560219e-07 -9.1955048e-07 +3862 7.732 -3.5376783e-07 -9.1480708e-07 +3863 7.734 -3.5194294e-07 -9.1008816e-07 +3864 7.736 -3.5012746e-07 -9.0539358e-07 +3865 7.738 -3.4832135e-07 -9.0072321e-07 +3866 7.74 -3.4652456e-07 -8.9607694e-07 +3867 7.742 -3.4473703e-07 -8.9145463e-07 +3868 7.744 -3.4295872e-07 -8.8685617e-07 +3869 7.746 -3.4118959e-07 -8.8228142e-07 +3870 7.748 -3.3942958e-07 -8.7773028e-07 +3871 7.75 -3.3767865e-07 -8.7320261e-07 +3872 7.752 -3.3593675e-07 -8.6869829e-07 +3873 7.754 -3.3420384e-07 -8.6421721e-07 +3874 7.756 -3.3247987e-07 -8.5975925e-07 +3875 7.758 -3.3076479e-07 -8.5532428e-07 +3876 7.76 -3.2905856e-07 -8.5091219e-07 +3877 7.762 -3.2736113e-07 -8.4652286e-07 +3878 7.764 -3.2567245e-07 -8.4215617e-07 +3879 7.766 -3.2399249e-07 -8.3781200e-07 +3880 7.768 -3.2232119e-07 -8.3349025e-07 +3881 7.77 -3.2065851e-07 -8.2919078e-07 +3882 7.772 -3.1900441e-07 -8.2491350e-07 +3883 7.774 -3.1735884e-07 -8.2065828e-07 +3884 7.776 -3.1572176e-07 -8.1642501e-07 +3885 7.778 -3.1409313e-07 -8.1221357e-07 +3886 7.78 -3.1247289e-07 -8.0802386e-07 +3887 7.782 -3.1086102e-07 -8.0385576e-07 +3888 7.784 -3.0925746e-07 -7.9970916e-07 +3889 7.786 -3.0766217e-07 -7.9558395e-07 +3890 7.788 -3.0607511e-07 -7.9148003e-07 +3891 7.79 -3.0449623e-07 -7.8739727e-07 +3892 7.792 -3.0292550e-07 -7.8333557e-07 +3893 7.794 -3.0136288e-07 -7.7929482e-07 +3894 7.796 -2.9980831e-07 -7.7527491e-07 +3895 7.798 -2.9826176e-07 -7.7127575e-07 +3896 7.8 -2.9672319e-07 -7.6729721e-07 +3897 7.802 -2.9519256e-07 -7.6333919e-07 +3898 7.804 -2.9366982e-07 -7.5940159e-07 +3899 7.806 -2.9215494e-07 -7.5548430e-07 +3900 7.808 -2.9064787e-07 -7.5158722e-07 +3901 7.81 -2.8914858e-07 -7.4771024e-07 +3902 7.812 -2.8765702e-07 -7.4385326e-07 +3903 7.814 -2.8617315e-07 -7.4001618e-07 +3904 7.816 -2.8469694e-07 -7.3619889e-07 +3905 7.818 -2.8322834e-07 -7.3240129e-07 +3906 7.82 -2.8176732e-07 -7.2862328e-07 +3907 7.822 -2.8031384e-07 -7.2486476e-07 +3908 7.824 -2.7886785e-07 -7.2112562e-07 +3909 7.826 -2.7742932e-07 -7.1740577e-07 +3910 7.828 -2.7599821e-07 -7.1370512e-07 +3911 7.83 -2.7457449e-07 -7.1002355e-07 +3912 7.832 -2.7315811e-07 -7.0636097e-07 +3913 7.834 -2.7174903e-07 -7.0271728e-07 +3914 7.836 -2.7034722e-07 -6.9909239e-07 +3915 7.838 -2.6895265e-07 -6.9548620e-07 +3916 7.84 -2.6756527e-07 -6.9189861e-07 +3917 7.842 -2.6618504e-07 -6.8832953e-07 +3918 7.844 -2.6481194e-07 -6.8477885e-07 +3919 7.846 -2.6344591e-07 -6.8124650e-07 +3920 7.848 -2.6208694e-07 -6.7773236e-07 +3921 7.85 -2.6073497e-07 -6.7423635e-07 +3922 7.852 -2.5938998e-07 -6.7075838e-07 +3923 7.854 -2.5805193e-07 -6.6729834e-07 +3924 7.856 -2.5672078e-07 -6.6385616e-07 +3925 7.858 -2.5539649e-07 -6.6043173e-07 +3926 7.86 -2.5407904e-07 -6.5702496e-07 +3927 7.862 -2.5276838e-07 -6.5363577e-07 +3928 7.864 -2.5146448e-07 -6.5026406e-07 +3929 7.866 -2.5016731e-07 -6.4690974e-07 +3930 7.868 -2.4887683e-07 -6.4357272e-07 +3931 7.87 -2.4759301e-07 -6.4025292e-07 +3932 7.872 -2.4631581e-07 -6.3695025e-07 +3933 7.874 -2.4504520e-07 -6.3366461e-07 +3934 7.876 -2.4378114e-07 -6.3039591e-07 +3935 7.878 -2.4252360e-07 -6.2714408e-07 +3936 7.88 -2.4127255e-07 -6.2390903e-07 +3937 7.882 -2.4002796e-07 -6.2069066e-07 +3938 7.884 -2.3878978e-07 -6.1748889e-07 +3939 7.886 -2.3755799e-07 -6.1430364e-07 +3940 7.888 -2.3633255e-07 -6.1113482e-07 +3941 7.89 -2.3511344e-07 -6.0798234e-07 +3942 7.892 -2.3390061e-07 -6.0484613e-07 +3943 7.894 -2.3269404e-07 -6.0172609e-07 +3944 7.896 -2.3149370e-07 -5.9862215e-07 +3945 7.898 -2.3029954e-07 -5.9553422e-07 +3946 7.9 -2.2911155e-07 -5.9246222e-07 +3947 7.902 -2.2792968e-07 -5.8940607e-07 +3948 7.904 -2.2675392e-07 -5.8636568e-07 +3949 7.906 -2.2558421e-07 -5.8334097e-07 +3950 7.908 -2.2442054e-07 -5.8033186e-07 +3951 7.91 -2.2326287e-07 -5.7733828e-07 +3952 7.912 -2.2211118e-07 -5.7436014e-07 +3953 7.914 -2.2096542e-07 -5.7139736e-07 +3954 7.916 -2.1982558e-07 -5.6844987e-07 +3955 7.918 -2.1869161e-07 -5.6551758e-07 +3956 7.92 -2.1756350e-07 -5.6260041e-07 +3957 7.922 -2.1644120e-07 -5.5969830e-07 +3958 7.924 -2.1532469e-07 -5.5681115e-07 +3959 7.926 -2.1421395e-07 -5.5393889e-07 +3960 7.928 -2.1310893e-07 -5.5108146e-07 +3961 7.93 -2.1200961e-07 -5.4823876e-07 +3962 7.932 -2.1091596e-07 -5.4541072e-07 +3963 7.934 -2.0982796e-07 -5.4259728e-07 +3964 7.936 -2.0874557e-07 -5.3979834e-07 +3965 7.938 -2.0766876e-07 -5.3701385e-07 +3966 7.94 -2.0659750e-07 -5.3424372e-07 +3967 7.942 -2.0553177e-07 -5.3148787e-07 +3968 7.944 -2.0447154e-07 -5.2874625e-07 +3969 7.946 -2.0341678e-07 -5.2601876e-07 +3970 7.948 -2.0236746e-07 -5.2330534e-07 +3971 7.95 -2.0132355e-07 -5.2060593e-07 +3972 7.952 -2.0028502e-07 -5.1792043e-07 +3973 7.954 -1.9925186e-07 -5.1524879e-07 +3974 7.956 -1.9822402e-07 -5.1259093e-07 +3975 7.958 -1.9720148e-07 -5.0994678e-07 +3976 7.96 -1.9618422e-07 -5.0731627e-07 +3977 7.962 -1.9517221e-07 -5.0469933e-07 +3978 7.964 -1.9416542e-07 -5.0209588e-07 +3979 7.966 -1.9316382e-07 -4.9950587e-07 +3980 7.968 -1.9216738e-07 -4.9692922e-07 +3981 7.97 -1.9117609e-07 -4.9436586e-07 +3982 7.972 -1.9018991e-07 -4.9181572e-07 +3983 7.974 -1.8920882e-07 -4.8927873e-07 +3984 7.976 -1.8823279e-07 -4.8675484e-07 +3985 7.978 -1.8726179e-07 -4.8424396e-07 +3986 7.98 -1.8629580e-07 -4.8174603e-07 +3987 7.982 -1.8533480e-07 -4.7926099e-07 +3988 7.984 -1.8437875e-07 -4.7678877e-07 +3989 7.986 -1.8342763e-07 -4.7432930e-07 +3990 7.988 -1.8248142e-07 -4.7188252e-07 +3991 7.99 -1.8154010e-07 -4.6944836e-07 +3992 7.992 -1.8060362e-07 -4.6702675e-07 +3993 7.994 -1.7967198e-07 -4.6461764e-07 +3994 7.996 -1.7874514e-07 -4.6222095e-07 +3995 7.998 -1.7782309e-07 -4.5983663e-07 +3996 8.0 -1.7690579e-07 -4.5746460e-07 +3997 8.002 -1.7599322e-07 -4.5510482e-07 +3998 8.004 -1.7508536e-07 -4.5275720e-07 +3999 8.006 -1.7418218e-07 -4.5042169e-07 +4000 8.008 -1.7328367e-07 -4.4809823e-07 +4001 8.01 -1.7238978e-07 -4.4578676e-07 +4002 8.012 -1.7150051e-07 -4.4348721e-07 +4003 8.014 -1.7061583e-07 -4.4119952e-07 +4004 8.016 -1.6973571e-07 -4.3892364e-07 +4005 8.018 -1.6886012e-07 -4.3665949e-07 +4006 8.02 -1.6798906e-07 -4.3440702e-07 +4007 8.022 -1.6712249e-07 -4.3216617e-07 +4008 8.024 -1.6626039e-07 -4.2993688e-07 +4009 8.026 -1.6540273e-07 -4.2771909e-07 +4010 8.028 -1.6454950e-07 -4.2551274e-07 +4011 8.03 -1.6370068e-07 -4.2331777e-07 +4012 8.032 -1.6285623e-07 -4.2113413e-07 +4013 8.034 -1.6201613e-07 -4.1896174e-07 +4014 8.036 -1.6118037e-07 -4.1680057e-07 +4015 8.038 -1.6034892e-07 -4.1465054e-07 +4016 8.04 -1.5952176e-07 -4.1251160e-07 +4017 8.042 -1.5869887e-07 -4.1038370e-07 +4018 8.044 -1.5788022e-07 -4.0826677e-07 +4019 8.046 -1.5706579e-07 -4.0616076e-07 +4020 8.048 -1.5625557e-07 -4.0406561e-07 +4021 8.05 -1.5544952e-07 -4.0198128e-07 +4022 8.052 -1.5464764e-07 -3.9990769e-07 +4023 8.054 -1.5384989e-07 -3.9784480e-07 +4024 8.056 -1.5305625e-07 -3.9579256e-07 +4025 8.058 -1.5226671e-07 -3.9375089e-07 +4026 8.06 -1.5148124e-07 -3.9171976e-07 +4027 8.062 -1.5069982e-07 -3.8969911e-07 +4028 8.064 -1.4992244e-07 -3.8768888e-07 +4029 8.066 -1.4914906e-07 -3.8568902e-07 +4030 8.068 -1.4837967e-07 -3.8369948e-07 +4031 8.07 -1.4761426e-07 -3.8172020e-07 +4032 8.072 -1.4685279e-07 -3.7975113e-07 +4033 8.074 -1.4609524e-07 -3.7779221e-07 +4034 8.076 -1.4534161e-07 -3.7584340e-07 +4035 8.078 -1.4459186e-07 -3.7390465e-07 +4036 8.08 -1.4384598e-07 -3.7197589e-07 +4037 8.082 -1.4310395e-07 -3.7005709e-07 +4038 8.084 -1.4236575e-07 -3.6814818e-07 +4039 8.086 -1.4163135e-07 -3.6624912e-07 +4040 8.088 -1.4090075e-07 -3.6435985e-07 +4041 8.09 -1.4017391e-07 -3.6248033e-07 +4042 8.092 -1.3945082e-07 -3.6061051e-07 +4043 8.094 -1.3873146e-07 -3.5875033e-07 +4044 8.096 -1.3801581e-07 -3.5689974e-07 +4045 8.098 -1.3730385e-07 -3.5505870e-07 +4046 8.1 -1.3659557e-07 -3.5322716e-07 +4047 8.102 -1.3589094e-07 -3.5140507e-07 +4048 8.104 -1.3518994e-07 -3.4959238e-07 +4049 8.106 -1.3449256e-07 -3.4778903e-07 +4050 8.108 -1.3379878e-07 -3.4599499e-07 +4051 8.11 -1.3310858e-07 -3.4421020e-07 +4052 8.112 -1.3242193e-07 -3.4243462e-07 +4053 8.114 -1.3173883e-07 -3.4066820e-07 +4054 8.116 -1.3105926e-07 -3.3891089e-07 +4055 8.118 -1.3038318e-07 -3.3716265e-07 +4056 8.12 -1.2971060e-07 -3.3542342e-07 +4057 8.122 -1.2904148e-07 -3.3369316e-07 +4058 8.124 -1.2837582e-07 -3.3197183e-07 +4059 8.126 -1.2771359e-07 -3.3025938e-07 +4060 8.128 -1.2705478e-07 -3.2855577e-07 +4061 8.13 -1.2639936e-07 -3.2686094e-07 +4062 8.132 -1.2574733e-07 -3.2517485e-07 +4063 8.134 -1.2509866e-07 -3.2349746e-07 +4064 8.136 -1.2445333e-07 -3.2182873e-07 +4065 8.138 -1.2381134e-07 -3.2016860e-07 +4066 8.14 -1.2317265e-07 -3.1851703e-07 +4067 8.142 -1.2253726e-07 -3.1687399e-07 +4068 8.144 -1.2190515e-07 -3.1523942e-07 +4069 8.146 -1.2127630e-07 -3.1361328e-07 +4070 8.148 -1.2065069e-07 -3.1199553e-07 +4071 8.15 -1.2002831e-07 -3.1038612e-07 +4072 8.152 -1.1940914e-07 -3.0878502e-07 +4073 8.154 -1.1879317e-07 -3.0719217e-07 +4074 8.156 -1.1818037e-07 -3.0560755e-07 +4075 8.158 -1.1757073e-07 -3.0403109e-07 +4076 8.16 -1.1696424e-07 -3.0246277e-07 +4077 8.162 -1.1636087e-07 -3.0090254e-07 +4078 8.164 -1.1576062e-07 -2.9935035e-07 +4079 8.166 -1.1516347e-07 -2.9780618e-07 +4080 8.168 -1.1456939e-07 -2.9626997e-07 +4081 8.17 -1.1397838e-07 -2.9474168e-07 +4082 8.172 -1.1339042e-07 -2.9322128e-07 +4083 8.174 -1.1280549e-07 -2.9170872e-07 +4084 8.176 -1.1222358e-07 -2.9020396e-07 +4085 8.178 -1.1164467e-07 -2.8870696e-07 +4086 8.18 -1.1106875e-07 -2.8721769e-07 +4087 8.182 -1.1049579e-07 -2.8573609e-07 +4088 8.184 -1.0992580e-07 -2.8426215e-07 +4089 8.186 -1.0935874e-07 -2.8279580e-07 +4090 8.188 -1.0879461e-07 -2.8133702e-07 +4091 8.19 -1.0823339e-07 -2.7988576e-07 +4092 8.192 -1.0767506e-07 -2.7844199e-07 +4093 8.194 -1.0711961e-07 -2.7700567e-07 +4094 8.196 -1.0656703e-07 -2.7557675e-07 +4095 8.198 -1.0601730e-07 -2.7415521e-07 +4096 8.2 -1.0547041e-07 -2.7274100e-07 +4097 8.202 -1.0492633e-07 -2.7133408e-07 +4098 8.204 -1.0438507e-07 -2.6993442e-07 +4099 8.206 -1.0384659e-07 -2.6854198e-07 +4100 8.208 -1.0331089e-07 -2.6715673e-07 +4101 8.21 -1.0277796e-07 -2.6577862e-07 +4102 8.212 -1.0224777e-07 -2.6440762e-07 +4103 8.214 -1.0172032e-07 -2.6304369e-07 +4104 8.216 -1.0119560e-07 -2.6168680e-07 +4105 8.218 -1.0067357e-07 -2.6033690e-07 +4106 8.22 -1.0015424e-07 -2.5899397e-07 +4107 8.222 -9.9637592e-08 -2.5765797e-07 +4108 8.224 -9.9123606e-08 -2.5632886e-07 +4109 8.226 -9.8612272e-08 -2.5500660e-07 +4110 8.228 -9.8103575e-08 -2.5369116e-07 +4111 8.23 -9.7597503e-08 -2.5238252e-07 +4112 8.232 -9.7094041e-08 -2.5108062e-07 +4113 8.234 -9.6593176e-08 -2.4978543e-07 +4114 8.236 -9.6094895e-08 -2.4849693e-07 +4115 8.238 -9.5599184e-08 -2.4721508e-07 +4116 8.24 -9.5106030e-08 -2.4593983e-07 +4117 8.242 -9.4615420e-08 -2.4467117e-07 +4118 8.244 -9.4127341e-08 -2.4340905e-07 +4119 8.246 -9.3641780e-08 -2.4215344e-07 +4120 8.248 -9.3158723e-08 -2.4090430e-07 +4121 8.25 -9.2678158e-08 -2.3966161e-07 +4122 8.252 -9.2200072e-08 -2.3842533e-07 +4123 8.254 -9.1724452e-08 -2.3719543e-07 +4124 8.256 -9.1251286e-08 -2.3597187e-07 +4125 8.258 -9.0780561e-08 -2.3475463e-07 +4126 8.26 -9.0312263e-08 -2.3354366e-07 +4127 8.262 -8.9846382e-08 -2.3233894e-07 +4128 8.264 -8.9382904e-08 -2.3114043e-07 +4129 8.266 -8.8921816e-08 -2.2994811e-07 +4130 8.268 -8.8463107e-08 -2.2876193e-07 +4131 8.27 -8.8006764e-08 -2.2758188e-07 +4132 8.272 -8.7552776e-08 -2.2640791e-07 +4133 8.274 -8.7101129e-08 -2.2524000e-07 +4134 8.276 -8.6651812e-08 -2.2407811e-07 +4135 8.278 -8.6204812e-08 -2.2292222e-07 +4136 8.28 -8.5760119e-08 -2.2177228e-07 +4137 8.282 -8.5317719e-08 -2.2062828e-07 +4138 8.284 -8.4877602e-08 -2.1949019e-07 +4139 8.286 -8.4439754e-08 -2.1835796e-07 +4140 8.288 -8.4004166e-08 -2.1723157e-07 +4141 8.29 -8.3570824e-08 -2.1611099e-07 +4142 8.292 -8.3139718e-08 -2.1499620e-07 +4143 8.294 -8.2710836e-08 -2.1388715e-07 +4144 8.296 -8.2284166e-08 -2.1278383e-07 +4145 8.298 -8.1859697e-08 -2.1168619e-07 +4146 8.3 -8.1437417e-08 -2.1059422e-07 +4147 8.302 -8.1017316e-08 -2.0950788e-07 +4148 8.304 -8.0599382e-08 -2.0842715e-07 +4149 8.306 -8.0183604e-08 -2.0735199e-07 +4150 8.308 -7.9769970e-08 -2.0628237e-07 +4151 8.31 -7.9358470e-08 -2.0521828e-07 +4152 8.312 -7.8949093e-08 -2.0415967e-07 +4153 8.314 -7.8541828e-08 -2.0310652e-07 +4154 8.316 -7.8136664e-08 -2.0205881e-07 +4155 8.318 -7.7733589e-08 -2.0101650e-07 +4156 8.32 -7.7332594e-08 -1.9997956e-07 +4157 8.322 -7.6933667e-08 -1.9894798e-07 +4158 8.324 -7.6536799e-08 -1.9792172e-07 +4159 8.326 -7.6141977e-08 -1.9690075e-07 +4160 8.328 -7.5749192e-08 -1.9588504e-07 +4161 8.33 -7.5358433e-08 -1.9487458e-07 +4162 8.332 -7.4969690e-08 -1.9386933e-07 +4163 8.334 -7.4582953e-08 -1.9286926e-07 +4164 8.336 -7.4198210e-08 -1.9187436e-07 +4165 8.338 -7.3815452e-08 -1.9088458e-07 +4166 8.34 -7.3434668e-08 -1.8989991e-07 +4167 8.342 -7.3055849e-08 -1.8892032e-07 +4168 8.344 -7.2678983e-08 -1.8794579e-07 +4169 8.346 -7.2304062e-08 -1.8697628e-07 +4170 8.348 -7.1931075e-08 -1.8601177e-07 +4171 8.35 -7.1560012e-08 -1.8505224e-07 +4172 8.352 -7.1190863e-08 -1.8409765e-07 +4173 8.354 -7.0823618e-08 -1.8314799e-07 +4174 8.356 -7.0458268e-08 -1.8220323e-07 +4175 8.358 -7.0094802e-08 -1.8126334e-07 +4176 8.36 -6.9733211e-08 -1.8032831e-07 +4177 8.362 -6.9373485e-08 -1.7939809e-07 +4178 8.364 -6.9015615e-08 -1.7847267e-07 +4179 8.366 -6.8659591e-08 -1.7755203e-07 +4180 8.368 -6.8305404e-08 -1.7663613e-07 +4181 8.37 -6.7953044e-08 -1.7572496e-07 +4182 8.372 -6.7602501e-08 -1.7481850e-07 +4183 8.374 -6.7253767e-08 -1.7391670e-07 +4184 8.376 -6.6906831e-08 -1.7301956e-07 +4185 8.378 -6.6561685e-08 -1.7212704e-07 +4186 8.38 -6.6218320e-08 -1.7123913e-07 +4187 8.382 -6.5876726e-08 -1.7035580e-07 +4188 8.384 -6.5536894e-08 -1.6947703e-07 +4189 8.386 -6.5198815e-08 -1.6860279e-07 +4190 8.388 -6.4862480e-08 -1.6773306e-07 +4191 8.39 -6.4527879e-08 -1.6686782e-07 +4192 8.392 -6.4195005e-08 -1.6600703e-07 +4193 8.394 -6.3863848e-08 -1.6515069e-07 +4194 8.396 -6.3534400e-08 -1.6429877e-07 +4195 8.398 -6.3206650e-08 -1.6345124e-07 +4196 8.4 -6.2880592e-08 -1.6260808e-07 +4197 8.402 -6.2556215e-08 -1.6176928e-07 +4198 8.404 -6.2233512e-08 -1.6093479e-07 +4199 8.406 -6.1912473e-08 -1.6010462e-07 +4200 8.408 -6.1593090e-08 -1.5927872e-07 +4201 8.41 -6.1275355e-08 -1.5845709e-07 +4202 8.412 -6.0959259e-08 -1.5763970e-07 +4203 8.414 -6.0644794e-08 -1.5682652e-07 +4204 8.416 -6.0331950e-08 -1.5601753e-07 +4205 8.418 -6.0020721e-08 -1.5521272e-07 +4206 8.42 -5.9711097e-08 -1.5441206e-07 +4207 8.422 -5.9403070e-08 -1.5361553e-07 +4208 8.424 -5.9096632e-08 -1.5282311e-07 +4209 8.426 -5.8791775e-08 -1.5203478e-07 +4210 8.428 -5.8488490e-08 -1.5125051e-07 +4211 8.43 -5.8186770e-08 -1.5047029e-07 +4212 8.432 -5.7886606e-08 -1.4969409e-07 +4213 8.434 -5.7587991e-08 -1.4892190e-07 +4214 8.436 -5.7290916e-08 -1.4815369e-07 +4215 8.438 -5.6995373e-08 -1.4738945e-07 +4216 8.44 -5.6701355e-08 -1.4662914e-07 +4217 8.442 -5.6408854e-08 -1.4587276e-07 +4218 8.444 -5.6117862e-08 -1.4512028e-07 +4219 8.446 -5.5828371e-08 -1.4437168e-07 +4220 8.448 -5.5540373e-08 -1.4362694e-07 +4221 8.45 -5.5253860e-08 -1.4288605e-07 +4222 8.452 -5.4968826e-08 -1.4214898e-07 +4223 8.454 -5.4685262e-08 -1.4141570e-07 +4224 8.456 -5.4403160e-08 -1.4068621e-07 +4225 8.458 -5.4122514e-08 -1.3996049e-07 +4226 8.46 -5.3843316e-08 -1.3923851e-07 +4227 8.462 -5.3565558e-08 -1.3852025e-07 +4228 8.464 -5.3289233e-08 -1.3780569e-07 +4229 8.466 -5.3014333e-08 -1.3709483e-07 +4230 8.468 -5.2740851e-08 -1.3638763e-07 +4231 8.47 -5.2468780e-08 -1.3568407e-07 +4232 8.472 -5.2198112e-08 -1.3498415e-07 +4233 8.474 -5.1928841e-08 -1.3428784e-07 +4234 8.476 -5.1660958e-08 -1.3359512e-07 +4235 8.478 -5.1394458e-08 -1.3290597e-07 +4236 8.48 -5.1129332e-08 -1.3222038e-07 +4237 8.482 -5.0865574e-08 -1.3153832e-07 +4238 8.484 -5.0603176e-08 -1.3085979e-07 +4239 8.486 -5.0342132e-08 -1.3018475e-07 +4240 8.488 -5.0082435e-08 -1.2951319e-07 +4241 8.49 -4.9824077e-08 -1.2884510e-07 +4242 8.492 -4.9567052e-08 -1.2818046e-07 +4243 8.494 -4.9311353e-08 -1.2751924e-07 +4244 8.496 -4.9056973e-08 -1.2686143e-07 +4245 8.498 -4.8803905e-08 -1.2620702e-07 +4246 8.5 -4.8552143e-08 -1.2555599e-07 +4247 8.502 -4.8301679e-08 -1.2490831e-07 +4248 8.504 -4.8052507e-08 -1.2426397e-07 +4249 8.506 -4.7804621e-08 -1.2362296e-07 +4250 8.508 -4.7558013e-08 -1.2298525e-07 +4251 8.51 -4.7312678e-08 -1.2235083e-07 +4252 8.512 -4.7068608e-08 -1.2171969e-07 +4253 8.514 -4.6825797e-08 -1.2109180e-07 +4254 8.516 -4.6584238e-08 -1.2046715e-07 +4255 8.518 -4.6343926e-08 -1.1984572e-07 +4256 8.52 -4.6104853e-08 -1.1922750e-07 +4257 8.522 -4.5867014e-08 -1.1861246e-07 +4258 8.524 -4.5630401e-08 -1.1800060e-07 +4259 8.526 -4.5395010e-08 -1.1739190e-07 +4260 8.528 -4.5160832e-08 -1.1678633e-07 +4261 8.53 -4.4927862e-08 -1.1618389e-07 +4262 8.532 -4.4696094e-08 -1.1558456e-07 +4263 8.534 -4.4465522e-08 -1.1498832e-07 +4264 8.536 -4.4236139e-08 -1.1439515e-07 +4265 8.538 -4.4007939e-08 -1.1380505e-07 +4266 8.54 -4.3780917e-08 -1.1321798e-07 +4267 8.542 -4.3555065e-08 -1.1263395e-07 +4268 8.544 -4.3330379e-08 -1.1205293e-07 +4269 8.546 -4.3106851e-08 -1.1147490e-07 +4270 8.548 -4.2884477e-08 -1.1089986e-07 +4271 8.55 -4.2663250e-08 -1.1032779e-07 +4272 8.552 -4.2443164e-08 -1.0975866e-07 +4273 8.554 -4.2224213e-08 -1.0919247e-07 +4274 8.556 -4.2006392e-08 -1.0862920e-07 +4275 8.558 -4.1789695e-08 -1.0806884e-07 +4276 8.56 -4.1574115e-08 -1.0751137e-07 +4277 8.562 -4.1359647e-08 -1.0695677e-07 +4278 8.564 -4.1146286e-08 -1.0640503e-07 +4279 8.566 -4.0934025e-08 -1.0585614e-07 +4280 8.568 -4.0722860e-08 -1.0531009e-07 +4281 8.57 -4.0512783e-08 -1.0476684e-07 +4282 8.572 -4.0303790e-08 -1.0422640e-07 +4283 8.574 -4.0095876e-08 -1.0368875e-07 +4284 8.576 -3.9889033e-08 -1.0315387e-07 +4285 8.578 -3.9683258e-08 -1.0262176e-07 +4286 8.58 -3.9478545e-08 -1.0209238e-07 +4287 8.582 -3.9274887e-08 -1.0156574e-07 +4288 8.584 -3.9072280e-08 -1.0104181e-07 +4289 8.586 -3.8870718e-08 -1.0052059e-07 +4290 8.588 -3.8670196e-08 -1.0000205e-07 +4291 8.59 -3.8470708e-08 -9.9486191e-08 +4292 8.592 -3.8272249e-08 -9.8972991e-08 +4293 8.594 -3.8074814e-08 -9.8462438e-08 +4294 8.596 -3.7878398e-08 -9.7954520e-08 +4295 8.598 -3.7682994e-08 -9.7449221e-08 +4296 8.6 -3.7488599e-08 -9.6946529e-08 +4297 8.602 -3.7295206e-08 -9.6446430e-08 +4298 8.604 -3.7102812e-08 -9.5948910e-08 +4299 8.606 -3.6911409e-08 -9.5453958e-08 +4300 8.608 -3.6720994e-08 -9.4961558e-08 +4301 8.61 -3.6531561e-08 -9.4471698e-08 +4302 8.612 -3.6343106e-08 -9.3984365e-08 +4303 8.614 -3.6155622e-08 -9.3499546e-08 +4304 8.616 -3.5969106e-08 -9.3017228e-08 +4305 8.618 -3.5783552e-08 -9.2537398e-08 +4306 8.62 -3.5598954e-08 -9.2060043e-08 +4307 8.622 -3.5415310e-08 -9.1585150e-08 +4308 8.624 -3.5232612e-08 -9.1112708e-08 +4309 8.626 -3.5050857e-08 -9.0642702e-08 +4310 8.628 -3.4870040e-08 -9.0175121e-08 +4311 8.63 -3.4690155e-08 -8.9709951e-08 +4312 8.632 -3.4511198e-08 -8.9247181e-08 +4313 8.634 -3.4333165e-08 -8.8786799e-08 +4314 8.636 -3.4156050e-08 -8.8328791e-08 +4315 8.638 -3.3979848e-08 -8.7873146e-08 +4316 8.64 -3.3804555e-08 -8.7419851e-08 +4317 8.642 -3.3630167e-08 -8.6968895e-08 +4318 8.644 -3.3456678e-08 -8.6520264e-08 +4319 8.646 -3.3284085e-08 -8.6073948e-08 +4320 8.648 -3.3112381e-08 -8.5629935e-08 +4321 8.65 -3.2941563e-08 -8.5188211e-08 +4322 8.652 -3.2771627e-08 -8.4748766e-08 +4323 8.654 -3.2602567e-08 -8.4311588e-08 +4324 8.656 -3.2434379e-08 -8.3876666e-08 +4325 8.658 -3.2267059e-08 -8.3443986e-08 +4326 8.66 -3.2100601e-08 -8.3013539e-08 +4327 8.662 -3.1935003e-08 -8.2585312e-08 +4328 8.664 -3.1770259e-08 -8.2159294e-08 +4329 8.666 -3.1606364e-08 -8.1735474e-08 +4330 8.668 -3.1443315e-08 -8.1313840e-08 +4331 8.67 -3.1281107e-08 -8.0894381e-08 +4332 8.672 -3.1119736e-08 -8.0477085e-08 +4333 8.674 -3.0959198e-08 -8.0061943e-08 +4334 8.676 -3.0799487e-08 -7.9648941e-08 +4335 8.678 -3.0640600e-08 -7.9238070e-08 +4336 8.68 -3.0482533e-08 -7.8829319e-08 +4337 8.682 -3.0325282e-08 -7.8422676e-08 +4338 8.684 -3.0168841e-08 -7.8018131e-08 +4339 8.686 -3.0013208e-08 -7.7615672e-08 +4340 8.688 -2.9858377e-08 -7.7215290e-08 +4341 8.69 -2.9704345e-08 -7.6816973e-08 +4342 8.692 -2.9551108e-08 -7.6420711e-08 +4343 8.694 -2.9398661e-08 -7.6026492e-08 +4344 8.696 -2.9247001e-08 -7.5634308e-08 +4345 8.698 -2.9096123e-08 -7.5244146e-08 +4346 8.7 -2.8946023e-08 -7.4855997e-08 +4347 8.702 -2.8796697e-08 -7.4469850e-08 +4348 8.704 -2.8648142e-08 -7.4085695e-08 +4349 8.706 -2.8500353e-08 -7.3703522e-08 +4350 8.708 -2.8353327e-08 -7.3323320e-08 +4351 8.71 -2.8207059e-08 -7.2945079e-08 +4352 8.712 -2.8061545e-08 -7.2568790e-08 +4353 8.714 -2.7916782e-08 -7.2194441e-08 +4354 8.716 -2.7772766e-08 -7.1822024e-08 +4355 8.718 -2.7629493e-08 -7.1451528e-08 +4356 8.72 -2.7486959e-08 -7.1082943e-08 +4357 8.722 -2.7345160e-08 -7.0716259e-08 +4358 8.724 -2.7204092e-08 -7.0351466e-08 +4359 8.726 -2.7063753e-08 -6.9988556e-08 +4360 8.728 -2.6924137e-08 -6.9627517e-08 +4361 8.73 -2.6785241e-08 -6.9268341e-08 +4362 8.732 -2.6647062e-08 -6.8911018e-08 +4363 8.734 -2.6509596e-08 -6.8555538e-08 +4364 8.736 -2.6372839e-08 -6.8201892e-08 +4365 8.738 -2.6236787e-08 -6.7850069e-08 +4366 8.74 -2.6101437e-08 -6.7500062e-08 +4367 8.742 -2.5966786e-08 -6.7151860e-08 +4368 8.744 -2.5832829e-08 -6.6805455e-08 +4369 8.746 -2.5699563e-08 -6.6460836e-08 +4370 8.748 -2.5566984e-08 -6.6117995e-08 +4371 8.75 -2.5435090e-08 -6.5776923e-08 +4372 8.752 -2.5303875e-08 -6.5437610e-08 +4373 8.754 -2.5173338e-08 -6.5100047e-08 +4374 8.756 -2.5043474e-08 -6.4764225e-08 +4375 8.758 -2.4914280e-08 -6.4430136e-08 +4376 8.76 -2.4785752e-08 -6.4097771e-08 +4377 8.762 -2.4657888e-08 -6.3767119e-08 +4378 8.764 -2.4530683e-08 -6.3438174e-08 +4379 8.766 -2.4404134e-08 -6.3110925e-08 +4380 8.768 -2.4278238e-08 -6.2785364e-08 +4381 8.77 -2.4152991e-08 -6.2461483e-08 +4382 8.772 -2.4028391e-08 -6.2139272e-08 +4383 8.774 -2.3904433e-08 -6.1818724e-08 +4384 8.776 -2.3781115e-08 -6.1499829e-08 +4385 8.778 -2.3658433e-08 -6.1182579e-08 +4386 8.78 -2.3536383e-08 -6.0866965e-08 +4387 8.782 -2.3414964e-08 -6.0552980e-08 +4388 8.784 -2.3294170e-08 -6.0240614e-08 +4389 8.786 -2.3174000e-08 -5.9929860e-08 +4390 8.788 -2.3054450e-08 -5.9620709e-08 +4391 8.79 -2.2935516e-08 -5.9313152e-08 +4392 8.792 -2.2817196e-08 -5.9007182e-08 +4393 8.794 -2.2699486e-08 -5.8702790e-08 +4394 8.796 -2.2582384e-08 -5.8399968e-08 +4395 8.798 -2.2465886e-08 -5.8098709e-08 +4396 8.8 -2.2349988e-08 -5.7799003e-08 +4397 8.802 -2.2234689e-08 -5.7500844e-08 +4398 8.804 -2.2119984e-08 -5.7204222e-08 +4399 8.806 -2.2005871e-08 -5.6909131e-08 +4400 8.808 -2.1892346e-08 -5.6615562e-08 +4401 8.81 -2.1779407e-08 -5.6323507e-08 +4402 8.812 -2.1667051e-08 -5.6032959e-08 +4403 8.814 -2.1555275e-08 -5.5743910e-08 +4404 8.816 -2.1444075e-08 -5.5456351e-08 +4405 8.818 -2.1333448e-08 -5.5170276e-08 +4406 8.82 -2.1223392e-08 -5.4885677e-08 +4407 8.822 -2.1113904e-08 -5.4602546e-08 +4408 8.824 -2.1004981e-08 -5.4320875e-08 +4409 8.826 -2.0896620e-08 -5.4040657e-08 +4410 8.828 -2.0788818e-08 -5.3761885e-08 +4411 8.83 -2.0681571e-08 -5.3484550e-08 +4412 8.832 -2.0574879e-08 -5.3208647e-08 +4413 8.834 -2.0468736e-08 -5.2934166e-08 +4414 8.836 -2.0363141e-08 -5.2661102e-08 +4415 8.838 -2.0258091e-08 -5.2389446e-08 +4416 8.84 -2.0153582e-08 -5.2119191e-08 +4417 8.842 -2.0049613e-08 -5.1850331e-08 +4418 8.844 -1.9946180e-08 -5.1582857e-08 +4419 8.846 -1.9843281e-08 -5.1316764e-08 +4420 8.848 -1.9740912e-08 -5.1052042e-08 +4421 8.85 -1.9639071e-08 -5.0788687e-08 +4422 8.852 -1.9537756e-08 -5.0526689e-08 +4423 8.854 -1.9436964e-08 -5.0266044e-08 +4424 8.856 -1.9336691e-08 -5.0006743e-08 +4425 8.858 -1.9236936e-08 -4.9748779e-08 +4426 8.86 -1.9137695e-08 -4.9492146e-08 +4427 8.862 -1.9038966e-08 -4.9236837e-08 +4428 8.864 -1.8940747e-08 -4.8982845e-08 +4429 8.866 -1.8843034e-08 -4.8730163e-08 +4430 8.868 -1.8745825e-08 -4.8478785e-08 +4431 8.87 -1.8649118e-08 -4.8228703e-08 +4432 8.872 -1.8552910e-08 -4.7979912e-08 +4433 8.874 -1.8457198e-08 -4.7732404e-08 +4434 8.876 -1.8361979e-08 -4.7486172e-08 +4435 8.878 -1.8267252e-08 -4.7241211e-08 +4436 8.88 -1.8173014e-08 -4.6997513e-08 +4437 8.882 -1.8079261e-08 -4.6755072e-08 +4438 8.884 -1.7985993e-08 -4.6513883e-08 +4439 8.886 -1.7893205e-08 -4.6273937e-08 +4440 8.888 -1.7800896e-08 -4.6035229e-08 +4441 8.89 -1.7709063e-08 -4.5797752e-08 +4442 8.892 -1.7617704e-08 -4.5561500e-08 +4443 8.894 -1.7526816e-08 -4.5326467e-08 +4444 8.896 -1.7436397e-08 -4.5092647e-08 +4445 8.898 -1.7346445e-08 -4.4860032e-08 +4446 8.9 -1.7256957e-08 -4.4628618e-08 +4447 8.902 -1.7167930e-08 -4.4398397e-08 +4448 8.904 -1.7079362e-08 -4.4169364e-08 +4449 8.906 -1.6991251e-08 -4.3941512e-08 +4450 8.908 -1.6903595e-08 -4.3714836e-08 +4451 8.91 -1.6816391e-08 -4.3489329e-08 +4452 8.912 -1.6729637e-08 -4.3264985e-08 +4453 8.914 -1.6643331e-08 -4.3041799e-08 +4454 8.916 -1.6557469e-08 -4.2819763e-08 +4455 8.918 -1.6472051e-08 -4.2598874e-08 +4456 8.92 -1.6387073e-08 -4.2379123e-08 +4457 8.922 -1.6302534e-08 -4.2160506e-08 +4458 8.924 -1.6218430e-08 -4.1943017e-08 +4459 8.926 -1.6134761e-08 -4.1726650e-08 +4460 8.928 -1.6051523e-08 -4.1511399e-08 +4461 8.93 -1.5968714e-08 -4.1297258e-08 +4462 8.932 -1.5886333e-08 -4.1084222e-08 +4463 8.934 -1.5804377e-08 -4.0872285e-08 +4464 8.936 -1.5722843e-08 -4.0661441e-08 +4465 8.938 -1.5641730e-08 -4.0451685e-08 +4466 8.94 -1.5561036e-08 -4.0243011e-08 +4467 8.942 -1.5480758e-08 -4.0035413e-08 +4468 8.944 -1.5400893e-08 -3.9828886e-08 +4469 8.946 -1.5321441e-08 -3.9623425e-08 +4470 8.948 -1.5242399e-08 -3.9419023e-08 +4471 8.95 -1.5163765e-08 -3.9215676e-08 +4472 8.952 -1.5085536e-08 -3.9013377e-08 +4473 8.954 -1.5007710e-08 -3.8812123e-08 +4474 8.956 -1.4930286e-08 -3.8611906e-08 +4475 8.958 -1.4853262e-08 -3.8412722e-08 +4476 8.96 -1.4776635e-08 -3.8214566e-08 +4477 8.962 -1.4700403e-08 -3.8017432e-08 +4478 8.964 -1.4624564e-08 -3.7821315e-08 +4479 8.966 -1.4549117e-08 -3.7626209e-08 +4480 8.968 -1.4474059e-08 -3.7432110e-08 +4481 8.97 -1.4399388e-08 -3.7239012e-08 +4482 8.972 -1.4325102e-08 -3.7046910e-08 +4483 8.974 -1.4251200e-08 -3.6855800e-08 +4484 8.976 -1.4177678e-08 -3.6665675e-08 +4485 8.978 -1.4104536e-08 -3.6476530e-08 +4486 8.98 -1.4031772e-08 -3.6288362e-08 +4487 8.982 -1.3959382e-08 -3.6101164e-08 +4488 8.984 -1.3887366e-08 -3.5914932e-08 +4489 8.986 -1.3815722e-08 -3.5729660e-08 +4490 8.988 -1.3744447e-08 -3.5545344e-08 +4491 8.99 -1.3673540e-08 -3.5361979e-08 +4492 8.992 -1.3602998e-08 -3.5179560e-08 +4493 8.994 -1.3532821e-08 -3.4998082e-08 +4494 8.996 -1.3463006e-08 -3.4817540e-08 +4495 8.998 -1.3393550e-08 -3.4637930e-08 +4496 9.0 -1.3324453e-08 -3.4459245e-08 +4497 9.002 -1.3255713e-08 -3.4281483e-08 +4498 9.004 -1.3187327e-08 -3.4104638e-08 +4499 9.006 -1.3119293e-08 -3.3928704e-08 +4500 9.008 -1.3051611e-08 -3.3753679e-08 +4501 9.01 -1.2984278e-08 -3.3579556e-08 +4502 9.012 -1.2917292e-08 -3.3406331e-08 +4503 9.014 -1.2850652e-08 -3.3234000e-08 +4504 9.016 -1.2784356e-08 -3.3062558e-08 +4505 9.018 -1.2718401e-08 -3.2892001e-08 +4506 9.02 -1.2652787e-08 -3.2722323e-08 +4507 9.022 -1.2587512e-08 -3.2553520e-08 +4508 9.024 -1.2522573e-08 -3.2385589e-08 +4509 9.026 -1.2457969e-08 -3.2218523e-08 +4510 9.028 -1.2393698e-08 -3.2052319e-08 +4511 9.03 -1.2329759e-08 -3.1886973e-08 +4512 9.032 -1.2266149e-08 -3.1722480e-08 +4513 9.034 -1.2202868e-08 -3.1558835e-08 +4514 9.036 -1.2139914e-08 -3.1396034e-08 +4515 9.038 -1.2077284e-08 -3.1234073e-08 +4516 9.04 -1.2014977e-08 -3.1072948e-08 +4517 9.042 -1.1952991e-08 -3.0912654e-08 +4518 9.044 -1.1891326e-08 -3.0753186e-08 +4519 9.046 -1.1829978e-08 -3.0594541e-08 +4520 9.048 -1.1768947e-08 -3.0436715e-08 +4521 9.05 -1.1708231e-08 -3.0279703e-08 +4522 9.052 -1.1647827e-08 -3.0123500e-08 +4523 9.054 -1.1587736e-08 -2.9968104e-08 +4524 9.056 -1.1527955e-08 -2.9813509e-08 +4525 9.058 -1.1468481e-08 -2.9659711e-08 +4526 9.06 -1.1409315e-08 -2.9506707e-08 +4527 9.062 -1.1350454e-08 -2.9354492e-08 +4528 9.064 -1.1291897e-08 -2.9203063e-08 +4529 9.066 -1.1233641e-08 -2.9052414e-08 +4530 9.068 -1.1175686e-08 -2.8902543e-08 +4531 9.07 -1.1118031e-08 -2.8753445e-08 +4532 9.072 -1.1060672e-08 -2.8605115e-08 +4533 9.074 -1.1003610e-08 -2.8457551e-08 +4534 9.076 -1.0946841e-08 -2.8310749e-08 +4535 9.078 -1.0890366e-08 -2.8164703e-08 +4536 9.08 -1.0834182e-08 -2.8019411e-08 +4537 9.082 -1.0778288e-08 -2.7874868e-08 +4538 9.084 -1.0722682e-08 -2.7731071e-08 +4539 9.086 -1.0667363e-08 -2.7588016e-08 +4540 9.088 -1.0612330e-08 -2.7445699e-08 +4541 9.09 -1.0557580e-08 -2.7304116e-08 +4542 9.092 -1.0503113e-08 -2.7163263e-08 +4543 9.094 -1.0448926e-08 -2.7023137e-08 +4544 9.096 -1.0395020e-08 -2.6883733e-08 +4545 9.098 -1.0341391e-08 -2.6745049e-08 +4546 9.1 -1.0288039e-08 -2.6607080e-08 +4547 9.102 -1.0234962e-08 -2.6469823e-08 +4548 9.104 -1.0182159e-08 -2.6333274e-08 +4549 9.106 -1.0129629e-08 -2.6197429e-08 +4550 9.108 -1.0077369e-08 -2.6062285e-08 +4551 9.11 -1.0025379e-08 -2.5927838e-08 +4552 9.112 -9.9736572e-09 -2.5794085e-08 +4553 9.114 -9.9222022e-09 -2.5661022e-08 +4554 9.116 -9.8710127e-09 -2.5528645e-08 +4555 9.118 -9.8200872e-09 -2.5396951e-08 +4556 9.12 -9.7694244e-09 -2.5265936e-08 +4557 9.122 -9.7190230e-09 -2.5135597e-08 +4558 9.124 -9.6688816e-09 -2.5005931e-08 +4559 9.126 -9.6189988e-09 -2.4876933e-08 +4560 9.128 -9.5693734e-09 -2.4748601e-08 +4561 9.13 -9.5200040e-09 -2.4620931e-08 +4562 9.132 -9.4708892e-09 -2.4493919e-08 +4563 9.134 -9.4220279e-09 -2.4367563e-08 +4564 9.136 -9.3734186e-09 -2.4241858e-08 +4565 9.138 -9.3250600e-09 -2.4116802e-08 +4566 9.14 -9.2769509e-09 -2.3992391e-08 +4567 9.142 -9.2290900e-09 -2.3868621e-08 +4568 9.144 -9.1814760e-09 -2.3745491e-08 +4569 9.146 -9.1341076e-09 -2.3622995e-08 +4570 9.148 -9.0869836e-09 -2.3501131e-08 +4571 9.15 -9.0401027e-09 -2.3379896e-08 +4572 9.152 -8.9934636e-09 -2.3259286e-08 +4573 9.154 -8.9470651e-09 -2.3139299e-08 +4574 9.156 -8.9009060e-09 -2.3019930e-08 +4575 9.158 -8.8549850e-09 -2.2901177e-08 +4576 9.16 -8.8093009e-09 -2.2783037e-08 +4577 9.162 -8.7638524e-09 -2.2665506e-08 +4578 9.164 -8.7186385e-09 -2.2548582e-08 +4579 9.166 -8.6736577e-09 -2.2432260e-08 +4580 9.168 -8.6289090e-09 -2.2316539e-08 +4581 9.17 -8.5843912e-09 -2.2201415e-08 +4582 9.172 -8.5401030e-09 -2.2086884e-08 +4583 9.174 -8.4960432e-09 -2.1972944e-08 +4584 9.176 -8.4522108e-09 -2.1859592e-08 +4585 9.178 -8.4086045e-09 -2.1746825e-08 +4586 9.18 -8.3652231e-09 -2.1634640e-08 +4587 9.182 -8.3220655e-09 -2.1523033e-08 +4588 9.184 -8.2791306e-09 -2.1412002e-08 +4589 9.186 -8.2364171e-09 -2.1301543e-08 +4590 9.188 -8.1939240e-09 -2.1191655e-08 +4591 9.19 -8.1516501e-09 -2.1082333e-08 +4592 9.192 -8.1095943e-09 -2.0973575e-08 +4593 9.194 -8.0677555e-09 -2.0865379e-08 +4594 9.196 -8.0261324e-09 -2.0757740e-08 +4595 9.198 -7.9847241e-09 -2.0650657e-08 +4596 9.2 -7.9435294e-09 -2.0544126e-08 +4597 9.202 -7.9025473e-09 -2.0438145e-08 +4598 9.204 -7.8617765e-09 -2.0332710e-08 +4599 9.206 -7.8212161e-09 -2.0227819e-08 +4600 9.208 -7.7808649e-09 -2.0123469e-08 +4601 9.21 -7.7407218e-09 -2.0019658e-08 +4602 9.212 -7.7007859e-09 -1.9916382e-08 +4603 9.214 -7.6610559e-09 -1.9813639e-08 +4604 9.216 -7.6215310e-09 -1.9711426e-08 +4605 9.218 -7.5822099e-09 -1.9609740e-08 +4606 9.22 -7.5430917e-09 -1.9508579e-08 +4607 9.222 -7.5041752e-09 -1.9407939e-08 +4608 9.224 -7.4654595e-09 -1.9307819e-08 +4609 9.226 -7.4269436e-09 -1.9208215e-08 +4610 9.228 -7.3886263e-09 -1.9109125e-08 +4611 9.23 -7.3505068e-09 -1.9010546e-08 +4612 9.232 -7.3125838e-09 -1.8912476e-08 +4613 9.234 -7.2748565e-09 -1.8814911e-08 +4614 9.236 -7.2373238e-09 -1.8717850e-08 +4615 9.238 -7.1999848e-09 -1.8621289e-08 +4616 9.24 -7.1628384e-09 -1.8525227e-08 +4617 9.242 -7.1258835e-09 -1.8429660e-08 +4618 9.244 -7.0891194e-09 -1.8334586e-08 +4619 9.246 -7.0525449e-09 -1.8240003e-08 +4620 9.248 -7.0161590e-09 -1.8145907e-08 +4621 9.25 -6.9799609e-09 -1.8052297e-08 +4622 9.252 -6.9439495e-09 -1.7959170e-08 +4623 9.254 -6.9081239e-09 -1.7866523e-08 +4624 9.256 -6.8724831e-09 -1.7774354e-08 +4625 9.258 -6.8370262e-09 -1.7682661e-08 +4626 9.26 -6.8017522e-09 -1.7591440e-08 +4627 9.262 -6.7666601e-09 -1.7500690e-08 +4628 9.264 -6.7317491e-09 -1.7410409e-08 +4629 9.266 -6.6970182e-09 -1.7320593e-08 +4630 9.268 -6.6624664e-09 -1.7231240e-08 +4631 9.27 -6.6280929e-09 -1.7142348e-08 +4632 9.272 -6.5938967e-09 -1.7053915e-08 +4633 9.274 -6.5598769e-09 -1.6965938e-08 +4634 9.276 -6.5260327e-09 -1.6878415e-08 +4635 9.278 -6.4923630e-09 -1.6791343e-08 +4636 9.28 -6.4588670e-09 -1.6704720e-08 +4637 9.282 -6.4255438e-09 -1.6618545e-08 +4638 9.284 -6.3923925e-09 -1.6532814e-08 +4639 9.286 -6.3594123e-09 -1.6447525e-08 +4640 9.288 -6.3266021e-09 -1.6362676e-08 +4641 9.29 -6.2939613e-09 -1.6278264e-08 +4642 9.292 -6.2614888e-09 -1.6194289e-08 +4643 9.294 -6.2291838e-09 -1.6110746e-08 +4644 9.296 -6.1970455e-09 -1.6027634e-08 +4645 9.298 -6.1650730e-09 -1.5944951e-08 +4646 9.3 -6.1332654e-09 -1.5862695e-08 +4647 9.302 -6.1016219e-09 -1.5780863e-08 +4648 9.304 -6.0701417e-09 -1.5699453e-08 +4649 9.306 -6.0388238e-09 -1.5618463e-08 +4650 9.308 -6.0076676e-09 -1.5537891e-08 +4651 9.31 -5.9766720e-09 -1.5457734e-08 +4652 9.312 -5.9458363e-09 -1.5377991e-08 +4653 9.314 -5.9151598e-09 -1.5298659e-08 +4654 9.316 -5.8846414e-09 -1.5219737e-08 +4655 9.318 -5.8542805e-09 -1.5141222e-08 +4656 9.32 -5.8240763e-09 -1.5063111e-08 +4657 9.322 -5.7940278e-09 -1.4985404e-08 +4658 9.324 -5.7641344e-09 -1.4908097e-08 +4659 9.326 -5.7343952e-09 -1.4831189e-08 +4660 9.328 -5.7048094e-09 -1.4754678e-08 +4661 9.33 -5.6753762e-09 -1.4678562e-08 +4662 9.332 -5.6460949e-09 -1.4602838e-08 +4663 9.334 -5.6169646e-09 -1.4527505e-08 +4664 9.336 -5.5879846e-09 -1.4452561e-08 +4665 9.338 -5.5591541e-09 -1.4378003e-08 +4666 9.34 -5.5304723e-09 -1.4303830e-08 +4667 9.342 -5.5019385e-09 -1.4230039e-08 +4668 9.344 -5.4735519e-09 -1.4156629e-08 +4669 9.346 -5.4453117e-09 -1.4083598e-08 +4670 9.348 -5.4172173e-09 -1.4010943e-08 +4671 9.35 -5.3892677e-09 -1.3938664e-08 +4672 9.352 -5.3614624e-09 -1.3866757e-08 +4673 9.354 -5.3338004e-09 -1.3795221e-08 +4674 9.356 -5.3062812e-09 -1.3724054e-08 +4675 9.358 -5.2789040e-09 -1.3653254e-08 +4676 9.36 -5.2516680e-09 -1.3582820e-08 +4677 9.362 -5.2245725e-09 -1.3512748e-08 +4678 9.364 -5.1976167e-09 -1.3443039e-08 +4679 9.366 -5.1708001e-09 -1.3373688e-08 +4680 9.368 -5.1441217e-09 -1.3304696e-08 +4681 9.37 -5.1175810e-09 -1.3236060e-08 +4682 9.372 -5.0911773e-09 -1.3167777e-08 +4683 9.374 -5.0649097e-09 -1.3099847e-08 +4684 9.376 -5.0387776e-09 -1.3032267e-08 +4685 9.378 -5.0127804e-09 -1.2965036e-08 +4686 9.38 -4.9869173e-09 -1.2898152e-08 +4687 9.382 -4.9611876e-09 -1.2831612e-08 +4688 9.384 -4.9355906e-09 -1.2765416e-08 +4689 9.386 -4.9101257e-09 -1.2699561e-08 +4690 9.388 -4.8847921e-09 -1.2634047e-08 +4691 9.39 -4.8595893e-09 -1.2568870e-08 +4692 9.392 -4.8345164e-09 -1.2504029e-08 +4693 9.394 -4.8095729e-09 -1.2439523e-08 +4694 9.396 -4.7847581e-09 -1.2375349e-08 +4695 9.398 -4.7600713e-09 -1.2311507e-08 +4696 9.4 -4.7355119e-09 -1.2247994e-08 +4697 9.402 -4.7110791e-09 -1.2184808e-08 +4698 9.404 -4.6867724e-09 -1.2121949e-08 +4699 9.406 -4.6625911e-09 -1.2059414e-08 +4700 9.408 -4.6385345e-09 -1.1997201e-08 +4701 9.41 -4.6146021e-09 -1.1935309e-08 +4702 9.412 -4.5907931e-09 -1.1873737e-08 +4703 9.414 -4.5671069e-09 -1.1812482e-08 +4704 9.416 -4.5435429e-09 -1.1751543e-08 +4705 9.418 -4.5201005e-09 -1.1690919e-08 +4706 9.42 -4.4967791e-09 -1.1630607e-08 +4707 9.422 -4.4735779e-09 -1.1570606e-08 +4708 9.424 -4.4504964e-09 -1.1510915e-08 +4709 9.426 -4.4275340e-09 -1.1451532e-08 +4710 9.428 -4.4046901e-09 -1.1392455e-08 +4711 9.43 -4.3819640e-09 -1.1333683e-08 +4712 9.432 -4.3593552e-09 -1.1275214e-08 +4713 9.434 -4.3368630e-09 -1.1217047e-08 +4714 9.436 -4.3144868e-09 -1.1159180e-08 +4715 9.438 -4.2922260e-09 -1.1101611e-08 +4716 9.44 -4.2700801e-09 -1.1044339e-08 +4717 9.442 -4.2480485e-09 -1.0987363e-08 +4718 9.444 -4.2261305e-09 -1.0930681e-08 +4719 9.446 -4.2043256e-09 -1.0874291e-08 +4720 9.448 -4.1826331e-09 -1.0818191e-08 +4721 9.45 -4.1610526e-09 -1.0762382e-08 +4722 9.452 -4.1395834e-09 -1.0706860e-08 +4723 9.454 -4.1182250e-09 -1.0651625e-08 +4724 9.456 -4.0969767e-09 -1.0596674e-08 +4725 9.458 -4.0758381e-09 -1.0542007e-08 +4726 9.46 -4.0548085e-09 -1.0487622e-08 +4727 9.462 -4.0338874e-09 -1.0433518e-08 +4728 9.464 -4.0130742e-09 -1.0379692e-08 +4729 9.466 -3.9923685e-09 -1.0326145e-08 +4730 9.468 -3.9717695e-09 -1.0272873e-08 +4731 9.47 -3.9512768e-09 -1.0219877e-08 +4732 9.472 -3.9308898e-09 -1.0167153e-08 +4733 9.474 -3.9106080e-09 -1.0114702e-08 +4734 9.476 -3.8904308e-09 -1.0062521e-08 +4735 9.478 -3.8703577e-09 -1.0010610e-08 +4736 9.48 -3.8503882e-09 -9.9589662e-09 +4737 9.482 -3.8305217e-09 -9.9075889e-09 +4738 9.484 -3.8107577e-09 -9.8564767e-09 +4739 9.486 -3.7910956e-09 -9.8056280e-09 +4740 9.488 -3.7715350e-09 -9.7550417e-09 +4741 9.49 -3.7520753e-09 -9.7047164e-09 +4742 9.492 -3.7327159e-09 -9.6546507e-09 +4743 9.494 -3.7134565e-09 -9.6048432e-09 +4744 9.496 -3.6942964e-09 -9.5552927e-09 +4745 9.498 -3.6752351e-09 -9.5059978e-09 +4746 9.5 -3.6562722e-09 -9.4569571e-09 +4747 9.502 -3.6374071e-09 -9.4081695e-09 +4748 9.504 -3.6186394e-09 -9.3596335e-09 +4749 9.506 -3.5999684e-09 -9.3113479e-09 +4750 9.508 -3.5813938e-09 -9.2633114e-09 +4751 9.51 -3.5629150e-09 -9.2155227e-09 +4752 9.512 -3.5445316e-09 -9.1679806e-09 +4753 9.514 -3.5262429e-09 -9.1206836e-09 +4754 9.516 -3.5080487e-09 -9.0736307e-09 +4755 9.518 -3.4899483e-09 -9.0268205e-09 +4756 9.52 -3.4719412e-09 -8.9802517e-09 +4757 9.522 -3.4540271e-09 -8.9339232e-09 +4758 9.524 -3.4362054e-09 -8.8878337e-09 +4759 9.526 -3.4184756e-09 -8.8419820e-09 +4760 9.528 -3.4008373e-09 -8.7963667e-09 +4761 9.53 -3.3832900e-09 -8.7509868e-09 +4762 9.532 -3.3658332e-09 -8.7058410e-09 +4763 9.534 -3.3484665e-09 -8.6609281e-09 +4764 9.536 -3.3311893e-09 -8.6162468e-09 +4765 9.538 -3.3140013e-09 -8.5717961e-09 +4766 9.54 -3.2969020e-09 -8.5275747e-09 +4767 9.542 -3.2798909e-09 -8.4835813e-09 +4768 9.544 -3.2629675e-09 -8.4398150e-09 +4769 9.546 -3.2461315e-09 -8.3962744e-09 +4770 9.548 -3.2293823e-09 -8.3529584e-09 +4771 9.55 -3.2127195e-09 -8.3098658e-09 +4772 9.552 -3.1961426e-09 -8.2669956e-09 +4773 9.554 -3.1796513e-09 -8.2243465e-09 +4774 9.556 -3.1632451e-09 -8.1819174e-09 +4775 9.558 -3.1469235e-09 -8.1397072e-09 +4776 9.56 -3.1306861e-09 -8.0977148e-09 +4777 9.562 -3.1145325e-09 -8.0559389e-09 +4778 9.564 -3.0984622e-09 -8.0143786e-09 +4779 9.566 -3.0824749e-09 -7.9730327e-09 +4780 9.568 -3.0665700e-09 -7.9319000e-09 +4781 9.57 -3.0507471e-09 -7.8909796e-09 +4782 9.572 -3.0350059e-09 -7.8502702e-09 +4783 9.574 -3.0193459e-09 -7.8097709e-09 +4784 9.576 -3.0037667e-09 -7.7694804e-09 +4785 9.578 -2.9882678e-09 -7.7293978e-09 +4786 9.58 -2.9728490e-09 -7.6895220e-09 +4787 9.582 -2.9575096e-09 -7.6498519e-09 +4788 9.584 -2.9422494e-09 -7.6103864e-09 +4789 9.586 -2.9270679e-09 -7.5711245e-09 +4790 9.588 -2.9119648e-09 -7.5320652e-09 +4791 9.59 -2.8969395e-09 -7.4932073e-09 +4792 9.592 -2.8819918e-09 -7.4545499e-09 +4793 9.594 -2.8671212e-09 -7.4160920e-09 +4794 9.596 -2.8523273e-09 -7.3778324e-09 +4795 9.598 -2.8376097e-09 -7.3397702e-09 +4796 9.6 -2.8229681e-09 -7.3019043e-09 +4797 9.602 -2.8084020e-09 -7.2642337e-09 +4798 9.604 -2.7939110e-09 -7.2267575e-09 +4799 9.606 -2.7794948e-09 -7.1894747e-09 +4800 9.608 -2.7651530e-09 -7.1523841e-09 +4801 9.61 -2.7508852e-09 -7.1154849e-09 +4802 9.612 -2.7366909e-09 -7.0787760e-09 +4803 9.614 -2.7225699e-09 -7.0422565e-09 +4804 9.616 -2.7085218e-09 -7.0059254e-09 +4805 9.618 -2.6945461e-09 -6.9697817e-09 +4806 9.62 -2.6806425e-09 -6.9338245e-09 +4807 9.622 -2.6668107e-09 -6.8980528e-09 +4808 9.624 -2.6530502e-09 -6.8624656e-09 +4809 9.626 -2.6393607e-09 -6.8270619e-09 +4810 9.628 -2.6257418e-09 -6.7918409e-09 +4811 9.63 -2.6121932e-09 -6.7568017e-09 +4812 9.632 -2.5987145e-09 -6.7219431e-09 +4813 9.634 -2.5853053e-09 -6.6872644e-09 +4814 9.636 -2.5719653e-09 -6.6527646e-09 +4815 9.638 -2.5586942e-09 -6.6184427e-09 +4816 9.64 -2.5454914e-09 -6.5842979e-09 +4817 9.642 -2.5323568e-09 -6.5503293e-09 +4818 9.644 -2.5192900e-09 -6.5165359e-09 +4819 9.646 -2.5062906e-09 -6.4829168e-09 +4820 9.648 -2.4933582e-09 -6.4494711e-09 +4821 9.65 -2.4804926e-09 -6.4161980e-09 +4822 9.652 -2.4676933e-09 -6.3830965e-09 +4823 9.654 -2.4549601e-09 -6.3501658e-09 +4824 9.656 -2.4422925e-09 -6.3174049e-09 +4825 9.658 -2.4296904e-09 -6.2848131e-09 +4826 9.66 -2.4171532e-09 -6.2523894e-09 +4827 9.662 -2.4046807e-09 -6.2201329e-09 +4828 9.664 -2.3922725e-09 -6.1880429e-09 +4829 9.666 -2.3799284e-09 -6.1561184e-09 +4830 9.668 -2.3676480e-09 -6.1243585e-09 +4831 9.67 -2.3554309e-09 -6.0927626e-09 +4832 9.672 -2.3432768e-09 -6.0613296e-09 +4833 9.674 -2.3311854e-09 -6.0300587e-09 +4834 9.676 -2.3191565e-09 -5.9989492e-09 +4835 9.678 -2.3071895e-09 -5.9680002e-09 +4836 9.68 -2.2952843e-09 -5.9372108e-09 +4837 9.682 -2.2834406e-09 -5.9065803e-09 +4838 9.684 -2.2716579e-09 -5.8761077e-09 +4839 9.686 -2.2599360e-09 -5.8457924e-09 +4840 9.688 -2.2482746e-09 -5.8156335e-09 +4841 9.69 -2.2366734e-09 -5.7856301e-09 +4842 9.692 -2.2251320e-09 -5.7557815e-09 +4843 9.694 -2.2136502e-09 -5.7260869e-09 +4844 9.696 -2.2022276e-09 -5.6965455e-09 +4845 9.698 -2.1908639e-09 -5.6671565e-09 +4846 9.7 -2.1795588e-09 -5.6379190e-09 +4847 9.702 -2.1683121e-09 -5.6088324e-09 +4848 9.704 -2.1571234e-09 -5.5798959e-09 +4849 9.706 -2.1459924e-09 -5.5511086e-09 +4850 9.708 -2.1349189e-09 -5.5224699e-09 +4851 9.71 -2.1239025e-09 -5.4939788e-09 +4852 9.712 -2.1129429e-09 -5.4656348e-09 +4853 9.714 -2.1020398e-09 -5.4374370e-09 +4854 9.716 -2.0911930e-09 -5.4093846e-09 +4855 9.718 -2.0804022e-09 -5.3814769e-09 +4856 9.72 -2.0696670e-09 -5.3537132e-09 +4857 9.722 -2.0589872e-09 -5.3260928e-09 +4858 9.724 -2.0483626e-09 -5.2986148e-09 +4859 9.726 -2.0377927e-09 -5.2712786e-09 +4860 9.728 -2.0272773e-09 -5.2440834e-09 +4861 9.73 -2.0168163e-09 -5.2170285e-09 +4862 9.732 -2.0064091e-09 -5.1901131e-09 +4863 9.734 -1.9960557e-09 -5.1633366e-09 +4864 9.736 -1.9857557e-09 -5.1366983e-09 +4865 9.738 -1.9755088e-09 -5.1101973e-09 +4866 9.74 -1.9653148e-09 -5.0838331e-09 +4867 9.742 -1.9551734e-09 -5.0576048e-09 +4868 9.744 -1.9450843e-09 -5.0315119e-09 +4869 9.746 -1.9350473e-09 -5.0055536e-09 +4870 9.748 -1.9250620e-09 -4.9797292e-09 +4871 9.75 -1.9151283e-09 -4.9540380e-09 +4872 9.752 -1.9052458e-09 -4.9284793e-09 +4873 9.754 -1.8954143e-09 -4.9030525e-09 +4874 9.756 -1.8856335e-09 -4.8777569e-09 +4875 9.758 -1.8759031e-09 -4.8525918e-09 +4876 9.76 -1.8662230e-09 -4.8275564e-09 +4877 9.762 -1.8565928e-09 -4.8026503e-09 +4878 9.764 -1.8470123e-09 -4.7778726e-09 +4879 9.766 -1.8374813e-09 -4.7532227e-09 +4880 9.768 -1.8279994e-09 -4.7287000e-09 +4881 9.77 -1.8185664e-09 -4.7043038e-09 +4882 9.772 -1.8091821e-09 -4.6800335e-09 +4883 9.774 -1.7998462e-09 -4.6558883e-09 +4884 9.776 -1.7905584e-09 -4.6318677e-09 +4885 9.778 -1.7813186e-09 -4.6079711e-09 +4886 9.78 -1.7721265e-09 -4.5841977e-09 +4887 9.782 -1.7629817e-09 -4.5605469e-09 +4888 9.784 -1.7538842e-09 -4.5370182e-09 +4889 9.786 -1.7448336e-09 -4.5136108e-09 +4890 9.788 -1.7358297e-09 -4.4903242e-09 +4891 9.79 -1.7268722e-09 -4.4671577e-09 +4892 9.792 -1.7179610e-09 -4.4441107e-09 +4893 9.794 -1.7090957e-09 -4.4211827e-09 +4894 9.796 -1.7002761e-09 -4.3983729e-09 +4895 9.798 -1.6915021e-09 -4.3756807e-09 +4896 9.8 -1.6827733e-09 -4.3531057e-09 +4897 9.802 -1.6740896e-09 -4.3306470e-09 +4898 9.804 -1.6654507e-09 -4.3083043e-09 +4899 9.806 -1.6568563e-09 -4.2860768e-09 +4900 9.808 -1.6483063e-09 -4.2639640e-09 +4901 9.81 -1.6398004e-09 -4.2419652e-09 +4902 9.812 -1.6313384e-09 -4.2200800e-09 +4903 9.814 -1.6229200e-09 -4.1983076e-09 +4904 9.816 -1.6145450e-09 -4.1766476e-09 +4905 9.818 -1.6062133e-09 -4.1550992e-09 +4906 9.82 -1.5979246e-09 -4.1336621e-09 +4907 9.822 -1.5896786e-09 -4.1123355e-09 +4908 9.824 -1.5814752e-09 -4.0911190e-09 +4909 9.826 -1.5733141e-09 -4.0700119e-09 +4910 9.828 -1.5651950e-09 -4.0490137e-09 +4911 9.83 -1.5571179e-09 -4.0281238e-09 +4912 9.832 -1.5490825e-09 -4.0073417e-09 +4913 9.834 -1.5410885e-09 -3.9866668e-09 +4914 9.836 -1.5331357e-09 -3.9660986e-09 +4915 9.838 -1.5252240e-09 -3.9456365e-09 +4916 9.84 -1.5173531e-09 -3.9252799e-09 +4917 9.842 -1.5095228e-09 -3.9050283e-09 +4918 9.844 -1.5017329e-09 -3.8848812e-09 +4919 9.846 -1.4939832e-09 -3.8648381e-09 +4920 9.848 -1.4862735e-09 -3.8448983e-09 +4921 9.85 -1.4786036e-09 -3.8250614e-09 +4922 9.852 -1.4709732e-09 -3.8053269e-09 +4923 9.854 -1.4633822e-09 -3.7856941e-09 +4924 9.856 -1.4558304e-09 -3.7661626e-09 +4925 9.858 -1.4483175e-09 -3.7467319e-09 +4926 9.86 -1.4408434e-09 -3.7274014e-09 +4927 9.862 -1.4334078e-09 -3.7081707e-09 +4928 9.864 -1.4260106e-09 -3.6890391e-09 +4929 9.866 -1.4186516e-09 -3.6700063e-09 +4930 9.868 -1.4113305e-09 -3.6510716e-09 +4931 9.87 -1.4040472e-09 -3.6322346e-09 +4932 9.872 -1.3968015e-09 -3.6134948e-09 +4933 9.874 -1.3895932e-09 -3.5948517e-09 +4934 9.876 -1.3824221e-09 -3.5763047e-09 +4935 9.878 -1.3752879e-09 -3.5578535e-09 +4936 9.88 -1.3681906e-09 -3.5394974e-09 +4937 9.882 -1.3611299e-09 -3.5212360e-09 +4938 9.884 -1.3541056e-09 -3.5030688e-09 +4939 9.886 -1.3471175e-09 -3.4849953e-09 +4940 9.888 -1.3401655e-09 -3.4670151e-09 +4941 9.89 -1.3332494e-09 -3.4491276e-09 +4942 9.892 -1.3263690e-09 -3.4313324e-09 +4943 9.894 -1.3195240e-09 -3.4136290e-09 +4944 9.896 -1.3127144e-09 -3.3960169e-09 +4945 9.898 -1.3059399e-09 -3.3784957e-09 +4946 9.9 -1.2992003e-09 -3.3610649e-09 +4947 9.902 -1.2924956e-09 -3.3437240e-09 +4948 9.904 -1.2858254e-09 -3.3264725e-09 +4949 9.906 -1.2791896e-09 -3.3093101e-09 +4950 9.908 -1.2725881e-09 -3.2922362e-09 +4951 9.91 -1.2660206e-09 -3.2752504e-09 +4952 9.912 -1.2594870e-09 -3.2583521e-09 +4953 9.914 -1.2529871e-09 -3.2415411e-09 +4954 9.916 -1.2465208e-09 -3.2248168e-09 +4955 9.918 -1.2400878e-09 -3.2081788e-09 +4956 9.92 -1.2336880e-09 -3.1916266e-09 +4957 9.922 -1.2273213e-09 -3.1751598e-09 +4958 9.924 -1.2209873e-09 -3.1587779e-09 +4959 9.926 -1.2146861e-09 -3.1424806e-09 +4960 9.928 -1.2084173e-09 -3.1262673e-09 +4961 9.93 -1.2021810e-09 -3.1101377e-09 +4962 9.932 -1.1959767e-09 -3.0940913e-09 +4963 9.934 -1.1898045e-09 -3.0781276e-09 +4964 9.936 -1.1836642e-09 -3.0622464e-09 +4965 9.938 -1.1775555e-09 -3.0464470e-09 +4966 9.94 -1.1714783e-09 -3.0307292e-09 +4967 9.942 -1.1654325e-09 -3.0150924e-09 +4968 9.944 -1.1594179e-09 -2.9995363e-09 +4969 9.946 -1.1534343e-09 -2.9840605e-09 +4970 9.948 -1.1474816e-09 -2.9686645e-09 +4971 9.95 -1.1415596e-09 -2.9533479e-09 +4972 9.952 -1.1356682e-09 -2.9381103e-09 +4973 9.954 -1.1298071e-09 -2.9229513e-09 +4974 9.956 -1.1239763e-09 -2.9078706e-09 +4975 9.958 -1.1181756e-09 -2.8928676e-09 +4976 9.96 -1.1124048e-09 -2.8779421e-09 +4977 9.962 -1.1066638e-09 -2.8630935e-09 +4978 9.964 -1.1009524e-09 -2.8483216e-09 +4979 9.966 -1.0952704e-09 -2.8336258e-09 +4980 9.968 -1.0896178e-09 -2.8190059e-09 +4981 9.97 -1.0839944e-09 -2.8044613e-09 +4982 9.972 -1.0783999e-09 -2.7899919e-09 +4983 9.974 -1.0728343e-09 -2.7755970e-09 +4984 9.976 -1.0672975e-09 -2.7612764e-09 +4985 9.978 -1.0617892e-09 -2.7470297e-09 +4986 9.98 -1.0563093e-09 -2.7328565e-09 +4987 9.982 -1.0508577e-09 -2.7187565e-09 +4988 9.984 -1.0454342e-09 -2.7047291e-09 +4989 9.986 -1.0400387e-09 -2.6907741e-09 +4990 9.988 -1.0346711e-09 -2.6768911e-09 +4991 9.99 -1.0293311e-09 -2.6630798e-09 +4992 9.992 -1.0240187e-09 -2.6493397e-09 +4993 9.994 -1.0187337e-09 -2.6356704e-09 +4994 9.996 -1.0134760e-09 -2.6220717e-09 +4995 9.998 -1.0082454e-09 -2.6085431e-09 + +Pair_Na-O +N 4995 + +1 0.01 5.0000000e+24 6.0000000e+27 +2 0.012 5.6078327e+23 5.6078327e+26 +3 0.014 8.8192890e+22 7.5593906e+25 +4 0.016 1.7763568e+22 1.3322676e+25 +5 0.018 4.3221511e+21 2.8814341e+24 +6 0.02 1.2207031e+21 7.3242188e+23 +7 0.022 3.8895363e+20 2.1215653e+23 +8 0.024 1.3690998e+20 6.8454989e+22 +9 0.026 5.2394998e+19 2.4182307e+22 +10 0.028 2.1531467e+19 9.2277717e+21 +11 0.03 9.4083821e+18 3.7633528e+21 +12 0.032 4.3368087e+18 1.6263033e+21 +13 0.034 2.0951880e+18 7.3947812e+20 +14 0.036 1.0552127e+18 3.5173756e+20 +15 0.038 5.5152708e+17 1.7416645e+20 +16 0.04 2.9802322e+17 8.9406967e+19 +17 0.042 1.6595048e+17 4.7414424e+19 +18 0.044 9.4959384e+16 2.5898014e+19 +19 0.046 5.5702671e+16 1.4531132e+19 +20 0.048 3.3425288e+16 8.3563220e+18 +21 0.05 2.0480000e+16 4.9152000e+18 +22 0.052 1.2791748e+16 2.9519417e+18 +23 0.054 8.1328898e+15 1.8073088e+18 +24 0.056 5.2567059e+15 1.1264370e+18 +25 0.058 3.4501191e+15 7.1381774e+17 +26 0.06 2.2969683e+15 4.5939366e+17 +27 0.062 1.5497789e+15 2.9995720e+17 +28 0.064 1.0587912e+15 1.9852335e+17 +29 0.066 7.3188488e+14 1.3306998e+17 +30 0.068 5.1152051e+14 9.0268325e+16 +31 0.07 3.6123808e+14 6.1926528e+16 +32 0.072 2.5762028e+14 4.2936713e+16 +33 0.074 1.8543400e+14 3.0070378e+16 +34 0.076 1.3465017e+14 2.1260553e+16 +35 0.078 9.8590433e+13 1.5167759e+16 +36 0.08 7.2759576e+13 1.0913936e+16 +37 0.082 5.4100811e+13 7.9171919e+15 +38 0.084 4.0515255e+13 5.7878935e+15 +39 0.086 3.0548408e+13 4.2625686e+15 +40 0.088 2.3183443e+13 3.1613786e+15 +41 0.09 1.7703531e+13 2.3604708e+15 +42 0.092 1.3599285e+13 1.7738198e+15 +43 0.094 1.0505960e+13 1.3411864e+15 +44 0.096 8.1604707e+12 1.0200588e+15 +45 0.098 6.3717261e+12 7.8021135e+14 +46 0.1 5.0000000e+12 6.0000000e+14 +47 0.102 3.9424659e+12 4.6381952e+14 +48 0.104 3.1229852e+12 3.6034445e+14 +49 0.106 2.4848468e+12 2.8130341e+14 +50 0.108 1.9855688e+12 2.2061875e+14 +51 0.11 1.5931541e+12 1.7379863e+14 +52 0.112 1.2833755e+12 1.3750451e+14 +53 0.114 1.0377955e+12 1.0924163e+14 +54 0.116 8.4231422e+11 8.7135954e+13 +55 0.118 6.8609763e+11 6.9772640e+13 +56 0.12 5.6078327e+11 5.6078327e+13 +57 0.122 4.5988796e+11 4.5234881e+13 +58 0.124 3.7836398e+11 3.6615869e+13 +59 0.126 3.1226511e+11 2.9739534e+13 +60 0.128 2.5849394e+11 2.4233807e+13 +61 0.13 2.1460991e+11 1.9810146e+13 +62 0.132 1.7868283e+11 1.6243894e+13 +63 0.134 1.4918063e+11 1.3359459e+13 +64 0.136 1.2488294e+11 1.1019083e+13 +65 0.138 1.0481440e+11 9.1142960e+12 +66 0.14 8.8192891e+10 7.5593906e+12 +67 0.142 7.4389198e+10 6.2864110e+12 +68 0.144 6.2895577e+10 5.2412980e+12 +69 0.146 5.3301047e+10 4.3809079e+12 +70 0.148 4.5271973e+10 3.6707005e+12 +71 0.15 3.8536734e+10 3.0829387e+12 +72 0.152 3.2873577e+10 2.5952823e+12 +73 0.154 2.8100973e+10 2.1896862e+12 +74 0.156 2.4069930e+10 1.8515331e+12 +75 0.158 2.0657843e+10 1.5689501e+12 +76 0.16 1.7763569e+10 1.3322676e+12 +77 0.162 1.5303467e+10 1.1335901e+12 +78 0.164 1.3208206e+10 9.6645409e+11 +79 0.166 1.1420180e+10 8.2555518e+11 +80 0.168 9.8914201e+09 7.0652997e+11 +81 0.17 8.5818906e+09 6.0578048e+11 +82 0.172 7.4581081e+09 5.2033309e+11 +83 0.174 6.4920082e+09 4.4772467e+11 +84 0.176 5.6600208e+09 3.8591048e+11 +85 0.178 4.9423104e+09 3.3318944e+11 +86 0.18 4.3221516e+09 2.8814341e+11 +87 0.182 3.7854142e+09 2.4958772e+11 +88 0.184 3.3201384e+09 2.1653074e+11 +89 0.186 2.9161828e+09 1.8814080e+11 +90 0.188 2.5649322e+09 1.6371905e+11 +91 0.19 2.2590554e+09 1.4267716e+11 +92 0.192 1.9923029e+09 1.2451890e+11 +93 0.194 1.7593383e+09 1.0882502e+11 +94 0.196 1.5555976e+09 9.5240646e+10 +95 0.198 1.3771710e+09 8.3464882e+10 +96 0.2 1.2207036e+09 7.3242189e+10 +97 0.202 1.0833125e+09 6.4355172e+10 +98 0.204 9.6251654e+08 5.6618595e+10 +99 0.206 8.5617706e+08 4.9874367e+10 +100 0.208 7.6244802e+08 4.3987361e+10 +101 0.21 6.7973362e+08 3.8841897e+10 +102 0.212 6.0665249e+08 3.4338797e+10 +103 0.214 5.4200722e+08 3.0392905e+10 +104 0.216 4.8475844e+08 2.6931002e+10 +105 0.218 4.3400278e+08 2.3890039e+10 +106 0.22 3.8895406e+08 2.1215654e+10 +107 0.222 3.4892721e+08 1.8860909e+10 +108 0.224 3.1332451e+08 1.6785221e+10 +109 0.226 2.8162382e+08 1.4953456e+10 +110 0.228 2.5336846e+08 1.3335162e+10 +111 0.23 2.2815855e+08 1.1903905e+10 +112 0.232 2.0564353e+08 1.0636715e+10 +113 0.234 1.8551570e+08 9.5136062e+09 +114 0.236 1.6750471e+08 8.5171694e+09 +115 0.238 1.5137274e+08 7.6322202e+09 +116 0.24 1.3691038e+08 6.8455004e+09 +117 0.242 1.2393301e+08 6.1454203e+09 +118 0.244 1.1227773e+08 5.5218374e+09 +119 0.246 1.0180061e+08 4.9658658e+09 +120 0.248 9.2374405e+07 4.4697119e+09 +121 0.25 8.3886464e+07 4.0265332e+09 +122 0.252 7.6236981e+07 3.6303156e+09 +123 0.254 6.9337436e+07 3.2757678e+09 +124 0.256 6.3109249e+07 2.9582297e+09 +125 0.258 5.7482594e+07 2.6735930e+09 +126 0.26 5.2395369e+07 2.4182320e+09 +127 0.262 4.7792292e+07 2.1889444e+09 +128 0.264 4.3624104e+07 1.9828985e+09 +129 0.266 3.9846880e+07 1.7975885e+09 +130 0.268 3.6421412e+07 1.6307946e+09 +131 0.27 3.3312674e+07 1.4805487e+09 +132 0.272 3.0489354e+07 1.3451041e+09 +133 0.274 2.7923428e+07 1.2229097e+09 +134 0.276 2.5589804e+07 1.1125862e+09 +135 0.278 2.3465991e+07 1.0129067e+09 +136 0.28 2.1531813e+07 9.2277840e+08 +137 0.282 1.9769161e+07 8.4122752e+08 +138 0.284 1.8161766e+07 7.6738537e+08 +139 0.286 1.6694999e+07 7.0047649e+08 +140 0.288 1.5355701e+07 6.3980808e+08 +141 0.29 1.4132021e+07 5.8476067e+08 +142 0.292 1.3013282e+07 5.3477998e+08 +143 0.294 1.1989855e+07 4.8936961e+08 +144 0.296 1.1053054e+07 4.4808472e+08 +145 0.298 1.0195033e+07 4.1052635e+08 +146 0.3 9.4087038e+06 3.7633643e+08 +147 0.302 8.6876568e+06 3.4519335e+08 +148 0.304 8.0260925e+06 3.1680805e+08 +149 0.306 7.4187600e+06 2.9092054e+08 +150 0.308 6.8609017e+06 2.6729679e+08 +151 0.31 6.3482046e+06 2.4572604e+08 +152 0.312 5.8767559e+06 2.2601832e+08 +153 0.314 5.4430039e+06 2.0800228e+08 +154 0.316 5.0437224e+06 1.9152331e+08 +155 0.318 4.6759794e+06 1.7644174e+08 +156 0.32 4.3371083e+06 1.6263139e+08 +157 0.322 4.0246827e+06 1.4997815e+08 +158 0.324 3.7364933e+06 1.3837875e+08 +159 0.326 3.4705276e+06 1.2773973e+08 +160 0.328 3.2249508e+06 1.1797639e+08 +161 0.33 2.9980896e+06 1.0901196e+08 +162 0.332 2.7884169e+06 1.0077680e+08 +163 0.334 2.5945385e+06 9.3207725e+07 +164 0.336 2.4151803e+06 8.6247342e+07 +165 0.338 2.2491782e+06 7.9843504e+07 +166 0.34 2.0954670e+06 7.3948805e+07 +167 0.342 1.9530723e+06 6.8520121e+07 +168 0.344 1.8211021e+06 6.3518202e+07 +169 0.346 1.6987389e+06 5.8907302e+07 +170 0.348 1.5852340e+06 5.4654856e+07 +171 0.35 1.4799004e+06 5.0731170e+07 +172 0.352 1.3821082e+06 4.7109164e+07 +173 0.354 1.2912791e+06 4.3764122e+07 +174 0.356 1.2068822e+06 4.0673477e+07 +175 0.358 1.1284294e+06 3.7816611e+07 +176 0.36 1.0554725e+06 3.5174681e+07 +177 0.362 9.8759893e+05 3.2730454e+07 +178 0.364 9.2442939e+05 3.0468163e+07 +179 0.366 8.6561464e+05 2.8373375e+07 +180 0.368 8.1083306e+05 2.6432874e+07 +181 0.37 7.5978838e+05 2.4634547e+07 +182 0.372 7.1220751e+05 2.2967292e+07 +183 0.374 6.6783863e+05 2.1420928e+07 +184 0.376 6.2644945e+05 1.9986110e+07 +185 0.378 5.8782557e+05 1.8654262e+07 +186 0.38 5.5176902e+05 1.7417507e+07 +187 0.382 5.1809698e+05 1.6268607e+07 +188 0.384 4.8664047e+05 1.5200911e+07 +189 0.386 4.5724329e+05 1.4208299e+07 +190 0.388 4.2976098e+05 1.3285142e+07 +191 0.39 4.0405988e+05 1.2426260e+07 +192 0.392 3.8001628e+05 1.1626881e+07 +193 0.394 3.5751563e+05 1.0882611e+07 +194 0.396 3.3645181e+05 1.0189399e+07 +195 0.398 3.1672649e+05 9.5435096e+06 +196 0.4 2.9824852e+05 8.9414997e+06 +197 0.402 2.8093336e+05 8.3801903e+06 +198 0.404 2.6470259e+05 7.8566475e+06 +199 0.406 2.4948341e+05 7.3681617e+06 +200 0.408 2.3520824e+05 6.9122299e+06 +201 0.41 2.2181433e+05 6.4865386e+06 +202 0.412 2.0924336e+05 6.0889489e+06 +203 0.414 1.9744112e+05 5.7174827e+06 +204 0.416 1.8635723e+05 5.3703094e+06 +205 0.418 1.7594482e+05 5.0457349e+06 +206 0.42 1.6616028e+05 4.7421903e+06 +207 0.422 1.5696301e+05 4.4582225e+06 +208 0.424 1.4831523e+05 4.1924850e+06 +209 0.426 1.4018175e+05 3.9437294e+06 +210 0.428 1.3252977e+05 3.7107983e+06 +211 0.43 1.2532873e+05 3.4926181e+06 +212 0.432 1.1855013e+05 3.2881925e+06 +213 0.434 1.1216740e+05 3.0965964e+06 +214 0.436 1.0615576e+05 2.9169711e+06 +215 0.438 1.0049207e+05 2.7485188e+06 +216 0.44 9.5154736e+04 2.5904981e+06 +217 0.442 9.0123586e+04 2.4422201e+06 +218 0.444 8.5379788e+04 2.3030438e+06 +219 0.446 8.0905741e+04 2.1723734e+06 +220 0.448 7.6684995e+04 2.0496542e+06 +221 0.45 7.2702169e+04 1.9343701e+06 +222 0.452 6.8942879e+04 1.8260406e+06 +223 0.454 6.5393669e+04 1.7242181e+06 +224 0.456 6.2041947e+04 1.6284855e+06 +225 0.458 5.8875927e+04 1.5384543e+06 +226 0.46 5.5884571e+04 1.4537622e+06 +227 0.462 5.3057544e+04 1.3740714e+06 +228 0.464 5.0385162e+04 1.2990668e+06 +229 0.466 4.7858349e+04 1.2284543e+06 +230 0.468 4.5468600e+04 1.1619596e+06 +231 0.47 4.3207937e+04 1.0993264e+06 +232 0.472 4.1068880e+04 1.0403153e+06 +233 0.474 3.9044410e+04 9.8470304e+05 +234 0.476 3.7127941e+04 9.3228056e+05 +235 0.478 3.5313292e+04 8.8285265e+05 +236 0.48 3.3594656e+04 8.3623678e+05 +237 0.482 3.1966584e+04 7.9226223e+05 +238 0.484 3.0423953e+04 7.5076927e+05 +239 0.486 2.8961952e+04 7.1160847e+05 +240 0.488 2.7576058e+04 6.7463992e+05 +241 0.49 2.6262019e+04 6.3973265e+05 +242 0.492 2.5015835e+04 6.0676400e+05 +243 0.494 2.3833747e+04 5.7561907e+05 +244 0.496 2.2712215e+04 5.4619018e+05 +245 0.498 2.1647910e+04 5.1837641e+05 +246 0.5 2.0637696e+04 4.9208316e+05 +247 0.502 1.9678622e+04 4.6722171e+05 +248 0.504 1.8767910e+04 4.4370882e+05 +249 0.506 1.7902940e+04 4.2146642e+05 +250 0.508 1.7081246e+04 4.0042123e+05 +251 0.51 1.6300503e+04 3.8050447e+05 +252 0.512 1.5558519e+04 3.6165154e+05 +253 0.514 1.4853228e+04 3.4380179e+05 +254 0.516 1.4182681e+04 3.2689824e+05 +255 0.518 1.3545040e+04 3.1088733e+05 +256 0.52 1.2938571e+04 2.9571874e+05 +257 0.522 1.2361635e+04 2.8134518e+05 +258 0.524 1.1812690e+04 2.6772214e+05 +259 0.526 1.1290274e+04 2.5480778e+05 +260 0.528 1.0793012e+04 2.4256276e+05 +261 0.53 1.0319602e+04 2.3095003e+05 +262 0.532 9.8688140e+03 2.1993473e+05 +263 0.534 9.4394867e+03 2.0948403e+05 +264 0.536 9.0305221e+03 1.9956705e+05 +265 0.538 8.6408821e+03 1.9015468e+05 +266 0.54 8.2695852e+03 1.8121950e+05 +267 0.542 7.9157032e+03 1.7273567e+05 +268 0.544 7.5783579e+03 1.6467885e+05 +269 0.546 7.2567185e+03 1.5702609e+05 +270 0.548 6.9499987e+03 1.4975574e+05 +271 0.55 6.6574542e+03 1.4284740e+05 +272 0.552 6.3783806e+03 1.3628182e+05 +273 0.554 6.1121106e+03 1.3004084e+05 +274 0.556 5.8580123e+03 1.2410731e+05 +275 0.558 5.6154872e+03 1.1846506e+05 +276 0.56 5.3839681e+03 1.1309881e+05 +277 0.562 5.1629175e+03 1.0799415e+05 +278 0.564 4.9518262e+03 1.0313745e+05 +279 0.566 4.7502110e+03 9.8515849e+04 +280 0.568 4.5576142e+03 9.4117187e+04 +281 0.57 4.3736013e+03 8.9929977e+04 +282 0.572 4.1977606e+03 8.5943360e+04 +283 0.574 4.0297010e+03 8.2147069e+04 +284 0.576 3.8690519e+03 7.8531396e+04 +285 0.578 3.7154612e+03 7.5087160e+04 +286 0.58 3.5685947e+03 7.1805676e+04 +287 0.582 3.4281354e+03 6.8678727e+04 +288 0.584 3.2937820e+03 6.5698537e+04 +289 0.586 3.1652484e+03 6.2857744e+04 +290 0.588 3.0422627e+03 6.0149383e+04 +291 0.59 2.9245670e+03 5.7566854e+04 +292 0.592 2.8119156e+03 5.5103910e+04 +293 0.594 2.7040755e+03 5.2754633e+04 +294 0.596 2.6008251e+03 5.0513417e+04 +295 0.598 2.5019534e+03 4.8374948e+04 +296 0.6 2.4072601e+03 4.6334192e+04 +297 0.602 2.3165547e+03 4.4386376e+04 +298 0.604 2.2296557e+03 4.2526975e+04 +299 0.606 2.1463907e+03 4.0751700e+04 +300 0.608 2.0665955e+03 3.9056480e+04 +301 0.61 1.9901140e+03 3.7437456e+04 +302 0.612 1.9167973e+03 3.5890967e+04 +303 0.614 1.8465041e+03 3.4413537e+04 +304 0.616 1.7790994e+03 3.3001869e+04 +305 0.618 1.7144548e+03 3.1652833e+04 +306 0.62 1.6524483e+03 3.0363457e+04 +307 0.622 1.5929631e+03 2.9130918e+04 +308 0.624 1.5358885e+03 2.7952538e+04 +309 0.626 1.4811186e+03 2.6825771e+04 +310 0.628 1.4285526e+03 2.5748198e+04 +311 0.63 1.3780945e+03 2.4717522e+04 +312 0.632 1.3296527e+03 2.3731559e+04 +313 0.634 1.2831399e+03 2.2788233e+04 +314 0.636 1.2384727e+03 2.1885573e+04 +315 0.638 1.1955717e+03 2.1021701e+04 +316 0.64 1.1543612e+03 2.0194835e+04 +317 0.642 1.1147688e+03 1.9403277e+04 +318 0.644 1.0767256e+03 1.8645414e+04 +319 0.646 1.0401657e+03 1.7919710e+04 +320 0.648 1.0050263e+03 1.7224705e+04 +321 0.65 9.7124738e+02 1.6559008e+04 +322 0.652 9.3877163e+02 1.5921295e+04 +323 0.654 9.0754438e+02 1.5310308e+04 +324 0.656 8.7751339e+02 1.4724847e+04 +325 0.658 8.4862874e+02 1.4163769e+04 +326 0.66 8.2084278e+02 1.3625987e+04 +327 0.662 7.9410996e+02 1.3110464e+04 +328 0.664 7.6838675e+02 1.2616214e+04 +329 0.666 7.4363155e+02 1.2142295e+04 +330 0.668 7.1980461e+02 1.1687813e+04 +331 0.67 6.9686791e+02 1.1251912e+04 +332 0.672 6.7478512e+02 1.0833778e+04 +333 0.674 6.5352147e+02 1.0432635e+04 +334 0.676 6.3304375e+02 1.0047742e+04 +335 0.678 6.1332014e+02 9.6783941e+03 +336 0.68 5.9432026e+02 9.3239177e+03 +337 0.682 5.7601499e+02 8.9836705e+03 +338 0.684 5.5837650e+02 8.6570398e+03 +339 0.686 5.4137814e+02 8.3434410e+03 +340 0.688 5.2499442e+02 8.0423163e+03 +341 0.69 5.0920092e+02 7.7531330e+03 +342 0.692 4.9397426e+02 7.4753830e+03 +343 0.694 4.7929209e+02 7.2085809e+03 +344 0.696 4.6513295e+02 6.9522634e+03 +345 0.698 4.5147634e+02 6.7059882e+03 +346 0.7 4.3830259e+02 6.4693326e+03 +347 0.702 4.2559286e+02 6.2418929e+03 +348 0.704 4.1332913e+02 6.0232836e+03 +349 0.706 4.0149409e+02 5.8131362e+03 +350 0.708 3.9007118e+02 5.6110987e+03 +351 0.71 3.7904451e+02 5.4168346e+03 +352 0.712 3.6839887e+02 5.2300223e+03 +353 0.714 3.5811966e+02 5.0503544e+03 +354 0.716 3.4819289e+02 4.8775369e+03 +355 0.718 3.3860513e+02 4.7112889e+03 +356 0.72 3.2934353e+02 4.5513416e+03 +357 0.722 3.2039574e+02 4.3974379e+03 +358 0.724 3.1174991e+02 4.2493319e+03 +359 0.726 3.0339470e+02 4.1067885e+03 +360 0.728 2.9531920e+02 3.9695825e+03 +361 0.73 2.8751296e+02 3.8374987e+03 +362 0.732 2.7996593e+02 3.7103309e+03 +363 0.734 2.7266849e+02 3.5878819e+03 +364 0.736 2.6561138e+02 3.4699629e+03 +365 0.738 2.5878574e+02 3.3563930e+03 +366 0.74 2.5218303e+02 3.2469992e+03 +367 0.742 2.4579507e+02 3.1416158e+03 +368 0.744 2.3961400e+02 3.0400841e+03 +369 0.746 2.3363226e+02 2.9422519e+03 +370 0.748 2.2784262e+02 2.8479737e+03 +371 0.75 2.2223809e+02 2.7571100e+03 +372 0.752 2.1681199e+02 2.6695270e+03 +373 0.754 2.1155788e+02 2.5850967e+03 +374 0.756 2.0646959e+02 2.5036964e+03 +375 0.758 2.0154116e+02 2.4252082e+03 +376 0.76 1.9676689e+02 2.3495195e+03 +377 0.762 1.9214128e+02 2.2765221e+03 +378 0.764 1.8765907e+02 2.2061124e+03 +379 0.766 1.8331518e+02 2.1381908e+03 +380 0.768 1.7910471e+02 2.0726622e+03 +381 0.77 1.7502299e+02 2.0094349e+03 +382 0.772 1.7106550e+02 1.9484214e+03 +383 0.774 1.6722789e+02 1.8895375e+03 +384 0.776 1.6350598e+02 1.8327024e+03 +385 0.778 1.5989576e+02 1.7778387e+03 +386 0.78 1.5639336e+02 1.7248720e+03 +387 0.782 1.5299506e+02 1.6737311e+03 +388 0.784 1.4969727e+02 1.6243473e+03 +389 0.786 1.4649654e+02 1.5766551e+03 +390 0.788 1.4338956e+02 1.5305912e+03 +391 0.79 1.4037313e+02 1.4860951e+03 +392 0.792 1.3744418e+02 1.4431086e+03 +393 0.794 1.3459973e+02 1.4015758e+03 +394 0.796 1.3183694e+02 1.3614431e+03 +395 0.798 1.2915306e+02 1.3226589e+03 +396 0.8 1.2654544e+02 1.2851737e+03 +397 0.802 1.2401153e+02 1.2489398e+03 +398 0.804 1.2154887e+02 1.2139117e+03 +399 0.806 1.1915511e+02 1.1800454e+03 +400 0.808 1.1682795e+02 1.1472986e+03 +401 0.81 1.1456519e+02 1.1156308e+03 +402 0.812 1.1236473e+02 1.0850030e+03 +403 0.814 1.1022451e+02 1.0553777e+03 +404 0.816 1.0814257e+02 1.0267188e+03 +405 0.818 1.0611702e+02 9.9899178e+02 +406 0.82 1.0414601e+02 9.7216317e+02 +407 0.822 1.0222779e+02 9.4620098e+02 +408 0.824 1.0036065e+02 9.2107438e+02 +409 0.826 9.8542951e+01 8.9675373e+02 +410 0.828 9.6773114e+01 8.7321048e+02 +411 0.83 9.5049610e+01 8.5041722e+02 +412 0.832 9.3370963e+01 8.2834752e+02 +413 0.834 9.1735754e+01 8.0697600e+02 +414 0.836 9.0142610e+01 7.8627819e+02 +415 0.838 8.8590208e+01 7.6623057e+02 +416 0.84 8.7077270e+01 7.4681049e+02 +417 0.842 8.5602562e+01 7.2799614e+02 +418 0.844 8.4164895e+01 7.0976654e+02 +419 0.846 8.2763120e+01 6.9210148e+02 +420 0.848 8.1396126e+01 6.7498150e+02 +421 0.85 8.0062843e+01 6.5838786e+02 +422 0.852 7.8762236e+01 6.4230252e+02 +423 0.854 7.7493305e+01 6.2670809e+02 +424 0.856 7.6255087e+01 6.1158784e+02 +425 0.858 7.5046649e+01 5.9692564e+02 +426 0.86 7.3867090e+01 5.8270595e+02 +427 0.862 7.2715540e+01 5.6891381e+02 +428 0.864 7.1591159e+01 5.5553477e+02 +429 0.866 7.0493135e+01 5.4255495e+02 +430 0.868 6.9420682e+01 5.2996095e+02 +431 0.87 6.8373042e+01 5.1773985e+02 +432 0.872 6.7349482e+01 5.0587921e+02 +433 0.874 6.6349293e+01 4.9436703e+02 +434 0.876 6.5371790e+01 4.8319173e+02 +435 0.878 6.4416309e+01 4.7234218e+02 +436 0.88 6.3482211e+01 4.6180760e+02 +437 0.882 6.2568876e+01 4.5157763e+02 +438 0.884 6.1675704e+01 4.4164227e+02 +439 0.886 6.0802116e+01 4.3199186e+02 +440 0.888 5.9947553e+01 4.2261711e+02 +441 0.89 5.9111470e+01 4.1350903e+02 +442 0.892 5.8293345e+01 4.0465896e+02 +443 0.894 5.7492668e+01 3.9605855e+02 +444 0.896 5.6708949e+01 3.8769973e+02 +445 0.898 5.5941713e+01 3.7957471e+02 +446 0.9 5.5190500e+01 3.7167600e+02 +447 0.902 5.4454863e+01 3.6399633e+02 +448 0.904 5.3734373e+01 3.5652872e+02 +449 0.906 5.3028611e+01 3.4926640e+02 +450 0.908 5.2337175e+01 3.4220287e+02 +451 0.91 5.1659672e+01 3.3533181e+02 +452 0.912 5.0995723e+01 3.2864716e+02 +453 0.914 5.0344963e+01 3.2214304e+02 +454 0.916 4.9707035e+01 3.1581379e+02 +455 0.918 4.9081595e+01 3.0965392e+02 +456 0.92 4.8468309e+01 3.0365816e+02 +457 0.922 4.7866856e+01 2.9782138e+02 +458 0.924 4.7276921e+01 2.9213866e+02 +459 0.926 4.6698202e+01 2.8660523e+02 +460 0.928 4.6130404e+01 2.8121648e+02 +461 0.93 4.5573242e+01 2.7596796e+02 +462 0.932 4.5026441e+01 2.7085536e+02 +463 0.934 4.4489733e+01 2.6587454e+02 +464 0.936 4.3962858e+01 2.6102146e+02 +465 0.938 4.3445565e+01 2.5629225e+02 +466 0.94 4.2937609e+01 2.5168315e+02 +467 0.942 4.2438754e+01 2.4719053e+02 +468 0.944 4.1948772e+01 2.4281088e+02 +469 0.946 4.1467438e+01 2.3854081e+02 +470 0.948 4.0994538e+01 2.3437704e+02 +471 0.95 4.0529861e+01 2.3031638e+02 +472 0.952 4.0073205e+01 2.2635578e+02 +473 0.954 3.9624373e+01 2.2249227e+02 +474 0.956 3.9183173e+01 2.1872296e+02 +475 0.958 3.8749420e+01 2.1504509e+02 +476 0.96 3.8322934e+01 2.1145597e+02 +477 0.962 3.7903539e+01 2.0795300e+02 +478 0.964 3.7491066e+01 2.0453365e+02 +479 0.966 3.7085350e+01 2.0119550e+02 +480 0.968 3.6686232e+01 1.9793619e+02 +481 0.97 3.6293555e+01 1.9475344e+02 +482 0.972 3.5907168e+01 1.9164504e+02 +483 0.974 3.5526926e+01 1.8860886e+02 +484 0.976 3.5152686e+01 1.8564282e+02 +485 0.978 3.4784309e+01 1.8274493e+02 +486 0.98 3.4421662e+01 1.7991324e+02 +487 0.982 3.4064614e+01 1.7714589e+02 +488 0.984 3.3713037e+01 1.7444104e+02 +489 0.986 3.3366809e+01 1.7179694e+02 +490 0.988 3.3025810e+01 1.6921189e+02 +491 0.99 3.2689923e+01 1.6668423e+02 +492 0.992 3.2359036e+01 1.6421236e+02 +493 0.994 3.2033038e+01 1.6179473e+02 +494 0.996 3.1711822e+01 1.5942985e+02 +495 0.998 3.1395284e+01 1.5711626e+02 +496 1.0 3.1083323e+01 1.5485254e+02 +497 1.002 3.0775841e+01 1.5263733e+02 +498 1.004 3.0472743e+01 1.5046931e+02 +499 1.006 3.0173934e+01 1.4834719e+02 +500 1.008 2.9879324e+01 1.4626974e+02 +501 1.01 2.9588826e+01 1.4423574e+02 +502 1.012 2.9302353e+01 1.4224402e+02 +503 1.014 2.9019822e+01 1.4029346e+02 +504 1.016 2.8741152e+01 1.3838296e+02 +505 1.018 2.8466264e+01 1.3651144e+02 +506 1.02 2.8195081e+01 1.3467788e+02 +507 1.022 2.7927528e+01 1.3288128e+02 +508 1.024 2.7663532e+01 1.3112066e+02 +509 1.026 2.7403022e+01 1.2939508e+02 +510 1.028 2.7145929e+01 1.2770363e+02 +511 1.03 2.6892186e+01 1.2604541e+02 +512 1.032 2.6641726e+01 1.2441958e+02 +513 1.034 2.6394486e+01 1.2282529e+02 +514 1.036 2.6150404e+01 1.2126174e+02 +515 1.038 2.5909419e+01 1.1972814e+02 +516 1.04 2.5671472e+01 1.1822372e+02 +517 1.042 2.5436505e+01 1.1674775e+02 +518 1.044 2.5204463e+01 1.1529950e+02 +519 1.046 2.4975289e+01 1.1387829e+02 +520 1.048 2.4748932e+01 1.1248343e+02 +521 1.05 2.4525339e+01 1.1111426e+02 +522 1.052 2.4304458e+01 1.0977015e+02 +523 1.054 2.4086242e+01 1.0845047e+02 +524 1.056 2.3870640e+01 1.0715463e+02 +525 1.058 2.3657608e+01 1.0588205e+02 +526 1.06 2.3447097e+01 1.0463214e+02 +527 1.062 2.3239064e+01 1.0340436e+02 +528 1.064 2.3033465e+01 1.0219818e+02 +529 1.066 2.2830258e+01 1.0101308e+02 +530 1.068 2.2629399e+01 9.9848543e+01 +531 1.07 2.2430850e+01 9.8704085e+01 +532 1.072 2.2234570e+01 9.7579227e+01 +533 1.074 2.2040520e+01 9.6473506e+01 +534 1.076 2.1848663e+01 9.5386470e+01 +535 1.078 2.1658962e+01 9.4317682e+01 +536 1.08 2.1471381e+01 9.3266715e+01 +537 1.082 2.1285884e+01 9.2233155e+01 +538 1.084 2.1102437e+01 9.1216600e+01 +539 1.086 2.0921006e+01 9.0216658e+01 +540 1.088 2.0741559e+01 8.9232949e+01 +541 1.09 2.0564064e+01 8.8265102e+01 +542 1.092 2.0388489e+01 8.7312758e+01 +543 1.094 2.0214803e+01 8.6375567e+01 +544 1.096 2.0042977e+01 8.5453187e+01 +545 1.098 1.9872980e+01 8.4545289e+01 +546 1.1 1.9704786e+01 8.3651549e+01 +547 1.102 1.9538365e+01 8.2771654e+01 +548 1.104 1.9373690e+01 8.1905300e+01 +549 1.106 1.9210735e+01 8.1052188e+01 +550 1.108 1.9049473e+01 8.0212031e+01 +551 1.11 1.8889878e+01 7.9384548e+01 +552 1.112 1.8731926e+01 7.8569464e+01 +553 1.114 1.8575592e+01 7.7766514e+01 +554 1.116 1.8420852e+01 7.6975438e+01 +555 1.118 1.8267683e+01 7.6195983e+01 +556 1.12 1.8116061e+01 7.5427905e+01 +557 1.122 1.7965964e+01 7.4670963e+01 +558 1.124 1.7817370e+01 7.3924925e+01 +559 1.126 1.7670257e+01 7.3189564e+01 +560 1.128 1.7524605e+01 7.2464658e+01 +561 1.13 1.7380392e+01 7.1749993e+01 +562 1.132 1.7237598e+01 7.1045359e+01 +563 1.134 1.7096204e+01 7.0350550e+01 +564 1.136 1.6956189e+01 6.9665369e+01 +565 1.138 1.6817536e+01 6.8989621e+01 +566 1.14 1.6680225e+01 6.8323117e+01 +567 1.142 1.6544237e+01 6.7665673e+01 +568 1.144 1.6409556e+01 6.7017109e+01 +569 1.146 1.6276163e+01 6.6377250e+01 +570 1.148 1.6144041e+01 6.5745926e+01 +571 1.15 1.6013174e+01 6.5122971e+01 +572 1.152 1.5883544e+01 6.4508221e+01 +573 1.154 1.5755136e+01 6.3901519e+01 +574 1.156 1.5627933e+01 6.3302711e+01 +575 1.158 1.5501920e+01 6.2711646e+01 +576 1.16 1.5377081e+01 6.2128177e+01 +577 1.162 1.5253402e+01 6.1552162e+01 +578 1.164 1.5130868e+01 6.0983461e+01 +579 1.166 1.5009463e+01 6.0421937e+01 +580 1.168 1.4889175e+01 5.9867458e+01 +581 1.17 1.4769989e+01 5.9319894e+01 +582 1.172 1.4651891e+01 5.8779119e+01 +583 1.174 1.4534868e+01 5.8245008e+01 +584 1.176 1.4418907e+01 5.7717441e+01 +585 1.178 1.4303994e+01 5.7196302e+01 +586 1.18 1.4190117e+01 5.6681474e+01 +587 1.182 1.4077264e+01 5.6172845e+01 +588 1.184 1.3965422e+01 5.5670307e+01 +589 1.186 1.3854579e+01 5.5173751e+01 +590 1.188 1.3744723e+01 5.4683075e+01 +591 1.19 1.3635842e+01 5.4198175e+01 +592 1.192 1.3527926e+01 5.3718952e+01 +593 1.194 1.3420963e+01 5.3245308e+01 +594 1.196 1.3314941e+01 5.2777149e+01 +595 1.198 1.3209851e+01 5.2314381e+01 +596 1.2 1.3105680e+01 5.1856914e+01 +597 1.202 1.3002420e+01 5.1404659e+01 +598 1.204 1.2900058e+01 5.0957529e+01 +599 1.206 1.2798586e+01 5.0515440e+01 +600 1.208 1.2697993e+01 5.0078308e+01 +601 1.21 1.2598270e+01 4.9646053e+01 +602 1.212 1.2499406e+01 4.9218595e+01 +603 1.214 1.2401392e+01 4.8795857e+01 +604 1.216 1.2304219e+01 4.8377763e+01 +605 1.218 1.2207878e+01 4.7964238e+01 +606 1.22 1.2112359e+01 4.7555212e+01 +607 1.222 1.2017654e+01 4.7150612e+01 +608 1.224 1.1923754e+01 4.6750369e+01 +609 1.226 1.1830650e+01 4.6354415e+01 +610 1.228 1.1738334e+01 4.5962685e+01 +611 1.23 1.1646796e+01 4.5575113e+01 +612 1.232 1.1556030e+01 4.5191635e+01 +613 1.234 1.1466027e+01 4.4812189e+01 +614 1.236 1.1376779e+01 4.4436714e+01 +615 1.238 1.1288278e+01 4.4065152e+01 +616 1.24 1.1200516e+01 4.3697442e+01 +617 1.242 1.1113485e+01 4.3333529e+01 +618 1.244 1.1027179e+01 4.2973355e+01 +619 1.246 1.0941590e+01 4.2616867e+01 +620 1.248 1.0856709e+01 4.2264011e+01 +621 1.25 1.0772531e+01 4.1914733e+01 +622 1.252 1.0689048e+01 4.1568983e+01 +623 1.254 1.0606253e+01 4.1226709e+01 +624 1.256 1.0524139e+01 4.0887863e+01 +625 1.258 1.0442699e+01 4.0552396e+01 +626 1.26 1.0361927e+01 4.0220261e+01 +627 1.262 1.0281816e+01 3.9891410e+01 +628 1.264 1.0202359e+01 3.9565799e+01 +629 1.266 1.0123551e+01 3.9243382e+01 +630 1.268 1.0045384e+01 3.8924116e+01 +631 1.27 9.9678521e+00 3.8607957e+01 +632 1.272 9.8909498e+00 3.8294864e+01 +633 1.274 9.8146706e+00 3.7984794e+01 +634 1.276 9.7390086e+00 3.7677708e+01 +635 1.278 9.6639578e+00 3.7373566e+01 +636 1.28 9.5895124e+00 3.7072329e+01 +637 1.282 9.5156666e+00 3.6773957e+01 +638 1.284 9.4424147e+00 3.6478415e+01 +639 1.286 9.3697511e+00 3.6185664e+01 +640 1.288 9.2976702e+00 3.5895669e+01 +641 1.29 9.2261666e+00 3.5608394e+01 +642 1.292 9.1552348e+00 3.5323805e+01 +643 1.294 9.0848696e+00 3.5041866e+01 +644 1.296 9.0150656e+00 3.4762545e+01 +645 1.298 8.9458177e+00 3.4485809e+01 +646 1.3 8.8771207e+00 3.4211624e+01 +647 1.302 8.8089695e+00 3.3939960e+01 +648 1.304 8.7413592e+00 3.3670784e+01 +649 1.306 8.6742847e+00 3.3404067e+01 +650 1.308 8.6077413e+00 3.3139778e+01 +651 1.31 8.5417240e+00 3.2877888e+01 +652 1.312 8.4762282e+00 3.2618367e+01 +653 1.314 8.4112490e+00 3.2361187e+01 +654 1.316 8.3467819e+00 3.2106320e+01 +655 1.318 8.2828222e+00 3.1853738e+01 +656 1.32 8.2193654e+00 3.1603414e+01 +657 1.322 8.1564070e+00 3.1355321e+01 +658 1.324 8.0939426e+00 3.1109433e+01 +659 1.326 8.0319679e+00 3.0865725e+01 +660 1.328 7.9704783e+00 3.0624170e+01 +661 1.33 7.9094698e+00 3.0384745e+01 +662 1.332 7.8489379e+00 3.0147424e+01 +663 1.334 7.7888787e+00 2.9912183e+01 +664 1.336 7.7292878e+00 2.9679000e+01 +665 1.338 7.6701613e+00 2.9447849e+01 +666 1.34 7.6114951e+00 2.9218709e+01 +667 1.342 7.5532852e+00 2.8991557e+01 +668 1.344 7.4955276e+00 2.8766370e+01 +669 1.346 7.4382184e+00 2.8543127e+01 +670 1.348 7.3813538e+00 2.8321806e+01 +671 1.35 7.3249299e+00 2.8102387e+01 +672 1.352 7.2689430e+00 2.7884847e+01 +673 1.354 7.2133893e+00 2.7669168e+01 +674 1.356 7.1582651e+00 2.7455327e+01 +675 1.358 7.1035667e+00 2.7243306e+01 +676 1.36 7.0492906e+00 2.7033086e+01 +677 1.362 6.9954332e+00 2.6824646e+01 +678 1.364 6.9419909e+00 2.6617967e+01 +679 1.366 6.8889602e+00 2.6413032e+01 +680 1.368 6.8363376e+00 2.6209822e+01 +681 1.37 6.7841197e+00 2.6008317e+01 +682 1.372 6.7323032e+00 2.5808502e+01 +683 1.374 6.6808846e+00 2.5610357e+01 +684 1.376 6.6298607e+00 2.5413866e+01 +685 1.378 6.5792281e+00 2.5219011e+01 +686 1.38 6.5289836e+00 2.5025776e+01 +687 1.382 6.4791239e+00 2.4834145e+01 +688 1.384 6.4296459e+00 2.4644099e+01 +689 1.386 6.3805465e+00 2.4455625e+01 +690 1.388 6.3318224e+00 2.4268704e+01 +691 1.39 6.2834706e+00 2.4083323e+01 +692 1.392 6.2354881e+00 2.3899466e+01 +693 1.394 6.1878717e+00 2.3717116e+01 +694 1.396 6.1406186e+00 2.3536260e+01 +695 1.398 6.0937257e+00 2.3356882e+01 +696 1.4 6.0471901e+00 2.3178968e+01 +697 1.402 6.0010089e+00 2.3002503e+01 +698 1.404 5.9551791e+00 2.2827473e+01 +699 1.406 5.9096980e+00 2.2653864e+01 +700 1.408 5.8645627e+00 2.2481663e+01 +701 1.41 5.8197705e+00 2.2310855e+01 +702 1.412 5.7753184e+00 2.2141427e+01 +703 1.414 5.7312038e+00 2.1973366e+01 +704 1.416 5.6874240e+00 2.1806659e+01 +705 1.418 5.6439763e+00 2.1641292e+01 +706 1.42 5.6008580e+00 2.1477253e+01 +707 1.422 5.5580664e+00 2.1314530e+01 +708 1.424 5.5155990e+00 2.1153109e+01 +709 1.426 5.4734531e+00 2.0992979e+01 +710 1.428 5.4316262e+00 2.0834128e+01 +711 1.43 5.3901158e+00 2.0676542e+01 +712 1.432 5.3489192e+00 2.0520212e+01 +713 1.434 5.3080341e+00 2.0365124e+01 +714 1.436 5.2674579e+00 2.0211268e+01 +715 1.438 5.2271882e+00 2.0058632e+01 +716 1.44 5.1872226e+00 1.9907205e+01 +717 1.442 5.1475586e+00 1.9756975e+01 +718 1.444 5.1081939e+00 1.9607932e+01 +719 1.446 5.0691261e+00 1.9460065e+01 +720 1.448 5.0303528e+00 1.9313363e+01 +721 1.45 4.9918719e+00 1.9167815e+01 +722 1.452 4.9536808e+00 1.9023412e+01 +723 1.454 4.9157775e+00 1.8880142e+01 +724 1.456 4.8781595e+00 1.8737996e+01 +725 1.458 4.8408247e+00 1.8596964e+01 +726 1.46 4.8037709e+00 1.8457035e+01 +727 1.462 4.7669959e+00 1.8318199e+01 +728 1.464 4.7304974e+00 1.8180448e+01 +729 1.466 4.6942734e+00 1.8043771e+01 +730 1.468 4.6583216e+00 1.7908158e+01 +731 1.47 4.6226400e+00 1.7773602e+01 +732 1.472 4.5872265e+00 1.7640091e+01 +733 1.474 4.5520790e+00 1.7507617e+01 +734 1.476 4.5171953e+00 1.7376171e+01 +735 1.478 4.4825736e+00 1.7245744e+01 +736 1.48 4.4482117e+00 1.7116326e+01 +737 1.482 4.4141076e+00 1.6987910e+01 +738 1.484 4.3802594e+00 1.6860487e+01 +739 1.486 4.3466650e+00 1.6734048e+01 +740 1.488 4.3133226e+00 1.6608584e+01 +741 1.49 4.2802300e+00 1.6484087e+01 +742 1.492 4.2473856e+00 1.6360548e+01 +743 1.494 4.2147872e+00 1.6237961e+01 +744 1.496 4.1824331e+00 1.6116315e+01 +745 1.498 4.1503213e+00 1.5995604e+01 +746 1.5 4.1184501e+00 1.5875820e+01 +747 1.502 4.0868174e+00 1.5756954e+01 +748 1.504 4.0554216e+00 1.5638999e+01 +749 1.506 4.0242608e+00 1.5521947e+01 +750 1.508 3.9933333e+00 1.5405790e+01 +751 1.51 3.9626371e+00 1.5290522e+01 +752 1.512 3.9321706e+00 1.5176133e+01 +753 1.514 3.9019320e+00 1.5062618e+01 +754 1.516 3.8719195e+00 1.4949969e+01 +755 1.518 3.8421315e+00 1.4838178e+01 +756 1.52 3.8125662e+00 1.4727239e+01 +757 1.522 3.7832220e+00 1.4617144e+01 +758 1.524 3.7540971e+00 1.4507886e+01 +759 1.526 3.7251899e+00 1.4399458e+01 +760 1.528 3.6964987e+00 1.4291854e+01 +761 1.53 3.6680219e+00 1.4185067e+01 +762 1.532 3.6397579e+00 1.4079090e+01 +763 1.534 3.6117051e+00 1.3973916e+01 +764 1.536 3.5838617e+00 1.3869539e+01 +765 1.538 3.5562264e+00 1.3765952e+01 +766 1.54 3.5287974e+00 1.3663149e+01 +767 1.542 3.5015733e+00 1.3561123e+01 +768 1.544 3.4745524e+00 1.3459868e+01 +769 1.546 3.4477333e+00 1.3359378e+01 +770 1.548 3.4211144e+00 1.3259646e+01 +771 1.55 3.3946942e+00 1.3160667e+01 +772 1.552 3.3684712e+00 1.3062434e+01 +773 1.554 3.3424440e+00 1.2964941e+01 +774 1.556 3.3166110e+00 1.2868182e+01 +775 1.558 3.2909707e+00 1.2772152e+01 +776 1.56 3.2655219e+00 1.2676845e+01 +777 1.562 3.2402629e+00 1.2582254e+01 +778 1.564 3.2151924e+00 1.2488373e+01 +779 1.566 3.1903089e+00 1.2395199e+01 +780 1.568 3.1656111e+00 1.2302723e+01 +781 1.57 3.1410976e+00 1.2210942e+01 +782 1.572 3.1167669e+00 1.2119849e+01 +783 1.574 3.0926177e+00 1.2029439e+01 +784 1.576 3.0686487e+00 1.1939707e+01 +785 1.578 3.0448584e+00 1.1850647e+01 +786 1.58 3.0212456e+00 1.1762254e+01 +787 1.582 2.9978090e+00 1.1674522e+01 +788 1.584 2.9745471e+00 1.1587446e+01 +789 1.586 2.9514588e+00 1.1501022e+01 +790 1.588 2.9285426e+00 1.1415244e+01 +791 1.59 2.9057974e+00 1.1330107e+01 +792 1.592 2.8832218e+00 1.1245605e+01 +793 1.594 2.8608145e+00 1.1161734e+01 +794 1.596 2.8385744e+00 1.1078490e+01 +795 1.598 2.8165001e+00 1.0995866e+01 +796 1.6 2.7945905e+00 1.0913858e+01 +797 1.602 2.7728443e+00 1.0832462e+01 +798 1.604 2.7512603e+00 1.0751672e+01 +799 1.606 2.7298372e+00 1.0671484e+01 +800 1.608 2.7085739e+00 1.0591893e+01 +801 1.61 2.6874692e+00 1.0512895e+01 +802 1.612 2.6665220e+00 1.0434484e+01 +803 1.614 2.6457309e+00 1.0356657e+01 +804 1.616 2.6250950e+00 1.0279408e+01 +805 1.618 2.6046129e+00 1.0202734e+01 +806 1.62 2.5842836e+00 1.0126629e+01 +807 1.622 2.5641060e+00 1.0051090e+01 +808 1.624 2.5440789e+00 9.9761122e+00 +809 1.626 2.5242012e+00 9.9016908e+00 +810 1.628 2.5044718e+00 9.8278217e+00 +811 1.63 2.4848895e+00 9.7545009e+00 +812 1.632 2.4654534e+00 9.6817239e+00 +813 1.634 2.4461623e+00 9.6094867e+00 +814 1.636 2.4270151e+00 9.5377850e+00 +815 1.638 2.4080108e+00 9.4666148e+00 +816 1.64 2.3891483e+00 9.3959720e+00 +817 1.642 2.3704266e+00 9.3258525e+00 +818 1.644 2.3518445e+00 9.2562523e+00 +819 1.646 2.3334012e+00 9.1871675e+00 +820 1.648 2.3150955e+00 9.1185941e+00 +821 1.65 2.2969265e+00 9.0505283e+00 +822 1.652 2.2788931e+00 8.9829660e+00 +823 1.654 2.2609943e+00 8.9159035e+00 +824 1.656 2.2432291e+00 8.8493371e+00 +825 1.658 2.2255966e+00 8.7832628e+00 +826 1.66 2.2080958e+00 8.7176769e+00 +827 1.662 2.1907256e+00 8.6525758e+00 +828 1.664 2.1734851e+00 8.5879558e+00 +829 1.666 2.1563734e+00 8.5238132e+00 +830 1.668 2.1393896e+00 8.4601443e+00 +831 1.67 2.1225326e+00 8.3969456e+00 +832 1.672 2.1058015e+00 8.3342136e+00 +833 1.674 2.0891954e+00 8.2719446e+00 +834 1.676 2.0727134e+00 8.2101352e+00 +835 1.678 2.0563545e+00 8.1487820e+00 +836 1.68 2.0401180e+00 8.0878814e+00 +837 1.682 2.0240027e+00 8.0274300e+00 +838 1.684 2.0080079e+00 7.9674245e+00 +839 1.686 1.9921327e+00 7.9078615e+00 +840 1.688 1.9763762e+00 7.8487377e+00 +841 1.69 1.9607375e+00 7.7900497e+00 +842 1.692 1.9452157e+00 7.7317943e+00 +843 1.694 1.9298100e+00 7.6739682e+00 +844 1.696 1.9145196e+00 7.6165682e+00 +845 1.698 1.8993435e+00 7.5595911e+00 +846 1.7 1.8842809e+00 7.5030337e+00 +847 1.702 1.8693311e+00 7.4468928e+00 +848 1.704 1.8544931e+00 7.3911654e+00 +849 1.706 1.8397661e+00 7.3358484e+00 +850 1.708 1.8251494e+00 7.2809386e+00 +851 1.71 1.8106421e+00 7.2264330e+00 +852 1.712 1.7962434e+00 7.1723286e+00 +853 1.714 1.7819525e+00 7.1186224e+00 +854 1.716 1.7677686e+00 7.0653115e+00 +855 1.718 1.7536910e+00 7.0123927e+00 +856 1.72 1.7397188e+00 6.9598634e+00 +857 1.722 1.7258513e+00 6.9077204e+00 +858 1.724 1.7120877e+00 6.8559610e+00 +859 1.726 1.6984272e+00 6.8045823e+00 +860 1.728 1.6848691e+00 6.7535814e+00 +861 1.73 1.6714126e+00 6.7029555e+00 +862 1.732 1.6580570e+00 6.6527019e+00 +863 1.734 1.6448016e+00 6.6028178e+00 +864 1.736 1.6316455e+00 6.5533003e+00 +865 1.738 1.6185881e+00 6.5041469e+00 +866 1.74 1.6056287e+00 6.4553548e+00 +867 1.742 1.5927665e+00 6.4069212e+00 +868 1.744 1.5800008e+00 6.3588436e+00 +869 1.746 1.5673309e+00 6.3111193e+00 +870 1.748 1.5547560e+00 6.2637457e+00 +871 1.75 1.5422756e+00 6.2167202e+00 +872 1.752 1.5298889e+00 6.1700401e+00 +873 1.754 1.5175953e+00 6.1237030e+00 +874 1.756 1.5053939e+00 6.0777063e+00 +875 1.758 1.4932842e+00 6.0320475e+00 +876 1.76 1.4812655e+00 5.9867240e+00 +877 1.762 1.4693371e+00 5.9417334e+00 +878 1.764 1.4574983e+00 5.8970732e+00 +879 1.766 1.4457486e+00 5.8527411e+00 +880 1.768 1.4340872e+00 5.8087345e+00 +881 1.77 1.4225134e+00 5.7650510e+00 +882 1.772 1.4110267e+00 5.7216884e+00 +883 1.774 1.3996265e+00 5.6786441e+00 +884 1.776 1.3883119e+00 5.6359158e+00 +885 1.778 1.3770826e+00 5.5935013e+00 +886 1.78 1.3659377e+00 5.5513982e+00 +887 1.782 1.3548768e+00 5.5096042e+00 +888 1.784 1.3438991e+00 5.4681171e+00 +889 1.786 1.3330041e+00 5.4269345e+00 +890 1.788 1.3221912e+00 5.3860542e+00 +891 1.79 1.3114597e+00 5.3454740e+00 +892 1.792 1.3008091e+00 5.3051918e+00 +893 1.794 1.2902387e+00 5.2652052e+00 +894 1.796 1.2797481e+00 5.2255121e+00 +895 1.798 1.2693365e+00 5.1861104e+00 +896 1.8 1.2590034e+00 5.1469979e+00 +897 1.802 1.2487483e+00 5.1081725e+00 +898 1.804 1.2385705e+00 5.0696321e+00 +899 1.806 1.2284696e+00 5.0313746e+00 +900 1.808 1.2184449e+00 4.9933979e+00 +901 1.81 1.2084958e+00 4.9556999e+00 +902 1.812 1.1986219e+00 4.9182787e+00 +903 1.814 1.1888225e+00 4.8811321e+00 +904 1.816 1.1790972e+00 4.8442581e+00 +905 1.818 1.1694453e+00 4.8076549e+00 +906 1.82 1.1598664e+00 4.7713202e+00 +907 1.822 1.1503598e+00 4.7352523e+00 +908 1.824 1.1409252e+00 4.6994492e+00 +909 1.826 1.1315619e+00 4.6639088e+00 +910 1.828 1.1222694e+00 4.6286293e+00 +911 1.83 1.1130472e+00 4.5936088e+00 +912 1.832 1.1038948e+00 4.5588453e+00 +913 1.834 1.0948116e+00 4.5243371e+00 +914 1.836 1.0857972e+00 4.4900821e+00 +915 1.838 1.0768511e+00 4.4560786e+00 +916 1.84 1.0679728e+00 4.4223248e+00 +917 1.842 1.0591617e+00 4.3888187e+00 +918 1.844 1.0504173e+00 4.3555586e+00 +919 1.846 1.0417393e+00 4.3225427e+00 +920 1.848 1.0331270e+00 4.2897692e+00 +921 1.85 1.0245800e+00 4.2572363e+00 +922 1.852 1.0160979e+00 4.2249423e+00 +923 1.854 1.0076801e+00 4.1928854e+00 +924 1.856 9.9932619e-01 4.1610639e+00 +925 1.858 9.9103569e-01 4.1294761e+00 +926 1.86 9.8280814e-01 4.0981203e+00 +927 1.862 9.7464306e-01 4.0669947e+00 +928 1.864 9.6654000e-01 4.0360977e+00 +929 1.866 9.5849852e-01 4.0054276e+00 +930 1.868 9.5051814e-01 3.9749827e+00 +931 1.87 9.4259844e-01 3.9447615e+00 +932 1.872 9.3473895e-01 3.9147623e+00 +933 1.874 9.2693924e-01 3.8849834e+00 +934 1.876 9.1919887e-01 3.8554233e+00 +935 1.878 9.1151740e-01 3.8260803e+00 +936 1.88 9.0389441e-01 3.7969530e+00 +937 1.882 8.9632945e-01 3.7680396e+00 +938 1.884 8.8882211e-01 3.7393387e+00 +939 1.886 8.8137195e-01 3.7108486e+00 +940 1.888 8.7397857e-01 3.6825680e+00 +941 1.89 8.6664154e-01 3.6544951e+00 +942 1.892 8.5936045e-01 3.6266286e+00 +943 1.894 8.5213489e-01 3.5989669e+00 +944 1.896 8.4496445e-01 3.5715085e+00 +945 1.898 8.3784872e-01 3.5442520e+00 +946 1.9 8.3078731e-01 3.5171958e+00 +947 1.902 8.2377981e-01 3.4903385e+00 +948 1.904 8.1682582e-01 3.4636787e+00 +949 1.906 8.0992496e-01 3.4372149e+00 +950 1.908 8.0307683e-01 3.4109457e+00 +951 1.91 7.9628105e-01 3.3848697e+00 +952 1.912 7.8953723e-01 3.3589855e+00 +953 1.914 7.8284498e-01 3.3332916e+00 +954 1.916 7.7620393e-01 3.3077868e+00 +955 1.918 7.6961371e-01 3.2824695e+00 +956 1.92 7.6307393e-01 3.2573385e+00 +957 1.922 7.5658423e-01 3.2323925e+00 +958 1.924 7.5014424e-01 3.2076299e+00 +959 1.926 7.4375359e-01 3.1830496e+00 +960 1.928 7.3741192e-01 3.1586501e+00 +961 1.93 7.3111887e-01 3.1344303e+00 +962 1.932 7.2487408e-01 3.1103887e+00 +963 1.934 7.1867720e-01 3.0865240e+00 +964 1.936 7.1252787e-01 3.0628351e+00 +965 1.938 7.0642574e-01 3.0393206e+00 +966 1.94 7.0037047e-01 3.0159792e+00 +967 1.942 6.9436171e-01 2.9928097e+00 +968 1.944 6.8839912e-01 2.9698108e+00 +969 1.946 6.8248235e-01 2.9469813e+00 +970 1.948 6.7661108e-01 2.9243200e+00 +971 1.95 6.7078496e-01 2.9018256e+00 +972 1.952 6.6500367e-01 2.8794969e+00 +973 1.954 6.5926686e-01 2.8573328e+00 +974 1.956 6.5357423e-01 2.8353319e+00 +975 1.958 6.4792543e-01 2.8134933e+00 +976 1.96 6.4232015e-01 2.7918155e+00 +977 1.962 6.3675806e-01 2.7702976e+00 +978 1.964 6.3123885e-01 2.7489383e+00 +979 1.966 6.2576220e-01 2.7277365e+00 +980 1.968 6.2032780e-01 2.7066910e+00 +981 1.97 6.1493533e-01 2.6858007e+00 +982 1.972 6.0958450e-01 2.6650644e+00 +983 1.974 6.0427497e-01 2.6444812e+00 +984 1.976 5.9900647e-01 2.6240497e+00 +985 1.978 5.9377868e-01 2.6037690e+00 +986 1.98 5.8859129e-01 2.5836379e+00 +987 1.982 5.8344402e-01 2.5636554e+00 +988 1.984 5.7833657e-01 2.5438204e+00 +989 1.986 5.7326865e-01 2.5241318e+00 +990 1.988 5.6823995e-01 2.5045885e+00 +991 1.99 5.6325020e-01 2.4851895e+00 +992 1.992 5.5829910e-01 2.4659337e+00 +993 1.994 5.5338637e-01 2.4468202e+00 +994 1.996 5.4851172e-01 2.4278478e+00 +995 1.998 5.4367488e-01 2.4090155e+00 +996 2.0 5.3887557e-01 2.3903224e+00 +997 2.002 5.3411350e-01 2.3717674e+00 +998 2.004 5.2938841e-01 2.3533495e+00 +999 2.006 5.2470001e-01 2.3350677e+00 +1000 2.008 5.2004804e-01 2.3169211e+00 +1001 2.01 5.1543224e-01 2.2989085e+00 +1002 2.012 5.1085232e-01 2.2810292e+00 +1003 2.014 5.0630803e-01 2.2632821e+00 +1004 2.016 5.0179911e-01 2.2456662e+00 +1005 2.018 4.9732528e-01 2.2281806e+00 +1006 2.02 4.9288630e-01 2.2108244e+00 +1007 2.022 4.8848190e-01 2.1935965e+00 +1008 2.024 4.8411183e-01 2.1764962e+00 +1009 2.026 4.7977583e-01 2.1595224e+00 +1010 2.028 4.7547365e-01 2.1426742e+00 +1011 2.03 4.7120505e-01 2.1259507e+00 +1012 2.032 4.6696977e-01 2.1093511e+00 +1013 2.034 4.6276756e-01 2.0928744e+00 +1014 2.036 4.5859819e-01 2.0765197e+00 +1015 2.038 4.5446140e-01 2.0602861e+00 +1016 2.04 4.5035696e-01 2.0441728e+00 +1017 2.042 4.4628463e-01 2.0281789e+00 +1018 2.044 4.4224417e-01 2.0123035e+00 +1019 2.046 4.3823534e-01 1.9965458e+00 +1020 2.048 4.3425791e-01 1.9809048e+00 +1021 2.05 4.3031164e-01 1.9653799e+00 +1022 2.052 4.2639631e-01 1.9499700e+00 +1023 2.054 4.2251169e-01 1.9346744e+00 +1024 2.056 4.1865754e-01 1.9194923e+00 +1025 2.058 4.1483364e-01 1.9044228e+00 +1026 2.06 4.1103977e-01 1.8894651e+00 +1027 2.062 4.0727571e-01 1.8746184e+00 +1028 2.064 4.0354123e-01 1.8598819e+00 +1029 2.066 3.9983611e-01 1.8452548e+00 +1030 2.068 3.9616013e-01 1.8307363e+00 +1031 2.07 3.9251309e-01 1.8163256e+00 +1032 2.072 3.8889476e-01 1.8020219e+00 +1033 2.074 3.8530493e-01 1.7878245e+00 +1034 2.076 3.8174339e-01 1.7737325e+00 +1035 2.078 3.7820993e-01 1.7597453e+00 +1036 2.08 3.7470434e-01 1.7458620e+00 +1037 2.082 3.7122642e-01 1.7320819e+00 +1038 2.084 3.6777595e-01 1.7184042e+00 +1039 2.086 3.6435273e-01 1.7048283e+00 +1040 2.088 3.6095657e-01 1.6913533e+00 +1041 2.09 3.5758725e-01 1.6779785e+00 +1042 2.092 3.5424459e-01 1.6647033e+00 +1043 2.094 3.5092837e-01 1.6515268e+00 +1044 2.096 3.4763841e-01 1.6384484e+00 +1045 2.098 3.4437451e-01 1.6254674e+00 +1046 2.1 3.4113648e-01 1.6125830e+00 +1047 2.102 3.3792412e-01 1.5997945e+00 +1048 2.104 3.3473724e-01 1.5871013e+00 +1049 2.106 3.3157565e-01 1.5745026e+00 +1050 2.108 3.2843916e-01 1.5619978e+00 +1051 2.11 3.2532760e-01 1.5495862e+00 +1052 2.112 3.2224076e-01 1.5372671e+00 +1053 2.114 3.1917847e-01 1.5250398e+00 +1054 2.116 3.1614054e-01 1.5129037e+00 +1055 2.118 3.1312679e-01 1.5008581e+00 +1056 2.12 3.1013705e-01 1.4889023e+00 +1057 2.122 3.0717112e-01 1.4770358e+00 +1058 2.124 3.0422884e-01 1.4652578e+00 +1059 2.126 3.0131003e-01 1.4535676e+00 +1060 2.128 2.9841451e-01 1.4419648e+00 +1061 2.13 2.9554212e-01 1.4304486e+00 +1062 2.132 2.9269266e-01 1.4190184e+00 +1063 2.134 2.8986599e-01 1.4076735e+00 +1064 2.136 2.8706191e-01 1.3964134e+00 +1065 2.138 2.8428028e-01 1.3852375e+00 +1066 2.14 2.8152091e-01 1.3741451e+00 +1067 2.142 2.7878364e-01 1.3631356e+00 +1068 2.144 2.7606831e-01 1.3522084e+00 +1069 2.146 2.7337475e-01 1.3413629e+00 +1070 2.148 2.7070280e-01 1.3305986e+00 +1071 2.15 2.6805230e-01 1.3199148e+00 +1072 2.152 2.6542309e-01 1.3093109e+00 +1073 2.154 2.6281501e-01 1.2987864e+00 +1074 2.156 2.6022789e-01 1.2883407e+00 +1075 2.158 2.5766159e-01 1.2779732e+00 +1076 2.16 2.5511595e-01 1.2676834e+00 +1077 2.162 2.5259081e-01 1.2574706e+00 +1078 2.164 2.5008601e-01 1.2473344e+00 +1079 2.166 2.4760142e-01 1.2372741e+00 +1080 2.168 2.4513687e-01 1.2272893e+00 +1081 2.17 2.4269221e-01 1.2173793e+00 +1082 2.172 2.4026730e-01 1.2075436e+00 +1083 2.174 2.3786199e-01 1.1977817e+00 +1084 2.176 2.3547613e-01 1.1880931e+00 +1085 2.178 2.3310957e-01 1.1784771e+00 +1086 2.18 2.3076217e-01 1.1689334e+00 +1087 2.182 2.2843379e-01 1.1594612e+00 +1088 2.184 2.2612428e-01 1.1500603e+00 +1089 2.186 2.2383350e-01 1.1407299e+00 +1090 2.188 2.2156131e-01 1.1314696e+00 +1091 2.19 2.1930757e-01 1.1222789e+00 +1092 2.192 2.1707215e-01 1.1131573e+00 +1093 2.194 2.1485490e-01 1.1041043e+00 +1094 2.196 2.1265569e-01 1.0951194e+00 +1095 2.198 2.1047438e-01 1.0862020e+00 +1096 2.2 2.0831083e-01 1.0773518e+00 +1097 2.202 2.0616492e-01 1.0685681e+00 +1098 2.204 2.0403652e-01 1.0598505e+00 +1099 2.206 2.0192548e-01 1.0511986e+00 +1100 2.208 1.9983168e-01 1.0426119e+00 +1101 2.21 1.9775499e-01 1.0340898e+00 +1102 2.212 1.9569528e-01 1.0256320e+00 +1103 2.214 1.9365242e-01 1.0172378e+00 +1104 2.216 1.9162628e-01 1.0089070e+00 +1105 2.218 1.8961675e-01 1.0006390e+00 +1106 2.22 1.8762369e-01 9.9243332e-01 +1107 2.222 1.8564697e-01 9.8428956e-01 +1108 2.224 1.8368649e-01 9.7620725e-01 +1109 2.226 1.8174210e-01 9.6818596e-01 +1110 2.228 1.7981370e-01 9.6022522e-01 +1111 2.23 1.7790116e-01 9.5232459e-01 +1112 2.232 1.7600436e-01 9.4448365e-01 +1113 2.234 1.7412319e-01 9.3670196e-01 +1114 2.236 1.7225752e-01 9.2897907e-01 +1115 2.238 1.7040723e-01 9.2131457e-01 +1116 2.24 1.6857222e-01 9.1370802e-01 +1117 2.242 1.6675236e-01 9.0615901e-01 +1118 2.244 1.6494755e-01 8.9866711e-01 +1119 2.246 1.6315766e-01 8.9123191e-01 +1120 2.248 1.6138258e-01 8.8385299e-01 +1121 2.25 1.5962221e-01 8.7652994e-01 +1122 2.252 1.5787642e-01 8.6926236e-01 +1123 2.254 1.5614512e-01 8.6204984e-01 +1124 2.256 1.5442819e-01 8.5489197e-01 +1125 2.258 1.5272552e-01 8.4778836e-01 +1126 2.26 1.5103700e-01 8.4073862e-01 +1127 2.262 1.4936253e-01 8.3374234e-01 +1128 2.264 1.4770199e-01 8.2679914e-01 +1129 2.266 1.4605530e-01 8.1990863e-01 +1130 2.268 1.4442232e-01 8.1307042e-01 +1131 2.27 1.4280298e-01 8.0628413e-01 +1132 2.272 1.4119715e-01 7.9954939e-01 +1133 2.274 1.3960475e-01 7.9286581e-01 +1134 2.276 1.3802566e-01 7.8623303e-01 +1135 2.278 1.3645978e-01 7.7965066e-01 +1136 2.28 1.3490702e-01 7.7311835e-01 +1137 2.282 1.3336727e-01 7.6663572e-01 +1138 2.284 1.3184044e-01 7.6020242e-01 +1139 2.286 1.3032643e-01 7.5381807e-01 +1140 2.288 1.2882514e-01 7.4748233e-01 +1141 2.29 1.2733647e-01 7.4119484e-01 +1142 2.292 1.2586033e-01 7.3495524e-01 +1143 2.294 1.2439662e-01 7.2876319e-01 +1144 2.296 1.2294524e-01 7.2261833e-01 +1145 2.298 1.2150611e-01 7.1652032e-01 +1146 2.3 1.2007913e-01 7.1046882e-01 +1147 2.302 1.1866421e-01 7.0446349e-01 +1148 2.304 1.1726125e-01 6.9850399e-01 +1149 2.306 1.1587016e-01 6.9258998e-01 +1150 2.308 1.1449086e-01 6.8672113e-01 +1151 2.31 1.1312325e-01 6.8089711e-01 +1152 2.312 1.1176724e-01 6.7511759e-01 +1153 2.314 1.1042275e-01 6.6938225e-01 +1154 2.316 1.0908968e-01 6.6369075e-01 +1155 2.318 1.0776796e-01 6.5804279e-01 +1156 2.32 1.0645748e-01 6.5243804e-01 +1157 2.322 1.0515817e-01 6.4687618e-01 +1158 2.324 1.0386995e-01 6.4135690e-01 +1159 2.326 1.0259272e-01 6.3587989e-01 +1160 2.328 1.0132640e-01 6.3044484e-01 +1161 2.33 1.0007091e-01 6.2505143e-01 +1162 2.332 9.8826168e-02 6.1969937e-01 +1163 2.334 9.7592087e-02 6.1438835e-01 +1164 2.336 9.6368587e-02 6.0911807e-01 +1165 2.338 9.5155588e-02 6.0388823e-01 +1166 2.34 9.3953007e-02 5.9869854e-01 +1167 2.342 9.2760767e-02 5.9354869e-01 +1168 2.344 9.1578786e-02 5.8843840e-01 +1169 2.346 9.0406987e-02 5.8336738e-01 +1170 2.348 8.9245291e-02 5.7833533e-01 +1171 2.35 8.8093620e-02 5.7334198e-01 +1172 2.352 8.6951897e-02 5.6838703e-01 +1173 2.354 8.5820046e-02 5.6347021e-01 +1174 2.356 8.4697991e-02 5.5859123e-01 +1175 2.358 8.3585656e-02 5.5374982e-01 +1176 2.36 8.2482967e-02 5.4894570e-01 +1177 2.362 8.1389849e-02 5.4417860e-01 +1178 2.364 8.0306228e-02 5.3944825e-01 +1179 2.366 7.9232032e-02 5.3475436e-01 +1180 2.368 7.8167187e-02 5.3009669e-01 +1181 2.37 7.7111621e-02 5.2547495e-01 +1182 2.372 7.6065263e-02 5.2088889e-01 +1183 2.374 7.5028042e-02 5.1633824e-01 +1184 2.376 7.3999887e-02 5.1182275e-01 +1185 2.378 7.2980727e-02 5.0734215e-01 +1186 2.38 7.1970495e-02 5.0289619e-01 +1187 2.382 7.0969120e-02 4.9848460e-01 +1188 2.384 6.9976534e-02 4.9410715e-01 +1189 2.386 6.8992669e-02 4.8976358e-01 +1190 2.388 6.8017457e-02 4.8545363e-01 +1191 2.39 6.7050832e-02 4.8117707e-01 +1192 2.392 6.6092727e-02 4.7693363e-01 +1193 2.394 6.5143075e-02 4.7272309e-01 +1194 2.396 6.4201813e-02 4.6854520e-01 +1195 2.398 6.3268873e-02 4.6439972e-01 +1196 2.4 6.2344192e-02 4.6028640e-01 +1197 2.402 6.1427706e-02 4.5620502e-01 +1198 2.404 6.0519351e-02 4.5215533e-01 +1199 2.406 5.9619064e-02 4.4813710e-01 +1200 2.408 5.8726782e-02 4.4415010e-01 +1201 2.41 5.7842443e-02 4.4019411e-01 +1202 2.412 5.6965985e-02 4.3626888e-01 +1203 2.414 5.6097347e-02 4.3237420e-01 +1204 2.416 5.5236468e-02 4.2850984e-01 +1205 2.418 5.4383287e-02 4.2467557e-01 +1206 2.42 5.3537746e-02 4.2087117e-01 +1207 2.422 5.2699783e-02 4.1709643e-01 +1208 2.424 5.1869340e-02 4.1335112e-01 +1209 2.426 5.1046359e-02 4.0963502e-01 +1210 2.428 5.0230781e-02 4.0594792e-01 +1211 2.43 4.9422548e-02 4.0228961e-01 +1212 2.432 4.8621603e-02 3.9865988e-01 +1213 2.434 4.7827890e-02 3.9505850e-01 +1214 2.436 4.7041351e-02 3.9148527e-01 +1215 2.438 4.6261930e-02 3.8793999e-01 +1216 2.44 4.5489572e-02 3.8442245e-01 +1217 2.442 4.4724222e-02 3.8093244e-01 +1218 2.444 4.3965824e-02 3.7746975e-01 +1219 2.446 4.3214325e-02 3.7403419e-01 +1220 2.448 4.2469669e-02 3.7062556e-01 +1221 2.45 4.1731805e-02 3.6724365e-01 +1222 2.452 4.1000677e-02 3.6388827e-01 +1223 2.454 4.0276234e-02 3.6055922e-01 +1224 2.456 3.9558423e-02 3.5725631e-01 +1225 2.458 3.8847192e-02 3.5397934e-01 +1226 2.46 3.8142488e-02 3.5072813e-01 +1227 2.462 3.7444262e-02 3.4750247e-01 +1228 2.464 3.6752462e-02 3.4430218e-01 +1229 2.466 3.6067036e-02 3.4112707e-01 +1230 2.468 3.5387937e-02 3.3797696e-01 +1231 2.47 3.4715112e-02 3.3485166e-01 +1232 2.472 3.4048514e-02 3.3175099e-01 +1233 2.474 3.3388092e-02 3.2867476e-01 +1234 2.476 3.2733798e-02 3.2562279e-01 +1235 2.478 3.2085585e-02 3.2259490e-01 +1236 2.48 3.1443403e-02 3.1959092e-01 +1237 2.482 3.0807205e-02 3.1661067e-01 +1238 2.484 3.0176944e-02 3.1365396e-01 +1239 2.486 2.9552574e-02 3.1072063e-01 +1240 2.488 2.8934046e-02 3.0781049e-01 +1241 2.49 2.8321316e-02 3.0492339e-01 +1242 2.492 2.7714338e-02 3.0205915e-01 +1243 2.494 2.7113065e-02 2.9921759e-01 +1244 2.496 2.6517452e-02 2.9639855e-01 +1245 2.498 2.5927456e-02 2.9360187e-01 +1246 2.5 2.5343030e-02 2.9082737e-01 +1247 2.502 2.4764131e-02 2.8807489e-01 +1248 2.504 2.4190716e-02 2.8534426e-01 +1249 2.506 2.3622740e-02 2.8263533e-01 +1250 2.508 2.3060160e-02 2.7994793e-01 +1251 2.51 2.2502934e-02 2.7728191e-01 +1252 2.512 2.1951018e-02 2.7463709e-01 +1253 2.514 2.1404371e-02 2.7201334e-01 +1254 2.516 2.0862951e-02 2.6941048e-01 +1255 2.518 2.0326716e-02 2.6682836e-01 +1256 2.52 1.9795624e-02 2.6426683e-01 +1257 2.522 1.9269635e-02 2.6172574e-01 +1258 2.524 1.8748708e-02 2.5920492e-01 +1259 2.526 1.8232802e-02 2.5670424e-01 +1260 2.528 1.7721877e-02 2.5422354e-01 +1261 2.53 1.7215894e-02 2.5176267e-01 +1262 2.532 1.6714813e-02 2.4932148e-01 +1263 2.534 1.6218595e-02 2.4689983e-01 +1264 2.536 1.5727201e-02 2.4449757e-01 +1265 2.538 1.5240592e-02 2.4211456e-01 +1266 2.54 1.4758730e-02 2.3975065e-01 +1267 2.542 1.4281577e-02 2.3740570e-01 +1268 2.544 1.3809095e-02 2.3507956e-01 +1269 2.546 1.3341246e-02 2.3277210e-01 +1270 2.548 1.2877994e-02 2.3048319e-01 +1271 2.55 1.2419301e-02 2.2821267e-01 +1272 2.552 1.1965131e-02 2.2596041e-01 +1273 2.554 1.1515448e-02 2.2372627e-01 +1274 2.556 1.1070214e-02 2.2151013e-01 +1275 2.558 1.0629395e-02 2.1931184e-01 +1276 2.56 1.0192955e-02 2.1713127e-01 +1277 2.562 9.7608584e-03 2.1496829e-01 +1278 2.564 9.3330702e-03 2.1282277e-01 +1279 2.566 8.9095558e-03 2.1069457e-01 +1280 2.568 8.4902805e-03 2.0858356e-01 +1281 2.57 8.0752101e-03 2.0648963e-01 +1282 2.572 7.6643107e-03 2.0441263e-01 +1283 2.574 7.2575484e-03 2.0235245e-01 +1284 2.576 6.8548898e-03 2.0030895e-01 +1285 2.578 6.4563015e-03 1.9828201e-01 +1286 2.58 6.0617507e-03 1.9627151e-01 +1287 2.582 5.6712046e-03 1.9427733e-01 +1288 2.584 5.2846306e-03 1.9229933e-01 +1289 2.586 4.9019966e-03 1.9033740e-01 +1290 2.588 4.5232704e-03 1.8839142e-01 +1291 2.59 4.1484203e-03 1.8646127e-01 +1292 2.592 3.7774148e-03 1.8454683e-01 +1293 2.594 3.4102226e-03 1.8264799e-01 +1294 2.596 3.0468126e-03 1.8076461e-01 +1295 2.598 2.6871539e-03 1.7889660e-01 +1296 2.6 2.3312160e-03 1.7704382e-01 +1297 2.602 1.9789685e-03 1.7520618e-01 +1298 2.604 1.6303813e-03 1.7338355e-01 +1299 2.606 1.2854244e-03 1.7157582e-01 +1300 2.608 9.4406815e-04 1.6978288e-01 +1301 2.61 6.0628309e-04 1.6800462e-01 +1302 2.612 2.7203998e-04 1.6624092e-01 +1303 2.614 -5.8690223e-05 1.6449168e-01 +1304 2.616 -3.8593631e-04 1.6275679e-01 +1305 2.618 -7.0972687e-04 1.6103614e-01 +1306 2.62 -1.0300903e-03 1.5932962e-01 +1307 2.622 -1.3470547e-03 1.5763713e-01 +1308 2.624 -1.6606481e-03 1.5595856e-01 +1309 2.626 -1.9708981e-03 1.5429380e-01 +1310 2.628 -2.2778324e-03 1.5264275e-01 +1311 2.63 -2.5814782e-03 1.5100532e-01 +1312 2.632 -2.8818627e-03 1.4938138e-01 +1313 2.634 -3.1790127e-03 1.4777085e-01 +1314 2.636 -3.4729550e-03 1.4617362e-01 +1315 2.638 -3.7637160e-03 1.4458959e-01 +1316 2.64 -4.0513221e-03 1.4301866e-01 +1317 2.642 -4.3357993e-03 1.4146074e-01 +1318 2.644 -4.6171736e-03 1.3991571e-01 +1319 2.646 -4.8954707e-03 1.3838350e-01 +1320 2.648 -5.1707161e-03 1.3686399e-01 +1321 2.65 -5.4429351e-03 1.3535709e-01 +1322 2.652 -5.7121528e-03 1.3386271e-01 +1323 2.654 -5.9783942e-03 1.3238076e-01 +1324 2.656 -6.2416840e-03 1.3091113e-01 +1325 2.658 -6.5020469e-03 1.2945374e-01 +1326 2.66 -6.7595071e-03 1.2800848e-01 +1327 2.662 -7.0140889e-03 1.2657528e-01 +1328 2.664 -7.2658162e-03 1.2515404e-01 +1329 2.666 -7.5147129e-03 1.2374466e-01 +1330 2.668 -7.7608027e-03 1.2234706e-01 +1331 2.67 -8.0041090e-03 1.2096115e-01 +1332 2.672 -8.2446550e-03 1.1958684e-01 +1333 2.674 -8.4824640e-03 1.1822404e-01 +1334 2.676 -8.7175588e-03 1.1687267e-01 +1335 2.678 -8.9499622e-03 1.1553263e-01 +1336 2.68 -9.1796968e-03 1.1420384e-01 +1337 2.682 -9.4067850e-03 1.1288621e-01 +1338 2.684 -9.6312491e-03 1.1157967e-01 +1339 2.686 -9.8531110e-03 1.1028412e-01 +1340 2.688 -1.0072393e-02 1.0899949e-01 +1341 2.69 -1.0289116e-02 1.0772568e-01 +1342 2.692 -1.0503303e-02 1.0646262e-01 +1343 2.694 -1.0714974e-02 1.0521022e-01 +1344 2.696 -1.0924151e-02 1.0396841e-01 +1345 2.698 -1.1130854e-02 1.0273710e-01 +1346 2.7 -1.1335106e-02 1.0151621e-01 +1347 2.702 -1.1536926e-02 1.0030566e-01 +1348 2.704 -1.1736335e-02 9.9105378e-02 +1349 2.706 -1.1933354e-02 9.7915281e-02 +1350 2.708 -1.2128003e-02 9.6735292e-02 +1351 2.71 -1.2320302e-02 9.5565333e-02 +1352 2.712 -1.2510271e-02 9.4405328e-02 +1353 2.714 -1.2697930e-02 9.3255201e-02 +1354 2.716 -1.2883299e-02 9.2114875e-02 +1355 2.718 -1.3066396e-02 9.0984277e-02 +1356 2.72 -1.3247242e-02 8.9863331e-02 +1357 2.722 -1.3425856e-02 8.8751964e-02 +1358 2.724 -1.3602256e-02 8.7650102e-02 +1359 2.726 -1.3776463e-02 8.6557673e-02 +1360 2.728 -1.3948493e-02 8.5474604e-02 +1361 2.73 -1.4118367e-02 8.4400824e-02 +1362 2.732 -1.4286103e-02 8.3336261e-02 +1363 2.734 -1.4451718e-02 8.2280844e-02 +1364 2.736 -1.4615232e-02 8.1234504e-02 +1365 2.738 -1.4776662e-02 8.0197170e-02 +1366 2.74 -1.4936027e-02 7.9168774e-02 +1367 2.742 -1.5093343e-02 7.8149247e-02 +1368 2.744 -1.5248630e-02 7.7138520e-02 +1369 2.746 -1.5401903e-02 7.6136527e-02 +1370 2.748 -1.5553182e-02 7.5143199e-02 +1371 2.75 -1.5702482e-02 7.4158470e-02 +1372 2.752 -1.5849821e-02 7.3182275e-02 +1373 2.754 -1.5995217e-02 7.2214547e-02 +1374 2.756 -1.6138685e-02 7.1255221e-02 +1375 2.758 -1.6280243e-02 7.0304232e-02 +1376 2.76 -1.6419907e-02 6.9361517e-02 +1377 2.762 -1.6557695e-02 6.8427011e-02 +1378 2.764 -1.6693621e-02 6.7500650e-02 +1379 2.766 -1.6827702e-02 6.6582373e-02 +1380 2.768 -1.6959956e-02 6.5672117e-02 +1381 2.77 -1.7090396e-02 6.4769820e-02 +1382 2.772 -1.7219040e-02 6.3875420e-02 +1383 2.774 -1.7345903e-02 6.2988857e-02 +1384 2.776 -1.7471001e-02 6.2110069e-02 +1385 2.778 -1.7594349e-02 6.1238997e-02 +1386 2.78 -1.7715962e-02 6.0375581e-02 +1387 2.782 -1.7835856e-02 5.9519762e-02 +1388 2.784 -1.7954046e-02 5.8671480e-02 +1389 2.786 -1.8070547e-02 5.7830678e-02 +1390 2.788 -1.8185374e-02 5.6997298e-02 +1391 2.79 -1.8298541e-02 5.6171282e-02 +1392 2.792 -1.8410064e-02 5.5352573e-02 +1393 2.794 -1.8519956e-02 5.4541114e-02 +1394 2.796 -1.8628233e-02 5.3736849e-02 +1395 2.798 -1.8734908e-02 5.2939723e-02 +1396 2.8 -1.8839997e-02 5.2149679e-02 +1397 2.802 -1.8943512e-02 5.1366663e-02 +1398 2.804 -1.9045468e-02 5.0590620e-02 +1399 2.806 -1.9145879e-02 4.9821496e-02 +1400 2.808 -1.9244758e-02 4.9059237e-02 +1401 2.81 -1.9342120e-02 4.8303789e-02 +1402 2.812 -1.9437978e-02 4.7555101e-02 +1403 2.814 -1.9532345e-02 4.6813118e-02 +1404 2.816 -1.9625235e-02 4.6077789e-02 +1405 2.818 -1.9716661e-02 4.5349062e-02 +1406 2.82 -1.9806636e-02 4.4626886e-02 +1407 2.822 -1.9895173e-02 4.3911208e-02 +1408 2.824 -1.9982285e-02 4.3201980e-02 +1409 2.826 -2.0067985e-02 4.2499149e-02 +1410 2.828 -2.0152286e-02 4.1802667e-02 +1411 2.83 -2.0235200e-02 4.1112484e-02 +1412 2.832 -2.0316740e-02 4.0428550e-02 +1413 2.834 -2.0396918e-02 3.9750816e-02 +1414 2.836 -2.0475747e-02 3.9079235e-02 +1415 2.838 -2.0553239e-02 3.8413758e-02 +1416 2.84 -2.0629406e-02 3.7754336e-02 +1417 2.842 -2.0704260e-02 3.7100923e-02 +1418 2.844 -2.0777814e-02 3.6453472e-02 +1419 2.846 -2.0850078e-02 3.5811936e-02 +1420 2.848 -2.0921065e-02 3.5176268e-02 +1421 2.85 -2.0990787e-02 3.4546422e-02 +1422 2.852 -2.1059255e-02 3.3922353e-02 +1423 2.854 -2.1126480e-02 3.3304015e-02 +1424 2.856 -2.1192475e-02 3.2691363e-02 +1425 2.858 -2.1257250e-02 3.2084353e-02 +1426 2.86 -2.1320816e-02 3.1482940e-02 +1427 2.862 -2.1383185e-02 3.0887080e-02 +1428 2.864 -2.1444368e-02 3.0296730e-02 +1429 2.866 -2.1504376e-02 2.9711845e-02 +1430 2.868 -2.1563219e-02 2.9132384e-02 +1431 2.87 -2.1620909e-02 2.8558302e-02 +1432 2.872 -2.1677456e-02 2.7989558e-02 +1433 2.874 -2.1732870e-02 2.7426110e-02 +1434 2.876 -2.1787164e-02 2.6867915e-02 +1435 2.878 -2.1840346e-02 2.6314933e-02 +1436 2.88 -2.1892427e-02 2.5767121e-02 +1437 2.882 -2.1943417e-02 2.5224440e-02 +1438 2.884 -2.1993328e-02 2.4686849e-02 +1439 2.886 -2.2042168e-02 2.4154306e-02 +1440 2.888 -2.2089949e-02 2.3626773e-02 +1441 2.89 -2.2136679e-02 2.3104210e-02 +1442 2.892 -2.2182369e-02 2.2586577e-02 +1443 2.894 -2.2227028e-02 2.2073835e-02 +1444 2.896 -2.2270667e-02 2.1565945e-02 +1445 2.898 -2.2313295e-02 2.1062869e-02 +1446 2.9 -2.2354922e-02 2.0564569e-02 +1447 2.902 -2.2395557e-02 2.0071006e-02 +1448 2.904 -2.2435209e-02 1.9582144e-02 +1449 2.906 -2.2473888e-02 1.9097944e-02 +1450 2.908 -2.2511604e-02 1.8618369e-02 +1451 2.91 -2.2548365e-02 1.8143383e-02 +1452 2.912 -2.2584180e-02 1.7672949e-02 +1453 2.914 -2.2619060e-02 1.7207031e-02 +1454 2.916 -2.2653012e-02 1.6745592e-02 +1455 2.918 -2.2686045e-02 1.6288598e-02 +1456 2.92 -2.2718169e-02 1.5836012e-02 +1457 2.922 -2.2749392e-02 1.5387799e-02 +1458 2.924 -2.2779723e-02 1.4943925e-02 +1459 2.926 -2.2809171e-02 1.4504355e-02 +1460 2.928 -2.2837743e-02 1.4069053e-02 +1461 2.93 -2.2865450e-02 1.3637987e-02 +1462 2.932 -2.2892298e-02 1.3211122e-02 +1463 2.934 -2.2918297e-02 1.2788425e-02 +1464 2.936 -2.2943454e-02 1.2369861e-02 +1465 2.938 -2.2967779e-02 1.1955399e-02 +1466 2.94 -2.2991279e-02 1.1545004e-02 +1467 2.942 -2.3013962e-02 1.1138645e-02 +1468 2.944 -2.3035836e-02 1.0736288e-02 +1469 2.946 -2.3056910e-02 1.0337903e-02 +1470 2.948 -2.3077190e-02 9.9434556e-03 +1471 2.95 -2.3096686e-02 9.5529157e-03 +1472 2.952 -2.3115404e-02 9.1662513e-03 +1473 2.954 -2.3133354e-02 8.7834313e-03 +1474 2.956 -2.3150541e-02 8.4044245e-03 +1475 2.958 -2.3166974e-02 8.0292004e-03 +1476 2.96 -2.3182660e-02 7.6577282e-03 +1477 2.962 -2.3197607e-02 7.2899778e-03 +1478 2.964 -2.3211822e-02 6.9259190e-03 +1479 2.966 -2.3225313e-02 6.5655219e-03 +1480 2.968 -2.3238087e-02 6.2087570e-03 +1481 2.97 -2.3250151e-02 5.8555948e-03 +1482 2.972 -2.3261512e-02 5.5060062e-03 +1483 2.974 -2.3272177e-02 5.1599621e-03 +1484 2.976 -2.3282154e-02 4.8174338e-03 +1485 2.978 -2.3291449e-02 4.4783928e-03 +1486 2.98 -2.3300070e-02 4.1428107e-03 +1487 2.982 -2.3308023e-02 3.8106595e-03 +1488 2.984 -2.3315315e-02 3.4819112e-03 +1489 2.986 -2.3321953e-02 3.1565381e-03 +1490 2.988 -2.3327943e-02 2.8345128e-03 +1491 2.99 -2.3333293e-02 2.5158079e-03 +1492 2.992 -2.3338008e-02 2.2003965e-03 +1493 2.994 -2.3342097e-02 1.8882516e-03 +1494 2.996 -2.3345564e-02 1.5793465e-03 +1495 2.998 -2.3348416e-02 1.2736549e-03 +1496 3.0 -2.3350660e-02 9.7115039e-04 +1497 3.002 -2.3352303e-02 6.7180695e-04 +1498 3.004 -2.3353350e-02 3.7559871e-04 +1499 3.006 -2.3353807e-02 8.2499984e-05 +1500 3.008 -2.3353682e-02 -2.0751471e-04 +1501 3.01 -2.3352979e-02 -4.9447067e-04 +1502 3.012 -2.3351706e-02 -7.7839299e-04 +1503 3.014 -2.3349868e-02 -1.0593066e-03 +1504 3.016 -2.3347471e-02 -1.3372362e-03 +1505 3.018 -2.3344521e-02 -1.6122063e-03 +1506 3.02 -2.3341024e-02 -1.8842413e-03 +1507 3.022 -2.3336986e-02 -2.1533654e-03 +1508 3.024 -2.3332412e-02 -2.4196026e-03 +1509 3.026 -2.3327309e-02 -2.6829765e-03 +1510 3.028 -2.3321682e-02 -2.9435110e-03 +1511 3.03 -2.3315537e-02 -3.2012294e-03 +1512 3.032 -2.3308879e-02 -3.4561550e-03 +1513 3.034 -2.3301714e-02 -3.7083109e-03 +1514 3.036 -2.3294048e-02 -3.9577200e-03 +1515 3.038 -2.3285885e-02 -4.2044051e-03 +1516 3.04 -2.3277232e-02 -4.4483887e-03 +1517 3.042 -2.3268093e-02 -4.6896932e-03 +1518 3.044 -2.3258475e-02 -4.9283409e-03 +1519 3.046 -2.3248382e-02 -5.1643538e-03 +1520 3.048 -2.3237819e-02 -5.3977539e-03 +1521 3.05 -2.3226793e-02 -5.6285629e-03 +1522 3.052 -2.3215307e-02 -5.8568023e-03 +1523 3.054 -2.3203367e-02 -6.0824935e-03 +1524 3.056 -2.3190978e-02 -6.3056578e-03 +1525 3.058 -2.3178146e-02 -6.5263163e-03 +1526 3.06 -2.3164875e-02 -6.7444898e-03 +1527 3.062 -2.3151170e-02 -6.9601993e-03 +1528 3.064 -2.3137036e-02 -7.1734651e-03 +1529 3.066 -2.3122478e-02 -7.3843079e-03 +1530 3.068 -2.3107500e-02 -7.5927479e-03 +1531 3.07 -2.3092108e-02 -7.7988051e-03 +1532 3.072 -2.3076306e-02 -8.0024998e-03 +1533 3.074 -2.3060100e-02 -8.2038515e-03 +1534 3.076 -2.3043493e-02 -8.4028801e-03 +1535 3.078 -2.3026490e-02 -8.5996051e-03 +1536 3.08 -2.3009096e-02 -8.7940458e-03 +1537 3.082 -2.2991315e-02 -8.9862216e-03 +1538 3.084 -2.2973152e-02 -9.1761514e-03 +1539 3.086 -2.2954612e-02 -9.3638542e-03 +1540 3.088 -2.2935698e-02 -9.5493488e-03 +1541 3.09 -2.2916416e-02 -9.7326540e-03 +1542 3.092 -2.2896769e-02 -9.9137881e-03 +1543 3.094 -2.2876762e-02 -1.0092770e-02 +1544 3.096 -2.2856399e-02 -1.0269617e-02 +1545 3.098 -2.2835685e-02 -1.0444348e-02 +1546 3.1 -2.2814624e-02 -1.0616980e-02 +1547 3.102 -2.2793219e-02 -1.0787532e-02 +1548 3.104 -2.2771475e-02 -1.0956021e-02 +1549 3.106 -2.2749396e-02 -1.1122465e-02 +1550 3.108 -2.2726986e-02 -1.1286881e-02 +1551 3.11 -2.2704250e-02 -1.1449286e-02 +1552 3.112 -2.2681190e-02 -1.1609698e-02 +1553 3.114 -2.2657812e-02 -1.1768134e-02 +1554 3.116 -2.2634119e-02 -1.1924610e-02 +1555 3.118 -2.2610115e-02 -1.2079143e-02 +1556 3.12 -2.2585804e-02 -1.2231750e-02 +1557 3.122 -2.2561189e-02 -1.2382447e-02 +1558 3.124 -2.2536275e-02 -1.2531251e-02 +1559 3.126 -2.2511066e-02 -1.2678178e-02 +1560 3.128 -2.2485564e-02 -1.2823244e-02 +1561 3.13 -2.2459774e-02 -1.2966466e-02 +1562 3.132 -2.2433699e-02 -1.3107858e-02 +1563 3.134 -2.2407344e-02 -1.3247437e-02 +1564 3.136 -2.2380711e-02 -1.3385218e-02 +1565 3.138 -2.2353804e-02 -1.3521217e-02 +1566 3.14 -2.2326627e-02 -1.3655450e-02 +1567 3.142 -2.2299183e-02 -1.3787931e-02 +1568 3.144 -2.2271476e-02 -1.3918676e-02 +1569 3.146 -2.2243510e-02 -1.4047699e-02 +1570 3.148 -2.2215287e-02 -1.4175017e-02 +1571 3.15 -2.2186811e-02 -1.4300642e-02 +1572 3.152 -2.2158085e-02 -1.4424591e-02 +1573 3.154 -2.2129114e-02 -1.4546878e-02 +1574 3.156 -2.2099899e-02 -1.4667517e-02 +1575 3.158 -2.2070445e-02 -1.4786523e-02 +1576 3.16 -2.2040754e-02 -1.4903909e-02 +1577 3.162 -2.2010830e-02 -1.5019691e-02 +1578 3.164 -2.1980676e-02 -1.5133881e-02 +1579 3.166 -2.1950296e-02 -1.5246495e-02 +1580 3.168 -2.1919691e-02 -1.5357545e-02 +1581 3.17 -2.1888866e-02 -1.5467046e-02 +1582 3.172 -2.1857824e-02 -1.5575011e-02 +1583 3.174 -2.1826567e-02 -1.5681454e-02 +1584 3.176 -2.1795099e-02 -1.5786388e-02 +1585 3.178 -2.1763423e-02 -1.5889825e-02 +1586 3.18 -2.1731541e-02 -1.5991781e-02 +1587 3.182 -2.1699457e-02 -1.6092267e-02 +1588 3.184 -2.1667173e-02 -1.6191296e-02 +1589 3.186 -2.1634692e-02 -1.6288882e-02 +1590 3.188 -2.1602018e-02 -1.6385037e-02 +1591 3.19 -2.1569153e-02 -1.6479774e-02 +1592 3.192 -2.1536100e-02 -1.6573106e-02 +1593 3.194 -2.1502862e-02 -1.6665044e-02 +1594 3.196 -2.1469441e-02 -1.6755602e-02 +1595 3.198 -2.1435840e-02 -1.6844792e-02 +1596 3.2 -2.1402063e-02 -1.6932625e-02 +1597 3.202 -2.1368111e-02 -1.7019114e-02 +1598 3.204 -2.1333987e-02 -1.7104271e-02 +1599 3.206 -2.1299694e-02 -1.7188108e-02 +1600 3.208 -2.1265236e-02 -1.7270637e-02 +1601 3.21 -2.1230613e-02 -1.7351870e-02 +1602 3.212 -2.1195829e-02 -1.7431817e-02 +1603 3.214 -2.1160886e-02 -1.7510491e-02 +1604 3.216 -2.1125788e-02 -1.7587903e-02 +1605 3.218 -2.1090536e-02 -1.7664064e-02 +1606 3.22 -2.1055132e-02 -1.7738987e-02 +1607 3.222 -2.1019580e-02 -1.7812681e-02 +1608 3.224 -2.0983882e-02 -1.7885158e-02 +1609 3.226 -2.0948041e-02 -1.7956429e-02 +1610 3.228 -2.0912058e-02 -1.8026506e-02 +1611 3.23 -2.0875935e-02 -1.8095398e-02 +1612 3.232 -2.0839677e-02 -1.8163116e-02 +1613 3.234 -2.0803284e-02 -1.8229672e-02 +1614 3.236 -2.0766759e-02 -1.8295076e-02 +1615 3.238 -2.0730104e-02 -1.8359338e-02 +1616 3.24 -2.0693322e-02 -1.8422469e-02 +1617 3.242 -2.0656415e-02 -1.8484479e-02 +1618 3.244 -2.0619385e-02 -1.8545379e-02 +1619 3.246 -2.0582234e-02 -1.8605178e-02 +1620 3.248 -2.0544965e-02 -1.8663887e-02 +1621 3.25 -2.0507579e-02 -1.8721516e-02 +1622 3.252 -2.0470080e-02 -1.8778074e-02 +1623 3.254 -2.0432468e-02 -1.8833572e-02 +1624 3.256 -2.0394746e-02 -1.8888019e-02 +1625 3.258 -2.0356916e-02 -1.8941425e-02 +1626 3.26 -2.0318981e-02 -1.8993800e-02 +1627 3.262 -2.0280942e-02 -1.9045153e-02 +1628 3.264 -2.0242801e-02 -1.9095494e-02 +1629 3.266 -2.0204561e-02 -1.9144832e-02 +1630 3.268 -2.0166222e-02 -1.9193177e-02 +1631 3.27 -2.0127789e-02 -1.9240537e-02 +1632 3.272 -2.0089261e-02 -1.9286923e-02 +1633 3.274 -2.0050642e-02 -1.9332342e-02 +1634 3.276 -2.0011932e-02 -1.9376804e-02 +1635 3.278 -1.9973135e-02 -1.9420319e-02 +1636 3.28 -1.9934252e-02 -1.9462894e-02 +1637 3.282 -1.9895284e-02 -1.9504540e-02 +1638 3.284 -1.9856234e-02 -1.9545264e-02 +1639 3.286 -1.9817104e-02 -1.9585075e-02 +1640 3.288 -1.9777894e-02 -1.9623982e-02 +1641 3.29 -1.9738608e-02 -1.9661993e-02 +1642 3.292 -1.9699247e-02 -1.9699118e-02 +1643 3.294 -1.9659812e-02 -1.9735364e-02 +1644 3.296 -1.9620306e-02 -1.9770739e-02 +1645 3.298 -1.9580730e-02 -1.9805253e-02 +1646 3.3 -1.9541086e-02 -1.9838913e-02 +1647 3.302 -1.9501375e-02 -1.9871727e-02 +1648 3.304 -1.9461599e-02 -1.9903703e-02 +1649 3.306 -1.9421761e-02 -1.9934851e-02 +1650 3.308 -1.9381860e-02 -1.9965176e-02 +1651 3.31 -1.9341900e-02 -1.9994688e-02 +1652 3.312 -1.9301882e-02 -2.0023394e-02 +1653 3.314 -1.9261807e-02 -2.0051302e-02 +1654 3.316 -1.9221678e-02 -2.0078420e-02 +1655 3.318 -1.9181494e-02 -2.0104755e-02 +1656 3.32 -1.9141259e-02 -2.0130315e-02 +1657 3.322 -1.9100973e-02 -2.0155107e-02 +1658 3.324 -1.9060639e-02 -2.0179140e-02 +1659 3.326 -1.9020257e-02 -2.0202419e-02 +1660 3.328 -1.8979830e-02 -2.0224954e-02 +1661 3.33 -1.8939358e-02 -2.0246750e-02 +1662 3.332 -1.8898843e-02 -2.0267816e-02 +1663 3.334 -1.8858287e-02 -2.0288157e-02 +1664 3.336 -1.8817691e-02 -2.0307783e-02 +1665 3.338 -1.8777057e-02 -2.0326699e-02 +1666 3.34 -1.8736385e-02 -2.0344912e-02 +1667 3.342 -1.8695677e-02 -2.0362430e-02 +1668 3.344 -1.8654936e-02 -2.0379259e-02 +1669 3.346 -1.8614161e-02 -2.0395406e-02 +1670 3.348 -1.8573355e-02 -2.0410879e-02 +1671 3.35 -1.8532518e-02 -2.0425683e-02 +1672 3.352 -1.8491652e-02 -2.0439825e-02 +1673 3.354 -1.8450759e-02 -2.0453313e-02 +1674 3.356 -1.8409839e-02 -2.0466152e-02 +1675 3.358 -1.8368895e-02 -2.0478349e-02 +1676 3.36 -1.8327926e-02 -2.0489911e-02 +1677 3.362 -1.8286936e-02 -2.0500843e-02 +1678 3.364 -1.8245923e-02 -2.0511153e-02 +1679 3.366 -1.8204891e-02 -2.0520846e-02 +1680 3.368 -1.8163840e-02 -2.0529929e-02 +1681 3.37 -1.8122772e-02 -2.0538409e-02 +1682 3.372 -1.8081687e-02 -2.0546290e-02 +1683 3.374 -1.8040587e-02 -2.0553580e-02 +1684 3.376 -1.7999473e-02 -2.0560284e-02 +1685 3.378 -1.7958347e-02 -2.0566408e-02 +1686 3.38 -1.7917208e-02 -2.0571959e-02 +1687 3.382 -1.7876059e-02 -2.0576941e-02 +1688 3.384 -1.7834901e-02 -2.0581362e-02 +1689 3.386 -1.7793734e-02 -2.0585227e-02 +1690 3.388 -1.7752560e-02 -2.0588541e-02 +1691 3.39 -1.7711380e-02 -2.0591311e-02 +1692 3.392 -1.7670195e-02 -2.0593541e-02 +1693 3.394 -1.7629006e-02 -2.0595238e-02 +1694 3.396 -1.7587815e-02 -2.0596408e-02 +1695 3.398 -1.7546621e-02 -2.0597055e-02 +1696 3.4 -1.7505427e-02 -2.0597185e-02 +1697 3.402 -1.7464233e-02 -2.0596804e-02 +1698 3.404 -1.7423040e-02 -2.0595917e-02 +1699 3.406 -1.7381849e-02 -2.0594529e-02 +1700 3.408 -1.7340662e-02 -2.0592646e-02 +1701 3.41 -1.7299479e-02 -2.0590272e-02 +1702 3.412 -1.7258301e-02 -2.0587414e-02 +1703 3.414 -1.7217130e-02 -2.0584077e-02 +1704 3.416 -1.7175965e-02 -2.0580264e-02 +1705 3.418 -1.7134809e-02 -2.0575983e-02 +1706 3.42 -1.7093662e-02 -2.0571237e-02 +1707 3.422 -1.7052524e-02 -2.0566031e-02 +1708 3.424 -1.7011398e-02 -2.0560371e-02 +1709 3.426 -1.6970283e-02 -2.0554262e-02 +1710 3.428 -1.6929181e-02 -2.0547708e-02 +1711 3.43 -1.6888093e-02 -2.0540714e-02 +1712 3.432 -1.6847019e-02 -2.0533285e-02 +1713 3.434 -1.6805960e-02 -2.0525426e-02 +1714 3.436 -1.6764917e-02 -2.0517141e-02 +1715 3.438 -1.6723892e-02 -2.0508436e-02 +1716 3.44 -1.6682884e-02 -2.0499315e-02 +1717 3.442 -1.6641895e-02 -2.0489782e-02 +1718 3.444 -1.6600925e-02 -2.0479842e-02 +1719 3.446 -1.6559975e-02 -2.0469499e-02 +1720 3.448 -1.6519047e-02 -2.0458759e-02 +1721 3.45 -1.6478141e-02 -2.0447625e-02 +1722 3.452 -1.6437257e-02 -2.0436102e-02 +1723 3.454 -1.6396397e-02 -2.0424194e-02 +1724 3.456 -1.6355560e-02 -2.0411906e-02 +1725 3.458 -1.6314749e-02 -2.0399242e-02 +1726 3.46 -1.6273964e-02 -2.0386206e-02 +1727 3.462 -1.6233205e-02 -2.0372803e-02 +1728 3.464 -1.6192473e-02 -2.0359036e-02 +1729 3.466 -1.6151769e-02 -2.0344910e-02 +1730 3.468 -1.6111093e-02 -2.0330429e-02 +1731 3.47 -1.6070447e-02 -2.0315598e-02 +1732 3.472 -1.6029831e-02 -2.0300419e-02 +1733 3.474 -1.5989246e-02 -2.0284897e-02 +1734 3.476 -1.5948692e-02 -2.0269037e-02 +1735 3.478 -1.5908170e-02 -2.0252842e-02 +1736 3.48 -1.5867681e-02 -2.0236315e-02 +1737 3.482 -1.5827225e-02 -2.0219462e-02 +1738 3.484 -1.5786803e-02 -2.0202285e-02 +1739 3.486 -1.5746416e-02 -2.0184789e-02 +1740 3.488 -1.5706064e-02 -2.0166978e-02 +1741 3.49 -1.5665748e-02 -2.0148854e-02 +1742 3.492 -1.5625469e-02 -2.0130423e-02 +1743 3.494 -1.5585227e-02 -2.0111687e-02 +1744 3.496 -1.5545022e-02 -2.0092650e-02 +1745 3.498 -1.5504856e-02 -2.0073317e-02 +1746 3.5 -1.5464729e-02 -2.0053690e-02 +1747 3.502 -1.5424642e-02 -2.0033772e-02 +1748 3.504 -1.5384594e-02 -2.0013569e-02 +1749 3.506 -1.5344588e-02 -1.9993083e-02 +1750 3.508 -1.5304622e-02 -1.9972317e-02 +1751 3.51 -1.5264699e-02 -1.9951276e-02 +1752 3.512 -1.5224817e-02 -1.9929962e-02 +1753 3.514 -1.5184979e-02 -1.9908378e-02 +1754 3.516 -1.5145184e-02 -1.9886530e-02 +1755 3.518 -1.5105433e-02 -1.9864418e-02 +1756 3.52 -1.5065726e-02 -1.9842048e-02 +1757 3.522 -1.5026065e-02 -1.9819422e-02 +1758 3.524 -1.4986449e-02 -1.9796544e-02 +1759 3.526 -1.4946879e-02 -1.9773416e-02 +1760 3.528 -1.4907355e-02 -1.9750042e-02 +1761 3.53 -1.4867879e-02 -1.9726425e-02 +1762 3.532 -1.4828450e-02 -1.9702568e-02 +1763 3.534 -1.4789069e-02 -1.9678475e-02 +1764 3.536 -1.4749736e-02 -1.9654148e-02 +1765 3.538 -1.4710452e-02 -1.9629590e-02 +1766 3.54 -1.4671218e-02 -1.9604805e-02 +1767 3.542 -1.4632033e-02 -1.9579795e-02 +1768 3.544 -1.4592899e-02 -1.9554564e-02 +1769 3.546 -1.4553815e-02 -1.9529115e-02 +1770 3.548 -1.4514783e-02 -1.9503450e-02 +1771 3.55 -1.4475801e-02 -1.9477572e-02 +1772 3.552 -1.4436872e-02 -1.9451484e-02 +1773 3.554 -1.4397996e-02 -1.9425189e-02 +1774 3.556 -1.4359172e-02 -1.9398691e-02 +1775 3.558 -1.4320401e-02 -1.9371990e-02 +1776 3.56 -1.4281684e-02 -1.9345092e-02 +1777 3.562 -1.4243021e-02 -1.9317997e-02 +1778 3.564 -1.4204412e-02 -1.9290709e-02 +1779 3.566 -1.4165858e-02 -1.9263231e-02 +1780 3.568 -1.4127359e-02 -1.9235566e-02 +1781 3.57 -1.4088916e-02 -1.9207715e-02 +1782 3.572 -1.4050529e-02 -1.9179682e-02 +1783 3.574 -1.4012197e-02 -1.9151469e-02 +1784 3.576 -1.3973923e-02 -1.9123079e-02 +1785 3.578 -1.3935705e-02 -1.9094515e-02 +1786 3.58 -1.3897545e-02 -1.9065778e-02 +1787 3.582 -1.3859442e-02 -1.9036872e-02 +1788 3.584 -1.3821397e-02 -1.9007799e-02 +1789 3.586 -1.3783411e-02 -1.8978561e-02 +1790 3.588 -1.3745483e-02 -1.8949161e-02 +1791 3.59 -1.3707615e-02 -1.8919601e-02 +1792 3.592 -1.3669805e-02 -1.8889885e-02 +1793 3.594 -1.3632055e-02 -1.8860013e-02 +1794 3.596 -1.3594365e-02 -1.8829989e-02 +1795 3.598 -1.3556735e-02 -1.8799814e-02 +1796 3.6 -1.3519166e-02 -1.8769492e-02 +1797 3.602 -1.3481657e-02 -1.8739025e-02 +1798 3.604 -1.3444210e-02 -1.8708414e-02 +1799 3.606 -1.3406824e-02 -1.8677662e-02 +1800 3.608 -1.3369499e-02 -1.8646772e-02 +1801 3.61 -1.3332237e-02 -1.8615745e-02 +1802 3.612 -1.3295036e-02 -1.8584583e-02 +1803 3.614 -1.3257899e-02 -1.8553290e-02 +1804 3.616 -1.3220823e-02 -1.8521867e-02 +1805 3.618 -1.3183811e-02 -1.8490315e-02 +1806 3.62 -1.3146862e-02 -1.8458639e-02 +1807 3.622 -1.3109977e-02 -1.8426838e-02 +1808 3.624 -1.3073155e-02 -1.8394917e-02 +1809 3.626 -1.3036397e-02 -1.8362876e-02 +1810 3.628 -1.2999704e-02 -1.8330717e-02 +1811 3.63 -1.2963074e-02 -1.8298443e-02 +1812 3.632 -1.2926510e-02 -1.8266056e-02 +1813 3.634 -1.2890010e-02 -1.8233558e-02 +1814 3.636 -1.2853576e-02 -1.8200950e-02 +1815 3.638 -1.2817206e-02 -1.8168235e-02 +1816 3.64 -1.2780903e-02 -1.8135414e-02 +1817 3.642 -1.2744665e-02 -1.8102490e-02 +1818 3.644 -1.2708493e-02 -1.8069465e-02 +1819 3.646 -1.2672387e-02 -1.8036340e-02 +1820 3.648 -1.2636348e-02 -1.8003116e-02 +1821 3.65 -1.2600375e-02 -1.7969797e-02 +1822 3.652 -1.2564468e-02 -1.7936384e-02 +1823 3.654 -1.2528629e-02 -1.7902878e-02 +1824 3.656 -1.2492857e-02 -1.7869282e-02 +1825 3.658 -1.2457152e-02 -1.7835597e-02 +1826 3.66 -1.2421515e-02 -1.7801825e-02 +1827 3.662 -1.2385945e-02 -1.7767968e-02 +1828 3.664 -1.2350443e-02 -1.7734027e-02 +1829 3.666 -1.2315009e-02 -1.7700005e-02 +1830 3.668 -1.2279643e-02 -1.7665903e-02 +1831 3.67 -1.2244345e-02 -1.7631722e-02 +1832 3.672 -1.2209116e-02 -1.7597464e-02 +1833 3.674 -1.2173955e-02 -1.7563131e-02 +1834 3.676 -1.2138864e-02 -1.7528725e-02 +1835 3.678 -1.2103841e-02 -1.7494248e-02 +1836 3.68 -1.2068887e-02 -1.7459700e-02 +1837 3.682 -1.2034002e-02 -1.7425083e-02 +1838 3.684 -1.1999186e-02 -1.7390399e-02 +1839 3.686 -1.1964440e-02 -1.7355650e-02 +1840 3.688 -1.1929764e-02 -1.7320837e-02 +1841 3.69 -1.1895157e-02 -1.7285962e-02 +1842 3.692 -1.1860620e-02 -1.7251026e-02 +1843 3.694 -1.1826153e-02 -1.7216031e-02 +1844 3.696 -1.1791756e-02 -1.7180977e-02 +1845 3.698 -1.1757429e-02 -1.7145868e-02 +1846 3.7 -1.1723172e-02 -1.7110703e-02 +1847 3.702 -1.1688986e-02 -1.7075485e-02 +1848 3.704 -1.1654871e-02 -1.7040215e-02 +1849 3.706 -1.1620825e-02 -1.7004894e-02 +1850 3.708 -1.1586851e-02 -1.6969524e-02 +1851 3.71 -1.1552947e-02 -1.6934107e-02 +1852 3.712 -1.1519115e-02 -1.6898643e-02 +1853 3.714 -1.1485353e-02 -1.6863134e-02 +1854 3.716 -1.1451662e-02 -1.6827581e-02 +1855 3.718 -1.1418043e-02 -1.6791986e-02 +1856 3.72 -1.1384494e-02 -1.6756350e-02 +1857 3.722 -1.1351017e-02 -1.6720674e-02 +1858 3.724 -1.1317612e-02 -1.6684959e-02 +1859 3.726 -1.1284277e-02 -1.6649208e-02 +1860 3.728 -1.1251015e-02 -1.6613421e-02 +1861 3.73 -1.1217824e-02 -1.6577599e-02 +1862 3.732 -1.1184704e-02 -1.6541744e-02 +1863 3.734 -1.1151657e-02 -1.6505856e-02 +1864 3.736 -1.1118681e-02 -1.6469938e-02 +1865 3.738 -1.1085777e-02 -1.6433990e-02 +1866 3.74 -1.1052945e-02 -1.6398014e-02 +1867 3.742 -1.1020185e-02 -1.6362011e-02 +1868 3.744 -1.0987497e-02 -1.6325981e-02 +1869 3.746 -1.0954881e-02 -1.6289926e-02 +1870 3.748 -1.0922337e-02 -1.6253848e-02 +1871 3.75 -1.0889866e-02 -1.6217747e-02 +1872 3.752 -1.0857466e-02 -1.6181625e-02 +1873 3.754 -1.0825139e-02 -1.6145482e-02 +1874 3.756 -1.0792884e-02 -1.6109320e-02 +1875 3.758 -1.0760702e-02 -1.6073140e-02 +1876 3.76 -1.0728592e-02 -1.6036943e-02 +1877 3.762 -1.0696554e-02 -1.6000729e-02 +1878 3.764 -1.0664589e-02 -1.5964501e-02 +1879 3.766 -1.0632696e-02 -1.5928259e-02 +1880 3.768 -1.0600876e-02 -1.5892004e-02 +1881 3.77 -1.0569128e-02 -1.5855738e-02 +1882 3.772 -1.0537453e-02 -1.5819460e-02 +1883 3.774 -1.0505850e-02 -1.5783173e-02 +1884 3.776 -1.0474320e-02 -1.5746877e-02 +1885 3.778 -1.0442863e-02 -1.5710573e-02 +1886 3.78 -1.0411478e-02 -1.5674263e-02 +1887 3.782 -1.0380166e-02 -1.5637946e-02 +1888 3.784 -1.0348926e-02 -1.5601625e-02 +1889 3.786 -1.0317759e-02 -1.5565300e-02 +1890 3.788 -1.0286665e-02 -1.5528972e-02 +1891 3.79 -1.0255643e-02 -1.5492642e-02 +1892 3.792 -1.0224694e-02 -1.5456311e-02 +1893 3.794 -1.0193818e-02 -1.5419979e-02 +1894 3.796 -1.0163015e-02 -1.5383648e-02 +1895 3.798 -1.0132284e-02 -1.5347319e-02 +1896 3.8 -1.0101625e-02 -1.5310992e-02 +1897 3.802 -1.0071040e-02 -1.5274669e-02 +1898 3.804 -1.0040527e-02 -1.5238350e-02 +1899 3.806 -1.0010086e-02 -1.5202036e-02 +1900 3.808 -9.9797185e-03 -1.5165728e-02 +1901 3.81 -9.9494233e-03 -1.5129426e-02 +1902 3.812 -9.9192007e-03 -1.5093132e-02 +1903 3.814 -9.8890508e-03 -1.5056847e-02 +1904 3.816 -9.8589734e-03 -1.5020571e-02 +1905 3.818 -9.8289685e-03 -1.4984304e-02 +1906 3.82 -9.7990361e-03 -1.4948049e-02 +1907 3.822 -9.7691763e-03 -1.4911805e-02 +1908 3.824 -9.7393889e-03 -1.4875573e-02 +1909 3.826 -9.7096740e-03 -1.4839355e-02 +1910 3.828 -9.6800315e-03 -1.4803150e-02 +1911 3.83 -9.6504614e-03 -1.4766960e-02 +1912 3.832 -9.6209636e-03 -1.4730786e-02 +1913 3.834 -9.5915382e-03 -1.4694627e-02 +1914 3.836 -9.5621851e-03 -1.4658486e-02 +1915 3.838 -9.5329043e-03 -1.4622362e-02 +1916 3.84 -9.5036956e-03 -1.4586256e-02 +1917 3.842 -9.4745592e-03 -1.4550169e-02 +1918 3.844 -9.4454950e-03 -1.4514102e-02 +1919 3.846 -9.4165028e-03 -1.4478055e-02 +1920 3.848 -9.3875827e-03 -1.4442029e-02 +1921 3.85 -9.3587347e-03 -1.4406025e-02 +1922 3.852 -9.3299586e-03 -1.4370043e-02 +1923 3.854 -9.3012545e-03 -1.4334085e-02 +1924 3.856 -9.2726222e-03 -1.4298150e-02 +1925 3.858 -9.2440619e-03 -1.4262239e-02 +1926 3.86 -9.2155733e-03 -1.4226353e-02 +1927 3.862 -9.1871564e-03 -1.4190493e-02 +1928 3.864 -9.1588113e-03 -1.4154659e-02 +1929 3.866 -9.1305378e-03 -1.4118851e-02 +1930 3.868 -9.1023359e-03 -1.4083071e-02 +1931 3.87 -9.0742055e-03 -1.4047319e-02 +1932 3.872 -9.0461466e-03 -1.4011596e-02 +1933 3.874 -9.0181591e-03 -1.3975902e-02 +1934 3.876 -8.9902429e-03 -1.3940237e-02 +1935 3.878 -8.9623981e-03 -1.3904603e-02 +1936 3.88 -8.9346245e-03 -1.3869000e-02 +1937 3.882 -8.9069221e-03 -1.3833428e-02 +1938 3.884 -8.8792908e-03 -1.3797888e-02 +1939 3.886 -8.8517305e-03 -1.3762381e-02 +1940 3.888 -8.8242412e-03 -1.3726906e-02 +1941 3.89 -8.7968229e-03 -1.3691466e-02 +1942 3.892 -8.7694753e-03 -1.3656059e-02 +1943 3.894 -8.7421986e-03 -1.3620687e-02 +1944 3.896 -8.7149926e-03 -1.3585350e-02 +1945 3.898 -8.6878572e-03 -1.3550049e-02 +1946 3.9 -8.6607924e-03 -1.3514784e-02 +1947 3.902 -8.6337980e-03 -1.3479556e-02 +1948 3.904 -8.6068741e-03 -1.3444365e-02 +1949 3.906 -8.5800205e-03 -1.3409211e-02 +1950 3.908 -8.5532372e-03 -1.3374095e-02 +1951 3.91 -8.5265241e-03 -1.3339018e-02 +1952 3.912 -8.4998811e-03 -1.3303980e-02 +1953 3.914 -8.4733082e-03 -1.3268982e-02 +1954 3.916 -8.4468052e-03 -1.3234023e-02 +1955 3.918 -8.4203721e-03 -1.3199105e-02 +1956 3.92 -8.3940087e-03 -1.3164228e-02 +1957 3.922 -8.3677151e-03 -1.3129391e-02 +1958 3.924 -8.3414911e-03 -1.3094597e-02 +1959 3.926 -8.3153367e-03 -1.3059844e-02 +1960 3.928 -8.2892517e-03 -1.3025134e-02 +1961 3.93 -8.2632361e-03 -1.2990467e-02 +1962 3.932 -8.2372898e-03 -1.2955844e-02 +1963 3.934 -8.2114127e-03 -1.2921264e-02 +1964 3.936 -8.1856048e-03 -1.2886728e-02 +1965 3.938 -8.1598658e-03 -1.2852237e-02 +1966 3.94 -8.1341958e-03 -1.2817790e-02 +1967 3.942 -8.1085946e-03 -1.2783389e-02 +1968 3.944 -8.0830622e-03 -1.2749034e-02 +1969 3.946 -8.0575984e-03 -1.2714724e-02 +1970 3.948 -8.0322033e-03 -1.2680461e-02 +1971 3.95 -8.0068766e-03 -1.2646245e-02 +1972 3.952 -7.9816183e-03 -1.2612076e-02 +1973 3.954 -7.9564282e-03 -1.2577954e-02 +1974 3.956 -7.9313064e-03 -1.2543880e-02 +1975 3.958 -7.9062527e-03 -1.2509854e-02 +1976 3.96 -7.8812670e-03 -1.2475877e-02 +1977 3.962 -7.8563491e-03 -1.2441948e-02 +1978 3.964 -7.8314991e-03 -1.2408069e-02 +1979 3.966 -7.8067168e-03 -1.2374239e-02 +1980 3.968 -7.7820021e-03 -1.2340459e-02 +1981 3.97 -7.7573550e-03 -1.2306728e-02 +1982 3.972 -7.7327752e-03 -1.2273049e-02 +1983 3.974 -7.7082627e-03 -1.2239420e-02 +1984 3.976 -7.6838175e-03 -1.2205842e-02 +1985 3.978 -7.6594393e-03 -1.2172315e-02 +1986 3.98 -7.6351282e-03 -1.2138840e-02 +1987 3.982 -7.6108839e-03 -1.2105417e-02 +1988 3.984 -7.5867065e-03 -1.2072045e-02 +1989 3.986 -7.5625957e-03 -1.2038727e-02 +1990 3.988 -7.5385515e-03 -1.2005461e-02 +1991 3.99 -7.5145738e-03 -1.1972248e-02 +1992 3.992 -7.4906625e-03 -1.1939088e-02 +1993 3.994 -7.4668175e-03 -1.1905982e-02 +1994 3.996 -7.4430386e-03 -1.1872929e-02 +1995 3.998 -7.4193257e-03 -1.1839930e-02 +1996 4.0 -7.3956788e-03 -1.1806986e-02 +1997 4.002 -7.3720977e-03 -1.1774096e-02 +1998 4.004 -7.3485824e-03 -1.1741261e-02 +1999 4.006 -7.3251326e-03 -1.1708481e-02 +2000 4.008 -7.3017484e-03 -1.1675756e-02 +2001 4.01 -7.2784296e-03 -1.1643087e-02 +2002 4.012 -7.2551760e-03 -1.1610473e-02 +2003 4.014 -7.2319877e-03 -1.1577915e-02 +2004 4.016 -7.2088643e-03 -1.1545413e-02 +2005 4.018 -7.1858060e-03 -1.1512967e-02 +2006 4.02 -7.1628124e-03 -1.1480578e-02 +2007 4.022 -7.1398836e-03 -1.1448246e-02 +2008 4.024 -7.1170194e-03 -1.1415971e-02 +2009 4.026 -7.0942197e-03 -1.1383752e-02 +2010 4.028 -7.0714844e-03 -1.1351592e-02 +2011 4.03 -7.0488133e-03 -1.1319488e-02 +2012 4.032 -7.0262064e-03 -1.1287442e-02 +2013 4.034 -7.0036635e-03 -1.1255455e-02 +2014 4.036 -6.9811845e-03 -1.1223525e-02 +2015 4.038 -6.9587693e-03 -1.1191654e-02 +2016 4.04 -6.9364179e-03 -1.1159841e-02 +2017 4.042 -6.9141299e-03 -1.1128086e-02 +2018 4.044 -6.8919055e-03 -1.1096390e-02 +2019 4.046 -6.8697443e-03 -1.1064754e-02 +2020 4.048 -6.8476464e-03 -1.1033176e-02 +2021 4.05 -6.8256116e-03 -1.1001658e-02 +2022 4.052 -6.8036397e-03 -1.0970199e-02 +2023 4.054 -6.7817308e-03 -1.0938800e-02 +2024 4.056 -6.7598845e-03 -1.0907460e-02 +2025 4.058 -6.7381009e-03 -1.0876180e-02 +2026 4.06 -6.7163797e-03 -1.0844961e-02 +2027 4.062 -6.6947210e-03 -1.0813801e-02 +2028 4.064 -6.6731245e-03 -1.0782702e-02 +2029 4.066 -6.6515901e-03 -1.0751663e-02 +2030 4.068 -6.6301178e-03 -1.0720685e-02 +2031 4.07 -6.6087074e-03 -1.0689767e-02 +2032 4.072 -6.5873587e-03 -1.0658910e-02 +2033 4.074 -6.5660717e-03 -1.0628114e-02 +2034 4.076 -6.5448462e-03 -1.0597380e-02 +2035 4.078 -6.5236821e-03 -1.0566706e-02 +2036 4.08 -6.5025793e-03 -1.0536094e-02 +2037 4.082 -6.4815377e-03 -1.0505543e-02 +2038 4.084 -6.4605571e-03 -1.0475054e-02 +2039 4.086 -6.4396375e-03 -1.0444626e-02 +2040 4.088 -6.4187786e-03 -1.0414260e-02 +2041 4.09 -6.3979804e-03 -1.0383956e-02 +2042 4.092 -6.3772427e-03 -1.0353713e-02 +2043 4.094 -6.3565655e-03 -1.0323533e-02 +2044 4.096 -6.3359485e-03 -1.0293415e-02 +2045 4.098 -6.3153918e-03 -1.0263359e-02 +2046 4.1 -6.2948951e-03 -1.0233366e-02 +2047 4.102 -6.2744583e-03 -1.0203435e-02 +2048 4.104 -6.2540813e-03 -1.0173566e-02 +2049 4.106 -6.2337640e-03 -1.0143760e-02 +2050 4.108 -6.2135062e-03 -1.0114016e-02 +2051 4.11 -6.1933079e-03 -1.0084335e-02 +2052 4.112 -6.1731688e-03 -1.0054717e-02 +2053 4.114 -6.1530889e-03 -1.0025162e-02 +2054 4.116 -6.1330681e-03 -9.9956701e-03 +2055 4.118 -6.1131062e-03 -9.9662408e-03 +2056 4.12 -6.0932031e-03 -9.9368747e-03 +2057 4.122 -6.0733587e-03 -9.9075716e-03 +2058 4.124 -6.0535728e-03 -9.8783318e-03 +2059 4.126 -6.0338453e-03 -9.8491552e-03 +2060 4.128 -6.0141761e-03 -9.8200419e-03 +2061 4.13 -5.9945651e-03 -9.7909920e-03 +2062 4.132 -5.9750121e-03 -9.7620054e-03 +2063 4.134 -5.9555170e-03 -9.7330824e-03 +2064 4.136 -5.9360797e-03 -9.7042228e-03 +2065 4.138 -5.9167001e-03 -9.6754268e-03 +2066 4.14 -5.8973780e-03 -9.6466944e-03 +2067 4.142 -5.8781133e-03 -9.6180256e-03 +2068 4.144 -5.8589059e-03 -9.5894205e-03 +2069 4.146 -5.8397556e-03 -9.5608791e-03 +2070 4.148 -5.8206623e-03 -9.5324015e-03 +2071 4.15 -5.8016259e-03 -9.5039877e-03 +2072 4.152 -5.7826463e-03 -9.4756377e-03 +2073 4.154 -5.7637233e-03 -9.4473515e-03 +2074 4.156 -5.7448569e-03 -9.4191292e-03 +2075 4.158 -5.7260468e-03 -9.3909708e-03 +2076 4.16 -5.7072929e-03 -9.3628763e-03 +2077 4.162 -5.6885952e-03 -9.3348458e-03 +2078 4.164 -5.6699535e-03 -9.3068793e-03 +2079 4.166 -5.6513677e-03 -9.2789767e-03 +2080 4.168 -5.6328376e-03 -9.2511382e-03 +2081 4.17 -5.6143631e-03 -9.2233637e-03 +2082 4.172 -5.5959441e-03 -9.1956532e-03 +2083 4.174 -5.5775804e-03 -9.1680068e-03 +2084 4.176 -5.5592720e-03 -9.1404244e-03 +2085 4.178 -5.5410187e-03 -9.1129061e-03 +2086 4.18 -5.5228203e-03 -9.0854518e-03 +2087 4.182 -5.5046768e-03 -9.0580617e-03 +2088 4.184 -5.4865880e-03 -9.0307356e-03 +2089 4.186 -5.4685538e-03 -9.0034736e-03 +2090 4.188 -5.4505741e-03 -8.9762757e-03 +2091 4.19 -5.4326487e-03 -8.9491419e-03 +2092 4.192 -5.4147775e-03 -8.9220721e-03 +2093 4.194 -5.3969604e-03 -8.8950664e-03 +2094 4.196 -5.3791972e-03 -8.8681249e-03 +2095 4.198 -5.3614878e-03 -8.8412473e-03 +2096 4.2 -5.3438321e-03 -8.8144338e-03 +2097 4.202 -5.3262300e-03 -8.7876844e-03 +2098 4.204 -5.3086814e-03 -8.7609990e-03 +2099 4.206 -5.2911860e-03 -8.7343776e-03 +2100 4.208 -5.2737438e-03 -8.7078202e-03 +2101 4.21 -5.2563547e-03 -8.6813268e-03 +2102 4.212 -5.2390185e-03 -8.6548974e-03 +2103 4.214 -5.2217350e-03 -8.6285319e-03 +2104 4.216 -5.2045043e-03 -8.6022304e-03 +2105 4.218 -5.1873261e-03 -8.5759927e-03 +2106 4.22 -5.1702003e-03 -8.5498190e-03 +2107 4.222 -5.1531268e-03 -8.5237091e-03 +2108 4.224 -5.1361054e-03 -8.4976630e-03 +2109 4.226 -5.1191361e-03 -8.4716808e-03 +2110 4.228 -5.1022186e-03 -8.4457623e-03 +2111 4.23 -5.0853530e-03 -8.4199076e-03 +2112 4.232 -5.0685390e-03 -8.3941166e-03 +2113 4.234 -5.0517765e-03 -8.3683893e-03 +2114 4.236 -5.0350654e-03 -8.3427256e-03 +2115 4.238 -5.0184055e-03 -8.3171256e-03 +2116 4.24 -5.0017968e-03 -8.2915891e-03 +2117 4.242 -4.9852391e-03 -8.2661162e-03 +2118 4.244 -4.9687323e-03 -8.2407067e-03 +2119 4.246 -4.9522762e-03 -8.2153608e-03 +2120 4.248 -4.9358708e-03 -8.1900783e-03 +2121 4.25 -4.9195159e-03 -8.1648591e-03 +2122 4.252 -4.9032113e-03 -8.1397033e-03 +2123 4.254 -4.8869570e-03 -8.1146109e-03 +2124 4.256 -4.8707529e-03 -8.0895816e-03 +2125 4.258 -4.8545987e-03 -8.0646156e-03 +2126 4.26 -4.8384943e-03 -8.0397127e-03 +2127 4.262 -4.8224398e-03 -8.0148729e-03 +2128 4.264 -4.8064348e-03 -7.9900962e-03 +2129 4.266 -4.7904793e-03 -7.9653825e-03 +2130 4.268 -4.7745732e-03 -7.9407318e-03 +2131 4.27 -4.7587164e-03 -7.9161440e-03 +2132 4.272 -4.7429086e-03 -7.8916190e-03 +2133 4.274 -4.7271499e-03 -7.8671568e-03 +2134 4.276 -4.7114400e-03 -7.8427574e-03 +2135 4.278 -4.6957788e-03 -7.8184206e-03 +2136 4.28 -4.6801662e-03 -7.7941465e-03 +2137 4.282 -4.6646022e-03 -7.7699350e-03 +2138 4.284 -4.6490865e-03 -7.7457859e-03 +2139 4.286 -4.6336190e-03 -7.7216994e-03 +2140 4.288 -4.6181996e-03 -7.6976752e-03 +2141 4.29 -4.6028282e-03 -7.6737133e-03 +2142 4.292 -4.5875047e-03 -7.6498137e-03 +2143 4.294 -4.5722289e-03 -7.6259763e-03 +2144 4.296 -4.5570008e-03 -7.6022011e-03 +2145 4.298 -4.5418201e-03 -7.5784879e-03 +2146 4.3 -4.5266868e-03 -7.5548367e-03 +2147 4.302 -4.5116007e-03 -7.5312475e-03 +2148 4.304 -4.4965617e-03 -7.5077201e-03 +2149 4.306 -4.4815698e-03 -7.4842546e-03 +2150 4.308 -4.4666247e-03 -7.4608507e-03 +2151 4.31 -4.4517263e-03 -7.4375086e-03 +2152 4.312 -4.4368746e-03 -7.4142280e-03 +2153 4.314 -4.4220694e-03 -7.3910089e-03 +2154 4.316 -4.4073105e-03 -7.3678513e-03 +2155 4.318 -4.3925979e-03 -7.3447551e-03 +2156 4.32 -4.3779315e-03 -7.3217201e-03 +2157 4.322 -4.3633110e-03 -7.2987464e-03 +2158 4.324 -4.3487364e-03 -7.2758338e-03 +2159 4.326 -4.3342076e-03 -7.2529823e-03 +2160 4.328 -4.3197245e-03 -7.2301918e-03 +2161 4.33 -4.3052868e-03 -7.2074622e-03 +2162 4.332 -4.2908946e-03 -7.1847935e-03 +2163 4.334 -4.2765476e-03 -7.1621855e-03 +2164 4.336 -4.2622458e-03 -7.1396382e-03 +2165 4.338 -4.2479890e-03 -7.1171514e-03 +2166 4.34 -4.2337772e-03 -7.0947252e-03 +2167 4.342 -4.2196101e-03 -7.0723595e-03 +2168 4.344 -4.2054877e-03 -7.0500540e-03 +2169 4.346 -4.1914098e-03 -7.0278089e-03 +2170 4.348 -4.1773764e-03 -7.0056239e-03 +2171 4.35 -4.1633873e-03 -6.9834991e-03 +2172 4.352 -4.1494424e-03 -6.9614342e-03 +2173 4.354 -4.1355415e-03 -6.9394293e-03 +2174 4.356 -4.1216846e-03 -6.9174842e-03 +2175 4.358 -4.1078715e-03 -6.8955989e-03 +2176 4.36 -4.0941022e-03 -6.8737733e-03 +2177 4.362 -4.0803764e-03 -6.8520072e-03 +2178 4.364 -4.0666941e-03 -6.8303006e-03 +2179 4.366 -4.0530552e-03 -6.8086535e-03 +2180 4.368 -4.0394595e-03 -6.7870656e-03 +2181 4.37 -4.0259069e-03 -6.7655370e-03 +2182 4.372 -4.0123973e-03 -6.7440675e-03 +2183 4.374 -3.9989306e-03 -6.7226571e-03 +2184 4.376 -3.9855066e-03 -6.7013056e-03 +2185 4.378 -3.9721253e-03 -6.6800130e-03 +2186 4.38 -3.9587865e-03 -6.6587791e-03 +2187 4.382 -3.9454901e-03 -6.6376039e-03 +2188 4.384 -3.9322361e-03 -6.6164873e-03 +2189 4.386 -3.9190241e-03 -6.5954292e-03 +2190 4.388 -3.9058543e-03 -6.5744295e-03 +2191 4.39 -3.8927264e-03 -6.5534881e-03 +2192 4.392 -3.8796403e-03 -6.5326049e-03 +2193 4.394 -3.8665959e-03 -6.5117798e-03 +2194 4.396 -3.8535931e-03 -6.4910127e-03 +2195 4.398 -3.8406318e-03 -6.4703035e-03 +2196 4.4 -3.8277119e-03 -6.4496522e-03 +2197 4.402 -3.8148332e-03 -6.4290585e-03 +2198 4.404 -3.8019956e-03 -6.4085225e-03 +2199 4.406 -3.7891991e-03 -6.3880440e-03 +2200 4.408 -3.7764434e-03 -6.3676230e-03 +2201 4.41 -3.7637285e-03 -6.3472592e-03 +2202 4.412 -3.7510543e-03 -6.3269527e-03 +2203 4.414 -3.7384207e-03 -6.3067033e-03 +2204 4.416 -3.7258275e-03 -6.2865110e-03 +2205 4.418 -3.7132746e-03 -6.2663756e-03 +2206 4.42 -3.7007619e-03 -6.2462970e-03 +2207 4.422 -3.6882894e-03 -6.2262751e-03 +2208 4.424 -3.6758568e-03 -6.2063099e-03 +2209 4.426 -3.6634641e-03 -6.1864012e-03 +2210 4.428 -3.6511112e-03 -6.1665489e-03 +2211 4.43 -3.6387979e-03 -6.1467529e-03 +2212 4.432 -3.6265241e-03 -6.1270131e-03 +2213 4.434 -3.6142898e-03 -6.1073295e-03 +2214 4.436 -3.6020948e-03 -6.0877018e-03 +2215 4.438 -3.5899389e-03 -6.0681301e-03 +2216 4.44 -3.5778222e-03 -6.0486142e-03 +2217 4.442 -3.5657444e-03 -6.0291539e-03 +2218 4.444 -3.5537055e-03 -6.0097493e-03 +2219 4.446 -3.5417054e-03 -5.9904001e-03 +2220 4.448 -3.5297439e-03 -5.9711063e-03 +2221 4.45 -3.5178209e-03 -5.9518678e-03 +2222 4.452 -3.5059364e-03 -5.9326845e-03 +2223 4.454 -3.4940902e-03 -5.9135563e-03 +2224 4.456 -3.4822821e-03 -5.8944830e-03 +2225 4.458 -3.4705122e-03 -5.8754645e-03 +2226 4.46 -3.4587802e-03 -5.8565008e-03 +2227 4.462 -3.4470862e-03 -5.8375918e-03 +2228 4.464 -3.4354298e-03 -5.8187372e-03 +2229 4.466 -3.4238112e-03 -5.7999371e-03 +2230 4.468 -3.4122301e-03 -5.7811914e-03 +2231 4.47 -3.4006864e-03 -5.7624998e-03 +2232 4.472 -3.3891800e-03 -5.7438623e-03 +2233 4.474 -3.3777109e-03 -5.7252788e-03 +2234 4.476 -3.3662789e-03 -5.7067493e-03 +2235 4.478 -3.3548839e-03 -5.6882735e-03 +2236 4.48 -3.3435257e-03 -5.6698513e-03 +2237 4.482 -3.3322044e-03 -5.6514827e-03 +2238 4.484 -3.3209198e-03 -5.6331676e-03 +2239 4.486 -3.3096717e-03 -5.6149058e-03 +2240 4.488 -3.2984601e-03 -5.5966973e-03 +2241 4.49 -3.2872849e-03 -5.5785418e-03 +2242 4.492 -3.2761459e-03 -5.5604394e-03 +2243 4.494 -3.2650431e-03 -5.5423899e-03 +2244 4.496 -3.2539763e-03 -5.5243932e-03 +2245 4.498 -3.2429455e-03 -5.5064491e-03 +2246 4.5 -3.2319505e-03 -5.4885577e-03 +2247 4.502 -3.2209912e-03 -5.4707187e-03 +2248 4.504 -3.2100676e-03 -5.4529320e-03 +2249 4.506 -3.1991795e-03 -5.4351976e-03 +2250 4.508 -3.1883268e-03 -5.4175153e-03 +2251 4.51 -3.1775094e-03 -5.3998851e-03 +2252 4.512 -3.1667272e-03 -5.3823067e-03 +2253 4.514 -3.1559801e-03 -5.3647801e-03 +2254 4.516 -3.1452680e-03 -5.3473053e-03 +2255 4.518 -3.1345908e-03 -5.3298820e-03 +2256 4.52 -3.1239485e-03 -5.3125101e-03 +2257 4.522 -3.1133408e-03 -5.2951896e-03 +2258 4.524 -3.1027677e-03 -5.2779204e-03 +2259 4.526 -3.0922291e-03 -5.2607023e-03 +2260 4.528 -3.0817248e-03 -5.2435351e-03 +2261 4.53 -3.0712549e-03 -5.2264189e-03 +2262 4.532 -3.0608191e-03 -5.2093535e-03 +2263 4.534 -3.0504174e-03 -5.1923388e-03 +2264 4.536 -3.0400497e-03 -5.1753746e-03 +2265 4.538 -3.0297159e-03 -5.1584609e-03 +2266 4.54 -3.0194158e-03 -5.1415975e-03 +2267 4.542 -3.0091495e-03 -5.1247844e-03 +2268 4.544 -2.9989167e-03 -5.1080214e-03 +2269 4.546 -2.9887174e-03 -5.0913083e-03 +2270 4.548 -2.9785514e-03 -5.0746452e-03 +2271 4.55 -2.9684187e-03 -5.0580318e-03 +2272 4.552 -2.9583193e-03 -5.0414682e-03 +2273 4.554 -2.9482528e-03 -5.0249540e-03 +2274 4.556 -2.9382194e-03 -5.0084893e-03 +2275 4.558 -2.9282188e-03 -4.9920740e-03 +2276 4.56 -2.9182511e-03 -4.9757078e-03 +2277 4.562 -2.9083160e-03 -4.9593908e-03 +2278 4.564 -2.8984135e-03 -4.9431227e-03 +2279 4.566 -2.8885435e-03 -4.9269035e-03 +2280 4.568 -2.8787058e-03 -4.9107331e-03 +2281 4.57 -2.8689005e-03 -4.8946113e-03 +2282 4.572 -2.8591274e-03 -4.8785381e-03 +2283 4.574 -2.8493863e-03 -4.8625133e-03 +2284 4.576 -2.8396773e-03 -4.8465368e-03 +2285 4.578 -2.8300001e-03 -4.8306085e-03 +2286 4.58 -2.8203548e-03 -4.8147283e-03 +2287 4.582 -2.8107412e-03 -4.7988960e-03 +2288 4.584 -2.8011592e-03 -4.7831116e-03 +2289 4.586 -2.7916087e-03 -4.7673750e-03 +2290 4.588 -2.7820897e-03 -4.7516860e-03 +2291 4.59 -2.7726019e-03 -4.7360445e-03 +2292 4.592 -2.7631454e-03 -4.7204504e-03 +2293 4.594 -2.7537201e-03 -4.7049036e-03 +2294 4.596 -2.7443258e-03 -4.6894040e-03 +2295 4.598 -2.7349625e-03 -4.6739515e-03 +2296 4.6 -2.7256300e-03 -4.6585459e-03 +2297 4.602 -2.7163282e-03 -4.6431872e-03 +2298 4.604 -2.7070572e-03 -4.6278751e-03 +2299 4.606 -2.6978167e-03 -4.6126097e-03 +2300 4.608 -2.6886067e-03 -4.5973909e-03 +2301 4.61 -2.6794271e-03 -4.5822184e-03 +2302 4.612 -2.6702778e-03 -4.5670921e-03 +2303 4.614 -2.6611587e-03 -4.5520121e-03 +2304 4.616 -2.6520697e-03 -4.5369781e-03 +2305 4.618 -2.6430108e-03 -4.5219900e-03 +2306 4.62 -2.6339817e-03 -4.5070478e-03 +2307 4.622 -2.6249825e-03 -4.4921512e-03 +2308 4.624 -2.6160131e-03 -4.4773003e-03 +2309 4.626 -2.6070733e-03 -4.4624949e-03 +2310 4.628 -2.5981631e-03 -4.4477348e-03 +2311 4.63 -2.5892823e-03 -4.4330201e-03 +2312 4.632 -2.5804310e-03 -4.4183504e-03 +2313 4.634 -2.5716089e-03 -4.4037258e-03 +2314 4.636 -2.5628160e-03 -4.3891462e-03 +2315 4.638 -2.5540523e-03 -4.3746113e-03 +2316 4.64 -2.5453176e-03 -4.3601212e-03 +2317 4.642 -2.5366118e-03 -4.3456756e-03 +2318 4.644 -2.5279348e-03 -4.3312746e-03 +2319 4.646 -2.5192867e-03 -4.3169179e-03 +2320 4.648 -2.5106671e-03 -4.3026054e-03 +2321 4.65 -2.5020762e-03 -4.2883372e-03 +2322 4.652 -2.4935138e-03 -4.2741129e-03 +2323 4.654 -2.4849797e-03 -4.2599326e-03 +2324 4.656 -2.4764740e-03 -4.2457961e-03 +2325 4.658 -2.4679965e-03 -4.2317032e-03 +2326 4.66 -2.4595472e-03 -4.2176540e-03 +2327 4.662 -2.4511259e-03 -4.2036483e-03 +2328 4.664 -2.4427325e-03 -4.1896859e-03 +2329 4.666 -2.4343671e-03 -4.1757668e-03 +2330 4.668 -2.4260294e-03 -4.1618908e-03 +2331 4.67 -2.4177195e-03 -4.1480578e-03 +2332 4.672 -2.4094372e-03 -4.1342678e-03 +2333 4.674 -2.4011824e-03 -4.1205206e-03 +2334 4.676 -2.3929551e-03 -4.1068161e-03 +2335 4.678 -2.3847551e-03 -4.0931542e-03 +2336 4.68 -2.3765824e-03 -4.0795348e-03 +2337 4.682 -2.3684369e-03 -4.0659578e-03 +2338 4.684 -2.3603186e-03 -4.0524230e-03 +2339 4.686 -2.3522272e-03 -4.0389304e-03 +2340 4.688 -2.3441628e-03 -4.0254798e-03 +2341 4.69 -2.3361253e-03 -4.0120711e-03 +2342 4.692 -2.3281145e-03 -3.9987043e-03 +2343 4.694 -2.3201304e-03 -3.9853792e-03 +2344 4.696 -2.3121730e-03 -3.9720957e-03 +2345 4.698 -2.3042420e-03 -3.9588537e-03 +2346 4.7 -2.2963375e-03 -3.9456531e-03 +2347 4.702 -2.2884594e-03 -3.9324937e-03 +2348 4.704 -2.2806075e-03 -3.9193756e-03 +2349 4.706 -2.2727819e-03 -3.9062985e-03 +2350 4.708 -2.2649823e-03 -3.8932623e-03 +2351 4.71 -2.2572088e-03 -3.8802670e-03 +2352 4.712 -2.2494612e-03 -3.8673125e-03 +2353 4.714 -2.2417395e-03 -3.8543985e-03 +2354 4.716 -2.2340436e-03 -3.8415251e-03 +2355 4.718 -2.2263734e-03 -3.8286921e-03 +2356 4.72 -2.2187288e-03 -3.8158994e-03 +2357 4.722 -2.2111097e-03 -3.8031469e-03 +2358 4.724 -2.2035162e-03 -3.7904345e-03 +2359 4.726 -2.1959480e-03 -3.7777621e-03 +2360 4.728 -2.1884051e-03 -3.7651295e-03 +2361 4.73 -2.1808874e-03 -3.7525368e-03 +2362 4.732 -2.1733949e-03 -3.7399836e-03 +2363 4.734 -2.1659275e-03 -3.7274701e-03 +2364 4.736 -2.1584850e-03 -3.7149960e-03 +2365 4.738 -2.1510675e-03 -3.7025612e-03 +2366 4.74 -2.1436747e-03 -3.6901657e-03 +2367 4.742 -2.1363068e-03 -3.6778092e-03 +2368 4.744 -2.1289635e-03 -3.6654919e-03 +2369 4.746 -2.1216448e-03 -3.6532134e-03 +2370 4.748 -2.1143506e-03 -3.6409737e-03 +2371 4.75 -2.1070809e-03 -3.6287728e-03 +2372 4.752 -2.0998355e-03 -3.6166105e-03 +2373 4.754 -2.0926144e-03 -3.6044866e-03 +2374 4.756 -2.0854175e-03 -3.5924012e-03 +2375 4.758 -2.0782448e-03 -3.5803540e-03 +2376 4.76 -2.0710961e-03 -3.5683450e-03 +2377 4.762 -2.0639714e-03 -3.5563741e-03 +2378 4.764 -2.0568705e-03 -3.5444411e-03 +2379 4.766 -2.0497936e-03 -3.5325461e-03 +2380 4.768 -2.0427403e-03 -3.5206888e-03 +2381 4.77 -2.0357108e-03 -3.5088691e-03 +2382 4.772 -2.0287048e-03 -3.4970870e-03 +2383 4.774 -2.0217224e-03 -3.4853424e-03 +2384 4.776 -2.0147634e-03 -3.4736351e-03 +2385 4.778 -2.0078279e-03 -3.4619650e-03 +2386 4.78 -2.0009156e-03 -3.4503321e-03 +2387 4.782 -1.9940265e-03 -3.4387362e-03 +2388 4.784 -1.9871606e-03 -3.4271773e-03 +2389 4.786 -1.9803178e-03 -3.4156552e-03 +2390 4.788 -1.9734979e-03 -3.4041699e-03 +2391 4.79 -1.9667011e-03 -3.3927211e-03 +2392 4.792 -1.9599270e-03 -3.3813089e-03 +2393 4.794 -1.9531758e-03 -3.3699331e-03 +2394 4.796 -1.9464473e-03 -3.3585937e-03 +2395 4.798 -1.9397414e-03 -3.3472904e-03 +2396 4.8 -1.9330581e-03 -3.3360233e-03 +2397 4.802 -1.9263973e-03 -3.3247922e-03 +2398 4.804 -1.9197589e-03 -3.3135970e-03 +2399 4.806 -1.9131429e-03 -3.3024376e-03 +2400 4.808 -1.9065491e-03 -3.2913140e-03 +2401 4.81 -1.8999776e-03 -3.2802259e-03 +2402 4.812 -1.8934282e-03 -3.2691734e-03 +2403 4.814 -1.8869009e-03 -3.2581563e-03 +2404 4.816 -1.8803956e-03 -3.2471745e-03 +2405 4.818 -1.8739122e-03 -3.2362279e-03 +2406 4.82 -1.8674506e-03 -3.2253165e-03 +2407 4.822 -1.8610109e-03 -3.2144400e-03 +2408 4.824 -1.8545928e-03 -3.2035985e-03 +2409 4.826 -1.8481964e-03 -3.1927918e-03 +2410 4.828 -1.8418216e-03 -3.1820198e-03 +2411 4.83 -1.8354683e-03 -3.1712824e-03 +2412 4.832 -1.8291365e-03 -3.1605795e-03 +2413 4.834 -1.8228260e-03 -3.1499111e-03 +2414 4.836 -1.8165368e-03 -3.1392770e-03 +2415 4.838 -1.8102689e-03 -3.1286771e-03 +2416 4.84 -1.8040221e-03 -3.1181113e-03 +2417 4.842 -1.7977964e-03 -3.1075796e-03 +2418 4.844 -1.7915917e-03 -3.0970818e-03 +2419 4.846 -1.7854081e-03 -3.0866178e-03 +2420 4.848 -1.7792453e-03 -3.0761876e-03 +2421 4.85 -1.7731033e-03 -3.0657910e-03 +2422 4.852 -1.7669821e-03 -3.0554280e-03 +2423 4.854 -1.7608815e-03 -3.0450984e-03 +2424 4.856 -1.7548017e-03 -3.0348022e-03 +2425 4.858 -1.7487423e-03 -3.0245392e-03 +2426 4.86 -1.7427035e-03 -3.0143094e-03 +2427 4.862 -1.7366851e-03 -3.0041126e-03 +2428 4.864 -1.7306870e-03 -2.9939488e-03 +2429 4.866 -1.7247092e-03 -2.9838179e-03 +2430 4.868 -1.7187517e-03 -2.9737197e-03 +2431 4.87 -1.7128143e-03 -2.9636543e-03 +2432 4.872 -1.7068971e-03 -2.9536214e-03 +2433 4.874 -1.7009998e-03 -2.9436210e-03 +2434 4.876 -1.6951226e-03 -2.9336531e-03 +2435 4.878 -1.6892652e-03 -2.9237174e-03 +2436 4.88 -1.6834277e-03 -2.9138139e-03 +2437 4.882 -1.6776099e-03 -2.9039426e-03 +2438 4.884 -1.6718119e-03 -2.8941032e-03 +2439 4.886 -1.6660335e-03 -2.8842958e-03 +2440 4.888 -1.6602747e-03 -2.8745203e-03 +2441 4.89 -1.6545354e-03 -2.8647764e-03 +2442 4.892 -1.6488156e-03 -2.8550643e-03 +2443 4.894 -1.6431151e-03 -2.8453837e-03 +2444 4.896 -1.6374340e-03 -2.8357345e-03 +2445 4.898 -1.6317721e-03 -2.8261167e-03 +2446 4.9 -1.6261295e-03 -2.8165302e-03 +2447 4.902 -1.6205060e-03 -2.8069749e-03 +2448 4.904 -1.6149016e-03 -2.7974507e-03 +2449 4.906 -1.6093162e-03 -2.7879575e-03 +2450 4.908 -1.6037497e-03 -2.7784952e-03 +2451 4.91 -1.5982022e-03 -2.7690637e-03 +2452 4.912 -1.5926735e-03 -2.7596630e-03 +2453 4.914 -1.5871635e-03 -2.7502929e-03 +2454 4.916 -1.5816723e-03 -2.7409533e-03 +2455 4.918 -1.5761997e-03 -2.7316442e-03 +2456 4.92 -1.5707457e-03 -2.7223655e-03 +2457 4.922 -1.5653102e-03 -2.7131170e-03 +2458 4.924 -1.5598932e-03 -2.7038988e-03 +2459 4.926 -1.5544946e-03 -2.6947106e-03 +2460 4.928 -1.5491143e-03 -2.6855525e-03 +2461 4.93 -1.5437523e-03 -2.6764243e-03 +2462 4.932 -1.5384086e-03 -2.6673259e-03 +2463 4.934 -1.5330830e-03 -2.6582572e-03 +2464 4.936 -1.5277756e-03 -2.6492182e-03 +2465 4.938 -1.5224861e-03 -2.6402088e-03 +2466 4.94 -1.5172147e-03 -2.6312288e-03 +2467 4.942 -1.5119612e-03 -2.6222783e-03 +2468 4.944 -1.5067256e-03 -2.6133570e-03 +2469 4.946 -1.5015078e-03 -2.6044650e-03 +2470 4.948 -1.4963077e-03 -2.5956021e-03 +2471 4.95 -1.4911253e-03 -2.5867682e-03 +2472 4.952 -1.4859606e-03 -2.5779633e-03 +2473 4.954 -1.4808135e-03 -2.5691872e-03 +2474 4.956 -1.4756838e-03 -2.5604399e-03 +2475 4.958 -1.4705717e-03 -2.5517213e-03 +2476 4.96 -1.4654769e-03 -2.5430314e-03 +2477 4.962 -1.4603995e-03 -2.5343699e-03 +2478 4.964 -1.4553394e-03 -2.5257369e-03 +2479 4.966 -1.4502966e-03 -2.5171322e-03 +2480 4.968 -1.4452709e-03 -2.5085558e-03 +2481 4.97 -1.4402623e-03 -2.5000076e-03 +2482 4.972 -1.4352708e-03 -2.4914875e-03 +2483 4.974 -1.4302964e-03 -2.4829953e-03 +2484 4.976 -1.4253388e-03 -2.4745311e-03 +2485 4.978 -1.4203982e-03 -2.4660948e-03 +2486 4.98 -1.4154744e-03 -2.4576862e-03 +2487 4.982 -1.4105674e-03 -2.4493052e-03 +2488 4.984 -1.4056772e-03 -2.4409519e-03 +2489 4.986 -1.4008036e-03 -2.4326261e-03 +2490 4.988 -1.3959467e-03 -2.4243277e-03 +2491 4.99 -1.3911063e-03 -2.4160566e-03 +2492 4.992 -1.3862824e-03 -2.4078128e-03 +2493 4.994 -1.3814750e-03 -2.3995961e-03 +2494 4.996 -1.3766840e-03 -2.3914065e-03 +2495 4.998 -1.3719094e-03 -2.3832440e-03 +2496 5.0 -1.3671510e-03 -2.3751084e-03 +2497 5.002 -1.3624089e-03 -2.3669996e-03 +2498 5.004 -1.3576830e-03 -2.3589176e-03 +2499 5.006 -1.3529732e-03 -2.3508622e-03 +2500 5.008 -1.3482795e-03 -2.3428335e-03 +2501 5.01 -1.3436019e-03 -2.3348312e-03 +2502 5.012 -1.3389402e-03 -2.3268554e-03 +2503 5.014 -1.3342944e-03 -2.3189060e-03 +2504 5.016 -1.3296646e-03 -2.3109828e-03 +2505 5.018 -1.3250505e-03 -2.3030859e-03 +2506 5.02 -1.3204522e-03 -2.2952150e-03 +2507 5.022 -1.3158696e-03 -2.2873702e-03 +2508 5.024 -1.3113027e-03 -2.2795513e-03 +2509 5.026 -1.3067514e-03 -2.2717583e-03 +2510 5.028 -1.3022157e-03 -2.2639911e-03 +2511 5.03 -1.2976954e-03 -2.2562496e-03 +2512 5.032 -1.2931906e-03 -2.2485338e-03 +2513 5.034 -1.2887013e-03 -2.2408435e-03 +2514 5.036 -1.2842272e-03 -2.2331787e-03 +2515 5.038 -1.2797685e-03 -2.2255392e-03 +2516 5.04 -1.2753251e-03 -2.2179252e-03 +2517 5.042 -1.2708968e-03 -2.2103363e-03 +2518 5.044 -1.2664837e-03 -2.2027726e-03 +2519 5.046 -1.2620857e-03 -2.1952340e-03 +2520 5.048 -1.2577028e-03 -2.1877204e-03 +2521 5.05 -1.2533348e-03 -2.1802318e-03 +2522 5.052 -1.2489818e-03 -2.1727680e-03 +2523 5.054 -1.2446437e-03 -2.1653290e-03 +2524 5.056 -1.2403205e-03 -2.1579147e-03 +2525 5.058 -1.2360120e-03 -2.1505250e-03 +2526 5.06 -1.2317184e-03 -2.1431599e-03 +2527 5.062 -1.2274394e-03 -2.1358192e-03 +2528 5.064 -1.2231751e-03 -2.1285030e-03 +2529 5.066 -1.2189254e-03 -2.1212110e-03 +2530 5.068 -1.2146902e-03 -2.1139433e-03 +2531 5.07 -1.2104696e-03 -2.1066998e-03 +2532 5.072 -1.2062634e-03 -2.0994804e-03 +2533 5.074 -1.2020716e-03 -2.0922850e-03 +2534 5.076 -1.1978942e-03 -2.0851135e-03 +2535 5.078 -1.1937312e-03 -2.0779660e-03 +2536 5.08 -1.1895824e-03 -2.0708422e-03 +2537 5.082 -1.1854478e-03 -2.0637421e-03 +2538 5.084 -1.1813274e-03 -2.0566657e-03 +2539 5.086 -1.1772211e-03 -2.0496129e-03 +2540 5.088 -1.1731289e-03 -2.0425836e-03 +2541 5.09 -1.1690508e-03 -2.0355777e-03 +2542 5.092 -1.1649866e-03 -2.0285951e-03 +2543 5.094 -1.1609364e-03 -2.0216359e-03 +2544 5.096 -1.1569000e-03 -2.0146998e-03 +2545 5.098 -1.1528775e-03 -2.0077869e-03 +2546 5.1 -1.1488689e-03 -2.0008971e-03 +2547 5.102 -1.1448739e-03 -1.9940302e-03 +2548 5.104 -1.1408927e-03 -1.9871863e-03 +2549 5.106 -1.1369252e-03 -1.9803652e-03 +2550 5.108 -1.1329712e-03 -1.9735669e-03 +2551 5.11 -1.1290309e-03 -1.9667913e-03 +2552 5.112 -1.1251041e-03 -1.9600383e-03 +2553 5.114 -1.1211907e-03 -1.9533079e-03 +2554 5.116 -1.1172908e-03 -1.9466000e-03 +2555 5.118 -1.1134043e-03 -1.9399145e-03 +2556 5.12 -1.1095311e-03 -1.9332514e-03 +2557 5.122 -1.1056713e-03 -1.9266105e-03 +2558 5.124 -1.1018247e-03 -1.9199919e-03 +2559 5.126 -1.0979913e-03 -1.9133954e-03 +2560 5.128 -1.0941711e-03 -1.9068209e-03 +2561 5.13 -1.0903640e-03 -1.9002685e-03 +2562 5.132 -1.0865700e-03 -1.8937380e-03 +2563 5.134 -1.0827890e-03 -1.8872294e-03 +2564 5.136 -1.0790211e-03 -1.8807425e-03 +2565 5.138 -1.0752661e-03 -1.8742774e-03 +2566 5.14 -1.0715240e-03 -1.8678339e-03 +2567 5.142 -1.0677947e-03 -1.8614121e-03 +2568 5.144 -1.0640783e-03 -1.8550117e-03 +2569 5.146 -1.0603746e-03 -1.8486328e-03 +2570 5.148 -1.0566837e-03 -1.8422753e-03 +2571 5.15 -1.0530055e-03 -1.8359391e-03 +2572 5.152 -1.0493400e-03 -1.8296242e-03 +2573 5.154 -1.0456870e-03 -1.8233304e-03 +2574 5.156 -1.0420466e-03 -1.8170577e-03 +2575 5.158 -1.0384188e-03 -1.8108061e-03 +2576 5.16 -1.0348034e-03 -1.8045755e-03 +2577 5.162 -1.0312005e-03 -1.7983658e-03 +2578 5.164 -1.0276099e-03 -1.7921769e-03 +2579 5.166 -1.0240317e-03 -1.7860088e-03 +2580 5.168 -1.0204659e-03 -1.7798614e-03 +2581 5.17 -1.0169123e-03 -1.7737347e-03 +2582 5.172 -1.0133709e-03 -1.7676286e-03 +2583 5.174 -1.0098418e-03 -1.7615430e-03 +2584 5.176 -1.0063247e-03 -1.7554778e-03 +2585 5.178 -1.0028198e-03 -1.7494330e-03 +2586 5.18 -9.9932699e-04 -1.7434086e-03 +2587 5.182 -9.9584618e-04 -1.7374044e-03 +2588 5.184 -9.9237736e-04 -1.7314203e-03 +2589 5.186 -9.8892048e-04 -1.7254565e-03 +2590 5.188 -9.8547552e-04 -1.7195126e-03 +2591 5.19 -9.8204242e-04 -1.7135888e-03 +2592 5.192 -9.7862115e-04 -1.7076850e-03 +2593 5.194 -9.7521167e-04 -1.7018010e-03 +2594 5.196 -9.7181393e-04 -1.6959368e-03 +2595 5.198 -9.6842791e-04 -1.6900923e-03 +2596 5.2 -9.6505355e-04 -1.6842675e-03 +2597 5.202 -9.6169082e-04 -1.6784624e-03 +2598 5.204 -9.5833969e-04 -1.6726768e-03 +2599 5.206 -9.5500010e-04 -1.6669107e-03 +2600 5.208 -9.5167203e-04 -1.6611640e-03 +2601 5.21 -9.4835543e-04 -1.6554367e-03 +2602 5.212 -9.4505027e-04 -1.6497288e-03 +2603 5.214 -9.4175651e-04 -1.6440400e-03 +2604 5.216 -9.3847410e-04 -1.6383705e-03 +2605 5.218 -9.3520301e-04 -1.6327200e-03 +2606 5.22 -9.3194321e-04 -1.6270886e-03 +2607 5.222 -9.2869465e-04 -1.6214763e-03 +2608 5.224 -9.2545729e-04 -1.6158828e-03 +2609 5.226 -9.2223110e-04 -1.6103083e-03 +2610 5.228 -9.1901604e-04 -1.6047525e-03 +2611 5.23 -9.1581208e-04 -1.5992155e-03 +2612 5.232 -9.1261917e-04 -1.5936972e-03 +2613 5.234 -9.0943728e-04 -1.5881976e-03 +2614 5.236 -9.0626637e-04 -1.5827165e-03 +2615 5.238 -9.0310640e-04 -1.5772539e-03 +2616 5.24 -8.9995734e-04 -1.5718098e-03 +2617 5.242 -8.9681915e-04 -1.5663841e-03 +2618 5.244 -8.9369179e-04 -1.5609767e-03 +2619 5.246 -8.9057523e-04 -1.5555876e-03 +2620 5.248 -8.8746943e-04 -1.5502168e-03 +2621 5.25 -8.8437435e-04 -1.5448640e-03 +2622 5.252 -8.8128996e-04 -1.5395294e-03 +2623 5.254 -8.7821622e-04 -1.5342129e-03 +2624 5.256 -8.7515310e-04 -1.5289143e-03 +2625 5.258 -8.7210055e-04 -1.5236336e-03 +2626 5.26 -8.6905855e-04 -1.5183708e-03 +2627 5.262 -8.6602706e-04 -1.5131258e-03 +2628 5.264 -8.6300603e-04 -1.5078986e-03 +2629 5.266 -8.5999545e-04 -1.5026891e-03 +2630 5.268 -8.5699527e-04 -1.4974972e-03 +2631 5.27 -8.5400545e-04 -1.4923229e-03 +2632 5.272 -8.5102596e-04 -1.4871661e-03 +2633 5.274 -8.4805677e-04 -1.4820268e-03 +2634 5.276 -8.4509784e-04 -1.4769049e-03 +2635 5.278 -8.4214914e-04 -1.4718003e-03 +2636 5.28 -8.3921063e-04 -1.4667130e-03 +2637 5.282 -8.3628228e-04 -1.4616430e-03 +2638 5.284 -8.3336405e-04 -1.4565902e-03 +2639 5.286 -8.3045591e-04 -1.4515545e-03 +2640 5.288 -8.2755782e-04 -1.4465359e-03 +2641 5.29 -8.2466975e-04 -1.4415343e-03 +2642 5.292 -8.2179167e-04 -1.4365496e-03 +2643 5.294 -8.1892354e-04 -1.4315819e-03 +2644 5.296 -8.1606533e-04 -1.4266310e-03 +2645 5.298 -8.1321701e-04 -1.4216969e-03 +2646 5.3 -8.1037853e-04 -1.4167796e-03 +2647 5.302 -8.0754988e-04 -1.4118790e-03 +2648 5.304 -8.0473100e-04 -1.4069949e-03 +2649 5.306 -8.0192189e-04 -1.4021275e-03 +2650 5.308 -7.9912248e-04 -1.3972766e-03 +2651 5.31 -7.9633277e-04 -1.3924422e-03 +2652 5.312 -7.9355270e-04 -1.3876242e-03 +2653 5.314 -7.9078226e-04 -1.3828225e-03 +2654 5.316 -7.8802140e-04 -1.3780372e-03 +2655 5.318 -7.8527010e-04 -1.3732681e-03 +2656 5.32 -7.8252832e-04 -1.3685152e-03 +2657 5.322 -7.7979603e-04 -1.3637785e-03 +2658 5.324 -7.7707320e-04 -1.3590579e-03 +2659 5.326 -7.7435979e-04 -1.3543533e-03 +2660 5.328 -7.7165577e-04 -1.3496648e-03 +2661 5.33 -7.6896112e-04 -1.3449921e-03 +2662 5.332 -7.6627579e-04 -1.3403354e-03 +2663 5.334 -7.6359976e-04 -1.3356945e-03 +2664 5.336 -7.6093300e-04 -1.3310694e-03 +2665 5.338 -7.5827548e-04 -1.3264600e-03 +2666 5.34 -7.5562715e-04 -1.3218663e-03 +2667 5.342 -7.5298800e-04 -1.3172882e-03 +2668 5.344 -7.5035799e-04 -1.3127257e-03 +2669 5.346 -7.4773709e-04 -1.3081788e-03 +2670 5.348 -7.4512526e-04 -1.3036473e-03 +2671 5.35 -7.4252249e-04 -1.2991313e-03 +2672 5.352 -7.3992873e-04 -1.2946306e-03 +2673 5.354 -7.3734396e-04 -1.2901453e-03 +2674 5.356 -7.3476814e-04 -1.2856752e-03 +2675 5.358 -7.3220124e-04 -1.2812204e-03 +2676 5.36 -7.2964325e-04 -1.2767807e-03 +2677 5.362 -7.2709411e-04 -1.2723562e-03 +2678 5.364 -7.2455381e-04 -1.2679467e-03 +2679 5.366 -7.2202232e-04 -1.2635523e-03 +2680 5.368 -7.1949959e-04 -1.2591728e-03 +2681 5.37 -7.1698561e-04 -1.2548083e-03 +2682 5.372 -7.1448035e-04 -1.2504587e-03 +2683 5.374 -7.1198377e-04 -1.2461239e-03 +2684 5.376 -7.0949584e-04 -1.2418038e-03 +2685 5.378 -7.0701654e-04 -1.2374985e-03 +2686 5.38 -7.0454584e-04 -1.2332079e-03 +2687 5.382 -7.0208370e-04 -1.2289319e-03 +2688 5.384 -6.9963010e-04 -1.2246706e-03 +2689 5.386 -6.9718501e-04 -1.2204237e-03 +2690 5.388 -6.9474840e-04 -1.2161914e-03 +2691 5.39 -6.9232024e-04 -1.2119734e-03 +2692 5.392 -6.8990049e-04 -1.2077699e-03 +2693 5.394 -6.8748915e-04 -1.2035808e-03 +2694 5.396 -6.8508616e-04 -1.1994059e-03 +2695 5.398 -6.8269151e-04 -1.1952453e-03 +2696 5.4 -6.8030517e-04 -1.1910989e-03 +2697 5.402 -6.7792711e-04 -1.1869667e-03 +2698 5.404 -6.7555730e-04 -1.1828486e-03 +2699 5.406 -6.7319570e-04 -1.1787445e-03 +2700 5.408 -6.7084231e-04 -1.1746545e-03 +2701 5.41 -6.6849708e-04 -1.1705784e-03 +2702 5.412 -6.6615999e-04 -1.1665163e-03 +2703 5.414 -6.6383100e-04 -1.1624680e-03 +2704 5.416 -6.6151010e-04 -1.1584336e-03 +2705 5.418 -6.5919726e-04 -1.1544130e-03 +2706 5.42 -6.5689244e-04 -1.1504061e-03 +2707 5.422 -6.5459563e-04 -1.1464130e-03 +2708 5.424 -6.5230678e-04 -1.1424334e-03 +2709 5.426 -6.5002588e-04 -1.1384675e-03 +2710 5.428 -6.4775290e-04 -1.1345152e-03 +2711 5.43 -6.4548781e-04 -1.1305763e-03 +2712 5.432 -6.4323059e-04 -1.1266510e-03 +2713 5.434 -6.4098120e-04 -1.1227391e-03 +2714 5.436 -6.3873962e-04 -1.1188405e-03 +2715 5.438 -6.3650583e-04 -1.1149553e-03 +2716 5.44 -6.3427979e-04 -1.1110834e-03 +2717 5.442 -6.3206149e-04 -1.1072248e-03 +2718 5.444 -6.2985089e-04 -1.1033793e-03 +2719 5.446 -6.2764796e-04 -1.0995470e-03 +2720 5.448 -6.2545269e-04 -1.0957279e-03 +2721 5.45 -6.2326504e-04 -1.0919218e-03 +2722 5.452 -6.2108499e-04 -1.0881288e-03 +2723 5.454 -6.1891252e-04 -1.0843487e-03 +2724 5.456 -6.1674759e-04 -1.0805816e-03 +2725 5.458 -6.1459018e-04 -1.0768274e-03 +2726 5.46 -6.1244027e-04 -1.0730860e-03 +2727 5.462 -6.1029783e-04 -1.0693575e-03 +2728 5.464 -6.0816283e-04 -1.0656418e-03 +2729 5.466 -6.0603525e-04 -1.0619388e-03 +2730 5.468 -6.0391507e-04 -1.0582484e-03 +2731 5.47 -6.0180225e-04 -1.0545708e-03 +2732 5.472 -5.9969678e-04 -1.0509057e-03 +2733 5.474 -5.9759862e-04 -1.0472532e-03 +2734 5.476 -5.9550776e-04 -1.0436132e-03 +2735 5.478 -5.9342416e-04 -1.0399857e-03 +2736 5.48 -5.9134780e-04 -1.0363707e-03 +2737 5.482 -5.8927867e-04 -1.0327680e-03 +2738 5.484 -5.8721672e-04 -1.0291777e-03 +2739 5.486 -5.8516195e-04 -1.0255997e-03 +2740 5.488 -5.8311432e-04 -1.0220340e-03 +2741 5.49 -5.8107381e-04 -1.0184805e-03 +2742 5.492 -5.7904039e-04 -1.0149392e-03 +2743 5.494 -5.7701404e-04 -1.0114101e-03 +2744 5.496 -5.7499474e-04 -1.0078931e-03 +2745 5.498 -5.7298246e-04 -1.0043881e-03 +2746 5.5 -5.7097718e-04 -1.0008952e-03 +2747 5.502 -5.6897887e-04 -9.9741425e-04 +2748 5.504 -5.6698751e-04 -9.9394527e-04 +2749 5.506 -5.6500308e-04 -9.9048820e-04 +2750 5.508 -5.6302555e-04 -9.8704300e-04 +2751 5.51 -5.6105490e-04 -9.8360963e-04 +2752 5.512 -5.5909111e-04 -9.8018805e-04 +2753 5.514 -5.5713414e-04 -9.7677823e-04 +2754 5.516 -5.5518399e-04 -9.7338012e-04 +2755 5.518 -5.5324061e-04 -9.6999368e-04 +2756 5.52 -5.5130400e-04 -9.6661888e-04 +2757 5.522 -5.4937413e-04 -9.6325567e-04 +2758 5.524 -5.4745097e-04 -9.5990402e-04 +2759 5.526 -5.4553451e-04 -9.5656389e-04 +2760 5.528 -5.4362471e-04 -9.5323524e-04 +2761 5.53 -5.4172156e-04 -9.4991803e-04 +2762 5.532 -5.3982503e-04 -9.4661223e-04 +2763 5.534 -5.3793510e-04 -9.4331778e-04 +2764 5.536 -5.3605175e-04 -9.4003467e-04 +2765 5.538 -5.3417496e-04 -9.3676284e-04 +2766 5.54 -5.3230469e-04 -9.3350227e-04 +2767 5.542 -5.3044094e-04 -9.3025290e-04 +2768 5.544 -5.2858367e-04 -9.2701472e-04 +2769 5.546 -5.2673287e-04 -9.2378767e-04 +2770 5.548 -5.2488852e-04 -9.2057172e-04 +2771 5.55 -5.2305058e-04 -9.1736684e-04 +2772 5.552 -5.2121904e-04 -9.1417298e-04 +2773 5.554 -5.1939388e-04 -9.1099011e-04 +2774 5.556 -5.1757507e-04 -9.0781820e-04 +2775 5.558 -5.1576260e-04 -9.0465720e-04 +2776 5.56 -5.1395644e-04 -9.0150708e-04 +2777 5.562 -5.1215656e-04 -8.9836780e-04 +2778 5.564 -5.1036296e-04 -8.9523933e-04 +2779 5.566 -5.0857560e-04 -8.9212163e-04 +2780 5.568 -5.0679446e-04 -8.8901466e-04 +2781 5.57 -5.0501953e-04 -8.8591839e-04 +2782 5.572 -5.0325078e-04 -8.8283278e-04 +2783 5.574 -5.0148820e-04 -8.7975780e-04 +2784 5.576 -4.9973175e-04 -8.7669340e-04 +2785 5.578 -4.9798141e-04 -8.7363956e-04 +2786 5.58 -4.9623718e-04 -8.7059624e-04 +2787 5.582 -4.9449902e-04 -8.6756341e-04 +2788 5.584 -4.9276692e-04 -8.6454102e-04 +2789 5.586 -4.9104085e-04 -8.6152905e-04 +2790 5.588 -4.8932080e-04 -8.5852745e-04 +2791 5.59 -4.8760674e-04 -8.5553620e-04 +2792 5.592 -4.8589865e-04 -8.5255525e-04 +2793 5.594 -4.8419651e-04 -8.4958458e-04 +2794 5.596 -4.8250030e-04 -8.4662415e-04 +2795 5.598 -4.8081000e-04 -8.4367392e-04 +2796 5.6 -4.7912560e-04 -8.4073386e-04 +2797 5.602 -4.7744706e-04 -8.3780394e-04 +2798 5.604 -4.7577438e-04 -8.3488412e-04 +2799 5.606 -4.7410752e-04 -8.3197437e-04 +2800 5.608 -4.7244647e-04 -8.2907465e-04 +2801 5.61 -4.7079121e-04 -8.2618493e-04 +2802 5.612 -4.6914172e-04 -8.2330518e-04 +2803 5.614 -4.6749799e-04 -8.2043536e-04 +2804 5.616 -4.6585998e-04 -8.1757543e-04 +2805 5.618 -4.6422768e-04 -8.1472538e-04 +2806 5.62 -4.6260107e-04 -8.1188515e-04 +2807 5.622 -4.6098013e-04 -8.0905473e-04 +2808 5.624 -4.5936484e-04 -8.0623407e-04 +2809 5.626 -4.5775519e-04 -8.0342315e-04 +2810 5.628 -4.5615114e-04 -8.0062192e-04 +2811 5.63 -4.5455269e-04 -7.9783036e-04 +2812 5.632 -4.5295982e-04 -7.9504844e-04 +2813 5.634 -4.5137249e-04 -7.9227612e-04 +2814 5.636 -4.4979071e-04 -7.8951337e-04 +2815 5.638 -4.4821443e-04 -7.8676015e-04 +2816 5.64 -4.4664366e-04 -7.8401644e-04 +2817 5.642 -4.4507836e-04 -7.8128221e-04 +2818 5.644 -4.4351852e-04 -7.7855741e-04 +2819 5.646 -4.4196413e-04 -7.7584203e-04 +2820 5.648 -4.4041515e-04 -7.7313602e-04 +2821 5.65 -4.3887158e-04 -7.7043936e-04 +2822 5.652 -4.3733339e-04 -7.6775201e-04 +2823 5.654 -4.3580056e-04 -7.6507394e-04 +2824 5.656 -4.3427308e-04 -7.6240513e-04 +2825 5.658 -4.3275093e-04 -7.5974553e-04 +2826 5.66 -4.3123410e-04 -7.5709512e-04 +2827 5.662 -4.2972255e-04 -7.5445387e-04 +2828 5.664 -4.2821627e-04 -7.5182175e-04 +2829 5.666 -4.2671525e-04 -7.4919872e-04 +2830 5.668 -4.2521947e-04 -7.4658476e-04 +2831 5.67 -4.2372891e-04 -7.4397983e-04 +2832 5.672 -4.2224355e-04 -7.4138390e-04 +2833 5.674 -4.2076337e-04 -7.3879695e-04 +2834 5.676 -4.1928835e-04 -7.3621894e-04 +2835 5.678 -4.1781849e-04 -7.3364984e-04 +2836 5.68 -4.1635375e-04 -7.3108962e-04 +2837 5.682 -4.1489412e-04 -7.2853825e-04 +2838 5.684 -4.1343959e-04 -7.2599571e-04 +2839 5.686 -4.1199013e-04 -7.2346196e-04 +2840 5.688 -4.1054574e-04 -7.2093697e-04 +2841 5.69 -4.0910638e-04 -7.1842071e-04 +2842 5.692 -4.0767205e-04 -7.1591316e-04 +2843 5.694 -4.0624272e-04 -7.1341427e-04 +2844 5.696 -4.0481838e-04 -7.1092403e-04 +2845 5.698 -4.0339902e-04 -7.0844241e-04 +2846 5.7 -4.0198461e-04 -7.0596937e-04 +2847 5.702 -4.0057514e-04 -7.0350489e-04 +2848 5.704 -3.9917058e-04 -7.0104893e-04 +2849 5.706 -3.9777093e-04 -6.9860147e-04 +2850 5.708 -3.9637617e-04 -6.9616248e-04 +2851 5.71 -3.9498628e-04 -6.9373193e-04 +2852 5.712 -3.9360124e-04 -6.9130980e-04 +2853 5.714 -3.9222103e-04 -6.8889604e-04 +2854 5.716 -3.9084565e-04 -6.8649064e-04 +2855 5.718 -3.8947507e-04 -6.8409357e-04 +2856 5.72 -3.8810927e-04 -6.8170479e-04 +2857 5.722 -3.8674824e-04 -6.7932429e-04 +2858 5.724 -3.8539197e-04 -6.7695202e-04 +2859 5.726 -3.8404043e-04 -6.7458797e-04 +2860 5.728 -3.8269361e-04 -6.7223210e-04 +2861 5.73 -3.8135149e-04 -6.6988440e-04 +2862 5.732 -3.8001407e-04 -6.6754482e-04 +2863 5.734 -3.7868131e-04 -6.6521334e-04 +2864 5.736 -3.7735321e-04 -6.6288994e-04 +2865 5.738 -3.7602974e-04 -6.6057458e-04 +2866 5.74 -3.7471090e-04 -6.5826725e-04 +2867 5.742 -3.7339667e-04 -6.5596791e-04 +2868 5.744 -3.7208703e-04 -6.5367653e-04 +2869 5.746 -3.7078196e-04 -6.5139309e-04 +2870 5.748 -3.6948145e-04 -6.4911757e-04 +2871 5.75 -3.6818548e-04 -6.4684992e-04 +2872 5.752 -3.6689404e-04 -6.4459014e-04 +2873 5.754 -3.6560712e-04 -6.4233818e-04 +2874 5.756 -3.6432469e-04 -6.4009403e-04 +2875 5.758 -3.6304674e-04 -6.3785766e-04 +2876 5.76 -3.6177325e-04 -6.3562903e-04 +2877 5.762 -3.6050421e-04 -6.3340813e-04 +2878 5.764 -3.5923961e-04 -6.3119493e-04 +2879 5.766 -3.5797943e-04 -6.2898940e-04 +2880 5.768 -3.5672365e-04 -6.2679152e-04 +2881 5.77 -3.5547226e-04 -6.2460126e-04 +2882 5.772 -3.5422524e-04 -6.2241859e-04 +2883 5.774 -3.5298258e-04 -6.2024348e-04 +2884 5.776 -3.5174426e-04 -6.1807592e-04 +2885 5.778 -3.5051027e-04 -6.1591588e-04 +2886 5.78 -3.4928059e-04 -6.1376332e-04 +2887 5.782 -3.4805521e-04 -6.1161824e-04 +2888 5.784 -3.4683411e-04 -6.0948059e-04 +2889 5.786 -3.4561729e-04 -6.0735035e-04 +2890 5.788 -3.4440471e-04 -6.0522750e-04 +2891 5.79 -3.4319637e-04 -6.0311202e-04 +2892 5.792 -3.4199226e-04 -6.0100388e-04 +2893 5.794 -3.4079235e-04 -5.9890304e-04 +2894 5.796 -3.3959664e-04 -5.9680950e-04 +2895 5.798 -3.3840511e-04 -5.9472322e-04 +2896 5.8 -3.3721774e-04 -5.9264418e-04 +2897 5.802 -3.3603453e-04 -5.9057235e-04 +2898 5.804 -3.3485545e-04 -5.8850771e-04 +2899 5.806 -3.3368049e-04 -5.8645024e-04 +2900 5.808 -3.3250964e-04 -5.8439991e-04 +2901 5.81 -3.3134289e-04 -5.8235669e-04 +2902 5.812 -3.3018021e-04 -5.8032056e-04 +2903 5.814 -3.2902160e-04 -5.7829150e-04 +2904 5.816 -3.2786704e-04 -5.7626949e-04 +2905 5.818 -3.2671652e-04 -5.7425449e-04 +2906 5.82 -3.2557002e-04 -5.7224649e-04 +2907 5.822 -3.2442753e-04 -5.7024546e-04 +2908 5.824 -3.2328903e-04 -5.6825138e-04 +2909 5.826 -3.2215452e-04 -5.6626422e-04 +2910 5.828 -3.2102397e-04 -5.6428396e-04 +2911 5.83 -3.1989737e-04 -5.6231057e-04 +2912 5.832 -3.1877472e-04 -5.6034404e-04 +2913 5.834 -3.1765599e-04 -5.5838434e-04 +2914 5.836 -3.1654118e-04 -5.5643144e-04 +2915 5.838 -3.1543026e-04 -5.5448533e-04 +2916 5.84 -3.1432323e-04 -5.5254597e-04 +2917 5.842 -3.1322008e-04 -5.5061336e-04 +2918 5.844 -3.1212078e-04 -5.4868745e-04 +2919 5.846 -3.1102532e-04 -5.4676824e-04 +2920 5.848 -3.0993370e-04 -5.4485569e-04 +2921 5.85 -3.0884589e-04 -5.4294978e-04 +2922 5.852 -3.0776189e-04 -5.4105050e-04 +2923 5.854 -3.0668169e-04 -5.3915782e-04 +2924 5.856 -3.0560526e-04 -5.3727171e-04 +2925 5.858 -3.0453260e-04 -5.3539216e-04 +2926 5.86 -3.0346369e-04 -5.3351914e-04 +2927 5.862 -3.0239852e-04 -5.3165262e-04 +2928 5.864 -3.0133707e-04 -5.2979260e-04 +2929 5.866 -3.0027934e-04 -5.2793903e-04 +2930 5.868 -2.9922531e-04 -5.2609191e-04 +2931 5.87 -2.9817497e-04 -5.2425121e-04 +2932 5.872 -2.9712830e-04 -5.2241691e-04 +2933 5.874 -2.9608530e-04 -5.2058899e-04 +2934 5.876 -2.9504594e-04 -5.1876742e-04 +2935 5.878 -2.9401022e-04 -5.1695218e-04 +2936 5.88 -2.9297813e-04 -5.1514325e-04 +2937 5.882 -2.9194965e-04 -5.1334061e-04 +2938 5.884 -2.9092476e-04 -5.1154424e-04 +2939 5.886 -2.8990346e-04 -5.0975411e-04 +2940 5.888 -2.8888574e-04 -5.0797021e-04 +2941 5.89 -2.8787158e-04 -5.0619252e-04 +2942 5.892 -2.8686097e-04 -5.0442100e-04 +2943 5.894 -2.8585389e-04 -5.0265565e-04 +2944 5.896 -2.8485034e-04 -5.0089643e-04 +2945 5.898 -2.8385030e-04 -4.9914333e-04 +2946 5.9 -2.8285376e-04 -4.9739633e-04 +2947 5.902 -2.8186071e-04 -4.9565541e-04 +2948 5.904 -2.8087114e-04 -4.9392054e-04 +2949 5.906 -2.7988503e-04 -4.9219171e-04 +2950 5.908 -2.7890237e-04 -4.9046889e-04 +2951 5.91 -2.7792315e-04 -4.8875207e-04 +2952 5.912 -2.7694735e-04 -4.8704122e-04 +2953 5.914 -2.7597498e-04 -4.8533632e-04 +2954 5.916 -2.7500601e-04 -4.8363735e-04 +2955 5.918 -2.7404042e-04 -4.8194430e-04 +2956 5.92 -2.7307822e-04 -4.8025713e-04 +2957 5.922 -2.7211939e-04 -4.7857584e-04 +2958 5.924 -2.7116392e-04 -4.7690040e-04 +2959 5.926 -2.7021179e-04 -4.7523079e-04 +2960 5.928 -2.6926299e-04 -4.7356698e-04 +2961 5.93 -2.6831751e-04 -4.7190897e-04 +2962 5.932 -2.6737535e-04 -4.7025673e-04 +2963 5.934 -2.6643648e-04 -4.6861025e-04 +2964 5.936 -2.6550091e-04 -4.6696949e-04 +2965 5.938 -2.6456860e-04 -4.6533444e-04 +2966 5.94 -2.6363956e-04 -4.6370509e-04 +2967 5.942 -2.6271378e-04 -4.6208141e-04 +2968 5.944 -2.6179123e-04 -4.6046338e-04 +2969 5.946 -2.6087192e-04 -4.5885098e-04 +2970 5.948 -2.5995583e-04 -4.5724420e-04 +2971 5.95 -2.5904294e-04 -4.5564301e-04 +2972 5.952 -2.5813325e-04 -4.5404740e-04 +2973 5.954 -2.5722675e-04 -4.5245734e-04 +2974 5.956 -2.5632342e-04 -4.5087282e-04 +2975 5.958 -2.5542325e-04 -4.4929382e-04 +2976 5.96 -2.5452624e-04 -4.4772032e-04 +2977 5.962 -2.5363237e-04 -4.4615230e-04 +2978 5.964 -2.5274163e-04 -4.4458973e-04 +2979 5.966 -2.5185400e-04 -4.4303262e-04 +2980 5.968 -2.5096949e-04 -4.4148092e-04 +2981 5.97 -2.5008808e-04 -4.3993463e-04 +2982 5.972 -2.4920975e-04 -4.3839373e-04 +2983 5.974 -2.4833450e-04 -4.3685819e-04 +2984 5.976 -2.4746231e-04 -4.3532800e-04 +2985 5.978 -2.4659318e-04 -4.3380314e-04 +2986 5.98 -2.4572710e-04 -4.3228360e-04 +2987 5.982 -2.4486405e-04 -4.3076935e-04 +2988 5.984 -2.4400402e-04 -4.2926038e-04 +2989 5.986 -2.4314700e-04 -4.2775666e-04 +2990 5.988 -2.4229299e-04 -4.2625818e-04 +2991 5.99 -2.4144196e-04 -4.2476493e-04 +2992 5.992 -2.4059392e-04 -4.2327688e-04 +2993 5.994 -2.3974885e-04 -4.2179401e-04 +2994 5.996 -2.3890674e-04 -4.2031631e-04 +2995 5.998 -2.3806758e-04 -4.1884376e-04 +2996 6.0 -2.3723137e-04 -4.1737635e-04 +2997 6.002 -2.3639808e-04 -4.1591405e-04 +2998 6.004 -2.3556771e-04 -4.1445684e-04 +2999 6.006 -2.3474024e-04 -4.1300472e-04 +3000 6.008 -2.3391568e-04 -4.1155765e-04 +3001 6.01 -2.3309401e-04 -4.1011563e-04 +3002 6.012 -2.3227522e-04 -4.0867864e-04 +3003 6.014 -2.3145929e-04 -4.0724666e-04 +3004 6.016 -2.3064623e-04 -4.0581967e-04 +3005 6.018 -2.2983601e-04 -4.0439765e-04 +3006 6.02 -2.2902863e-04 -4.0298059e-04 +3007 6.022 -2.2822409e-04 -4.0156847e-04 +3008 6.024 -2.2742236e-04 -4.0016128e-04 +3009 6.026 -2.2662344e-04 -3.9875899e-04 +3010 6.028 -2.2582732e-04 -3.9736160e-04 +3011 6.03 -2.2503399e-04 -3.9596907e-04 +3012 6.032 -2.2424344e-04 -3.9458140e-04 +3013 6.034 -2.2345566e-04 -3.9319857e-04 +3014 6.036 -2.2267064e-04 -3.9182057e-04 +3015 6.038 -2.2188837e-04 -3.9044737e-04 +3016 6.04 -2.2110885e-04 -3.8907895e-04 +3017 6.042 -2.2033205e-04 -3.8771532e-04 +3018 6.044 -2.1955798e-04 -3.8635643e-04 +3019 6.046 -2.1878663e-04 -3.8500229e-04 +3020 6.048 -2.1801797e-04 -3.8365287e-04 +3021 6.05 -2.1725201e-04 -3.8230816e-04 +3022 6.052 -2.1648873e-04 -3.8096814e-04 +3023 6.054 -2.1572813e-04 -3.7963279e-04 +3024 6.056 -2.1497020e-04 -3.7830211e-04 +3025 6.058 -2.1421492e-04 -3.7697606e-04 +3026 6.06 -2.1346229e-04 -3.7565464e-04 +3027 6.062 -2.1271230e-04 -3.7433784e-04 +3028 6.064 -2.1196494e-04 -3.7302562e-04 +3029 6.066 -2.1122020e-04 -3.7171799e-04 +3030 6.068 -2.1047806e-04 -3.7041492e-04 +3031 6.07 -2.0973853e-04 -3.6911639e-04 +3032 6.072 -2.0900160e-04 -3.6782240e-04 +3033 6.074 -2.0826724e-04 -3.6653292e-04 +3034 6.076 -2.0753546e-04 -3.6524794e-04 +3035 6.078 -2.0680625e-04 -3.6396745e-04 +3036 6.08 -2.0607959e-04 -3.6269142e-04 +3037 6.082 -2.0535548e-04 -3.6141985e-04 +3038 6.084 -2.0463391e-04 -3.6015272e-04 +3039 6.086 -2.0391486e-04 -3.5889001e-04 +3040 6.088 -2.0319834e-04 -3.5763171e-04 +3041 6.09 -2.0248433e-04 -3.5637779e-04 +3042 6.092 -2.0177283e-04 -3.5512826e-04 +3043 6.094 -2.0106382e-04 -3.5388309e-04 +3044 6.096 -2.0035729e-04 -3.5264227e-04 +3045 6.098 -1.9965325e-04 -3.5140577e-04 +3046 6.1 -1.9895167e-04 -3.5017360e-04 +3047 6.102 -1.9825255e-04 -3.4894572e-04 +3048 6.104 -1.9755588e-04 -3.4772213e-04 +3049 6.106 -1.9686166e-04 -3.4650282e-04 +3050 6.108 -1.9616987e-04 -3.4528776e-04 +3051 6.11 -1.9548050e-04 -3.4407695e-04 +3052 6.112 -1.9479356e-04 -3.4287036e-04 +3053 6.114 -1.9410902e-04 -3.4166798e-04 +3054 6.116 -1.9342688e-04 -3.4046981e-04 +3055 6.118 -1.9274714e-04 -3.3927582e-04 +3056 6.12 -1.9206978e-04 -3.3808599e-04 +3057 6.122 -1.9139479e-04 -3.3690033e-04 +3058 6.124 -1.9072217e-04 -3.3571880e-04 +3059 6.126 -1.9005191e-04 -3.3454140e-04 +3060 6.128 -1.8938400e-04 -3.3336812e-04 +3061 6.13 -1.8871844e-04 -3.3219893e-04 +3062 6.132 -1.8805521e-04 -3.3103382e-04 +3063 6.134 -1.8739430e-04 -3.2987279e-04 +3064 6.136 -1.8673571e-04 -3.2871581e-04 +3065 6.138 -1.8607943e-04 -3.2756287e-04 +3066 6.14 -1.8542546e-04 -3.2641396e-04 +3067 6.142 -1.8477377e-04 -3.2526906e-04 +3068 6.144 -1.8412438e-04 -3.2412816e-04 +3069 6.146 -1.8347726e-04 -3.2299125e-04 +3070 6.148 -1.8283241e-04 -3.2185831e-04 +3071 6.15 -1.8218982e-04 -3.2072932e-04 +3072 6.152 -1.8154949e-04 -3.1960429e-04 +3073 6.154 -1.8091140e-04 -3.1848318e-04 +3074 6.156 -1.8027556e-04 -3.1736599e-04 +3075 6.158 -1.7964194e-04 -3.1625270e-04 +3076 6.16 -1.7901054e-04 -3.1514331e-04 +3077 6.162 -1.7838136e-04 -3.1403779e-04 +3078 6.164 -1.7775439e-04 -3.1293613e-04 +3079 6.166 -1.7712961e-04 -3.1183832e-04 +3080 6.168 -1.7650703e-04 -3.1074435e-04 +3081 6.17 -1.7588663e-04 -3.0965421e-04 +3082 6.172 -1.7526841e-04 -3.0856787e-04 +3083 6.174 -1.7465236e-04 -3.0748533e-04 +3084 6.176 -1.7403847e-04 -3.0640657e-04 +3085 6.178 -1.7342673e-04 -3.0533159e-04 +3086 6.18 -1.7281714e-04 -3.0426036e-04 +3087 6.182 -1.7220969e-04 -3.0319287e-04 +3088 6.184 -1.7160437e-04 -3.0212912e-04 +3089 6.186 -1.7100117e-04 -3.0106908e-04 +3090 6.188 -1.7040009e-04 -3.0001275e-04 +3091 6.19 -1.6980112e-04 -2.9896011e-04 +3092 6.192 -1.6920424e-04 -2.9791115e-04 +3093 6.194 -1.6860947e-04 -2.9686586e-04 +3094 6.196 -1.6801678e-04 -2.9582422e-04 +3095 6.198 -1.6742617e-04 -2.9478623e-04 +3096 6.2 -1.6683763e-04 -2.9375186e-04 +3097 6.202 -1.6625116e-04 -2.9272111e-04 +3098 6.204 -1.6566674e-04 -2.9169397e-04 +3099 6.206 -1.6508438e-04 -2.9067041e-04 +3100 6.208 -1.6450406e-04 -2.8965043e-04 +3101 6.21 -1.6392578e-04 -2.8863402e-04 +3102 6.212 -1.6334952e-04 -2.8762117e-04 +3103 6.214 -1.6277529e-04 -2.8661185e-04 +3104 6.216 -1.6220307e-04 -2.8560607e-04 +3105 6.218 -1.6163286e-04 -2.8460380e-04 +3106 6.22 -1.6106465e-04 -2.8360504e-04 +3107 6.222 -1.6049844e-04 -2.8260977e-04 +3108 6.224 -1.5993421e-04 -2.8161798e-04 +3109 6.226 -1.5937197e-04 -2.8062966e-04 +3110 6.228 -1.5881169e-04 -2.7964479e-04 +3111 6.23 -1.5825338e-04 -2.7866337e-04 +3112 6.232 -1.5769704e-04 -2.7768538e-04 +3113 6.234 -1.5714264e-04 -2.7671082e-04 +3114 6.236 -1.5659019e-04 -2.7573966e-04 +3115 6.238 -1.5603968e-04 -2.7477190e-04 +3116 6.24 -1.5549110e-04 -2.7380752e-04 +3117 6.242 -1.5494445e-04 -2.7284652e-04 +3118 6.244 -1.5439971e-04 -2.7188888e-04 +3119 6.246 -1.5385689e-04 -2.7093458e-04 +3120 6.248 -1.5331597e-04 -2.6998363e-04 +3121 6.25 -1.5277695e-04 -2.6903600e-04 +3122 6.252 -1.5223983e-04 -2.6809169e-04 +3123 6.254 -1.5170458e-04 -2.6715068e-04 +3124 6.256 -1.5117122e-04 -2.6621297e-04 +3125 6.258 -1.5063973e-04 -2.6527853e-04 +3126 6.26 -1.5011010e-04 -2.6434737e-04 +3127 6.262 -1.4958234e-04 -2.6341946e-04 +3128 6.264 -1.4905642e-04 -2.6249480e-04 +3129 6.266 -1.4853236e-04 -2.6157337e-04 +3130 6.268 -1.4801013e-04 -2.6065517e-04 +3131 6.27 -1.4748973e-04 -2.5974018e-04 +3132 6.272 -1.4697117e-04 -2.5882839e-04 +3133 6.274 -1.4645442e-04 -2.5791980e-04 +3134 6.276 -1.4593949e-04 -2.5701438e-04 +3135 6.278 -1.4542636e-04 -2.5611213e-04 +3136 6.28 -1.4491503e-04 -2.5521304e-04 +3137 6.282 -1.4440550e-04 -2.5431709e-04 +3138 6.284 -1.4389776e-04 -2.5342428e-04 +3139 6.286 -1.4339181e-04 -2.5253460e-04 +3140 6.288 -1.4288762e-04 -2.5164802e-04 +3141 6.29 -1.4238521e-04 -2.5076456e-04 +3142 6.292 -1.4188456e-04 -2.4988418e-04 +3143 6.294 -1.4138567e-04 -2.4900688e-04 +3144 6.296 -1.4088853e-04 -2.4813266e-04 +3145 6.298 -1.4039314e-04 -2.4726149e-04 +3146 6.3 -1.3989949e-04 -2.4639338e-04 +3147 6.302 -1.3940756e-04 -2.4552830e-04 +3148 6.304 -1.3891737e-04 -2.4466625e-04 +3149 6.306 -1.3842890e-04 -2.4380722e-04 +3150 6.308 -1.3794214e-04 -2.4295120e-04 +3151 6.31 -1.3745709e-04 -2.4209817e-04 +3152 6.312 -1.3697374e-04 -2.4124813e-04 +3153 6.314 -1.3649210e-04 -2.4040106e-04 +3154 6.316 -1.3601214e-04 -2.3955696e-04 +3155 6.318 -1.3553387e-04 -2.3871582e-04 +3156 6.32 -1.3505727e-04 -2.3787762e-04 +3157 6.322 -1.3458235e-04 -2.3704235e-04 +3158 6.324 -1.3410910e-04 -2.3621001e-04 +3159 6.326 -1.3363751e-04 -2.3538058e-04 +3160 6.328 -1.3316758e-04 -2.3455406e-04 +3161 6.33 -1.3269929e-04 -2.3373043e-04 +3162 6.332 -1.3223265e-04 -2.3290968e-04 +3163 6.334 -1.3176765e-04 -2.3209181e-04 +3164 6.336 -1.3130429e-04 -2.3127680e-04 +3165 6.338 -1.3084254e-04 -2.3046465e-04 +3166 6.34 -1.3038242e-04 -2.2965534e-04 +3167 6.342 -1.2992392e-04 -2.2884886e-04 +3168 6.344 -1.2946703e-04 -2.2804521e-04 +3169 6.346 -1.2901174e-04 -2.2724437e-04 +3170 6.348 -1.2855805e-04 -2.2644634e-04 +3171 6.35 -1.2810595e-04 -2.2565110e-04 +3172 6.352 -1.2765544e-04 -2.2485865e-04 +3173 6.354 -1.2720651e-04 -2.2406897e-04 +3174 6.356 -1.2675916e-04 -2.2328206e-04 +3175 6.358 -1.2631338e-04 -2.2249790e-04 +3176 6.36 -1.2586917e-04 -2.2171649e-04 +3177 6.362 -1.2542652e-04 -2.2093782e-04 +3178 6.364 -1.2498542e-04 -2.2016187e-04 +3179 6.366 -1.2454587e-04 -2.1938864e-04 +3180 6.368 -1.2410786e-04 -2.1861812e-04 +3181 6.37 -1.2367139e-04 -2.1785030e-04 +3182 6.372 -1.2323646e-04 -2.1708517e-04 +3183 6.374 -1.2280305e-04 -2.1632272e-04 +3184 6.376 -1.2237117e-04 -2.1556294e-04 +3185 6.378 -1.2194080e-04 -2.1480582e-04 +3186 6.38 -1.2151194e-04 -2.1405135e-04 +3187 6.382 -1.2108459e-04 -2.1329953e-04 +3188 6.384 -1.2065874e-04 -2.1255034e-04 +3189 6.386 -1.2023439e-04 -2.1180378e-04 +3190 6.388 -1.1981152e-04 -2.1105983e-04 +3191 6.39 -1.1939015e-04 -2.1031848e-04 +3192 6.392 -1.1897025e-04 -2.0957974e-04 +3193 6.394 -1.1855182e-04 -2.0884358e-04 +3194 6.396 -1.1813487e-04 -2.0811000e-04 +3195 6.398 -1.1771938e-04 -2.0737899e-04 +3196 6.4 -1.1730535e-04 -2.0665054e-04 +3197 6.402 -1.1689278e-04 -2.0592465e-04 +3198 6.404 -1.1648165e-04 -2.0520129e-04 +3199 6.406 -1.1607197e-04 -2.0448048e-04 +3200 6.408 -1.1566373e-04 -2.0376219e-04 +3201 6.41 -1.1525692e-04 -2.0304641e-04 +3202 6.412 -1.1485154e-04 -2.0233314e-04 +3203 6.414 -1.1444759e-04 -2.0162238e-04 +3204 6.416 -1.1404505e-04 -2.0091410e-04 +3205 6.418 -1.1364393e-04 -2.0020831e-04 +3206 6.42 -1.1324422e-04 -1.9950498e-04 +3207 6.422 -1.1284591e-04 -1.9880413e-04 +3208 6.424 -1.1244900e-04 -1.9810573e-04 +3209 6.426 -1.1205348e-04 -1.9740977e-04 +3210 6.428 -1.1165936e-04 -1.9671626e-04 +3211 6.43 -1.1126662e-04 -1.9602518e-04 +3212 6.432 -1.1087526e-04 -1.9533652e-04 +3213 6.434 -1.1048527e-04 -1.9465027e-04 +3214 6.436 -1.1009665e-04 -1.9396642e-04 +3215 6.438 -1.0970940e-04 -1.9328498e-04 +3216 6.44 -1.0932351e-04 -1.9260592e-04 +3217 6.442 -1.0893898e-04 -1.9192924e-04 +3218 6.444 -1.0855579e-04 -1.9125494e-04 +3219 6.446 -1.0817396e-04 -1.9058300e-04 +3220 6.448 -1.0779346e-04 -1.8991341e-04 +3221 6.45 -1.0741430e-04 -1.8924617e-04 +3222 6.452 -1.0703647e-04 -1.8858127e-04 +3223 6.454 -1.0665997e-04 -1.8791870e-04 +3224 6.456 -1.0628480e-04 -1.8725845e-04 +3225 6.458 -1.0591094e-04 -1.8660052e-04 +3226 6.46 -1.0553839e-04 -1.8594489e-04 +3227 6.462 -1.0516716e-04 -1.8529156e-04 +3228 6.464 -1.0479723e-04 -1.8464052e-04 +3229 6.466 -1.0442859e-04 -1.8399177e-04 +3230 6.468 -1.0406126e-04 -1.8334528e-04 +3231 6.47 -1.0369521e-04 -1.8270107e-04 +3232 6.472 -1.0333045e-04 -1.8205911e-04 +3233 6.474 -1.0296697e-04 -1.8141941e-04 +3234 6.476 -1.0260477e-04 -1.8078194e-04 +3235 6.478 -1.0224384e-04 -1.8014671e-04 +3236 6.48 -1.0188418e-04 -1.7951371e-04 +3237 6.482 -1.0152579e-04 -1.7888293e-04 +3238 6.484 -1.0116865e-04 -1.7825436e-04 +3239 6.486 -1.0081277e-04 -1.7762799e-04 +3240 6.488 -1.0045814e-04 -1.7700382e-04 +3241 6.49 -1.0010475e-04 -1.7638184e-04 +3242 6.492 -9.9752608e-05 -1.7576204e-04 +3243 6.494 -9.9401702e-05 -1.7514441e-04 +3244 6.496 -9.9052029e-05 -1.7452895e-04 +3245 6.498 -9.8703585e-05 -1.7391565e-04 +3246 6.5 -9.8356365e-05 -1.7330449e-04 +3247 6.502 -9.8010365e-05 -1.7269548e-04 +3248 6.504 -9.7665582e-05 -1.7208861e-04 +3249 6.506 -9.7322010e-05 -1.7148386e-04 +3250 6.508 -9.6979645e-05 -1.7088124e-04 +3251 6.51 -9.6638483e-05 -1.7028072e-04 +3252 6.512 -9.6298521e-05 -1.6968232e-04 +3253 6.514 -9.5959753e-05 -1.6908601e-04 +3254 6.516 -9.5622175e-05 -1.6849179e-04 +3255 6.518 -9.5285784e-05 -1.6789966e-04 +3256 6.52 -9.4950575e-05 -1.6730961e-04 +3257 6.522 -9.4616544e-05 -1.6672162e-04 +3258 6.524 -9.4283687e-05 -1.6613569e-04 +3259 6.526 -9.3952000e-05 -1.6555183e-04 +3260 6.528 -9.3621479e-05 -1.6497000e-04 +3261 6.53 -9.3292119e-05 -1.6439022e-04 +3262 6.532 -9.2963916e-05 -1.6381248e-04 +3263 6.534 -9.2636867e-05 -1.6323675e-04 +3264 6.536 -9.2310968e-05 -1.6266305e-04 +3265 6.538 -9.1986214e-05 -1.6209136e-04 +3266 6.54 -9.1662601e-05 -1.6152168e-04 +3267 6.542 -9.1340126e-05 -1.6095399e-04 +3268 6.544 -9.1018784e-05 -1.6038830e-04 +3269 6.546 -9.0698571e-05 -1.5982459e-04 +3270 6.548 -9.0379484e-05 -1.5926286e-04 +3271 6.55 -9.0061519e-05 -1.5870309e-04 +3272 6.552 -8.9744671e-05 -1.5814530e-04 +3273 6.554 -8.9428936e-05 -1.5758945e-04 +3274 6.556 -8.9114311e-05 -1.5703556e-04 +3275 6.558 -8.8800793e-05 -1.5648361e-04 +3276 6.56 -8.8488376e-05 -1.5593360e-04 +3277 6.562 -8.8177057e-05 -1.5538552e-04 +3278 6.564 -8.7866832e-05 -1.5483936e-04 +3279 6.566 -8.7557698e-05 -1.5429511e-04 +3280 6.568 -8.7249651e-05 -1.5375278e-04 +3281 6.57 -8.6942686e-05 -1.5321234e-04 +3282 6.572 -8.6636800e-05 -1.5267381e-04 +3283 6.574 -8.6331989e-05 -1.5213716e-04 +3284 6.576 -8.6028250e-05 -1.5160240e-04 +3285 6.578 -8.5725578e-05 -1.5106951e-04 +3286 6.58 -8.5423971e-05 -1.5053849e-04 +3287 6.582 -8.5123423e-05 -1.5000934e-04 +3288 6.584 -8.4823932e-05 -1.4948204e-04 +3289 6.586 -8.4525494e-05 -1.4895659e-04 +3290 6.588 -8.4228105e-05 -1.4843298e-04 +3291 6.59 -8.3931761e-05 -1.4791122e-04 +3292 6.592 -8.3636459e-05 -1.4739128e-04 +3293 6.594 -8.3342194e-05 -1.4687317e-04 +3294 6.596 -8.3048965e-05 -1.4635687e-04 +3295 6.598 -8.2756766e-05 -1.4584239e-04 +3296 6.6 -8.2465594e-05 -1.4532971e-04 +3297 6.602 -8.2175446e-05 -1.4481883e-04 +3298 6.604 -8.1886317e-05 -1.4430975e-04 +3299 6.606 -8.1598205e-05 -1.4380245e-04 +3300 6.608 -8.1311106e-05 -1.4329693e-04 +3301 6.61 -8.1025017e-05 -1.4279319e-04 +3302 6.612 -8.0739932e-05 -1.4229121e-04 +3303 6.614 -8.0455851e-05 -1.4179099e-04 +3304 6.616 -8.0172767e-05 -1.4129253e-04 +3305 6.618 -7.9890679e-05 -1.4079582e-04 +3306 6.62 -7.9609583e-05 -1.4030085e-04 +3307 6.622 -7.9329475e-05 -1.3980762e-04 +3308 6.624 -7.9050351e-05 -1.3931612e-04 +3309 6.626 -7.8772209e-05 -1.3882635e-04 +3310 6.628 -7.8495045e-05 -1.3833829e-04 +3311 6.63 -7.8218855e-05 -1.3785195e-04 +3312 6.632 -7.7943636e-05 -1.3736731e-04 +3313 6.634 -7.7669384e-05 -1.3688438e-04 +3314 6.636 -7.7396097e-05 -1.3640314e-04 +3315 6.638 -7.7123771e-05 -1.3592359e-04 +3316 6.64 -7.6852402e-05 -1.3544572e-04 +3317 6.642 -7.6581987e-05 -1.3496953e-04 +3318 6.644 -7.6312522e-05 -1.3449501e-04 +3319 6.646 -7.6044005e-05 -1.3402216e-04 +3320 6.648 -7.5776433e-05 -1.3355096e-04 +3321 6.65 -7.5509801e-05 -1.3308142e-04 +3322 6.652 -7.5244106e-05 -1.3261353e-04 +3323 6.654 -7.4979345e-05 -1.3214728e-04 +3324 6.656 -7.4715516e-05 -1.3168267e-04 +3325 6.658 -7.4452614e-05 -1.3121969e-04 +3326 6.66 -7.4190636e-05 -1.3075833e-04 +3327 6.662 -7.3929579e-05 -1.3029859e-04 +3328 6.664 -7.3669440e-05 -1.2984047e-04 +3329 6.666 -7.3410216e-05 -1.2938396e-04 +3330 6.668 -7.3151903e-05 -1.2892904e-04 +3331 6.67 -7.2894499e-05 -1.2847573e-04 +3332 6.672 -7.2637999e-05 -1.2802400e-04 +3333 6.674 -7.2382402e-05 -1.2757387e-04 +3334 6.676 -7.2127703e-05 -1.2712531e-04 +3335 6.678 -7.1873900e-05 -1.2667832e-04 +3336 6.68 -7.1620989e-05 -1.2623291e-04 +3337 6.682 -7.1368967e-05 -1.2578906e-04 +3338 6.684 -7.1117831e-05 -1.2534677e-04 +3339 6.686 -7.0867579e-05 -1.2490603e-04 +3340 6.688 -7.0618206e-05 -1.2446683e-04 +3341 6.69 -7.0369710e-05 -1.2402918e-04 +3342 6.692 -7.0122088e-05 -1.2359307e-04 +3343 6.694 -6.9875337e-05 -1.2315849e-04 +3344 6.696 -6.9629453e-05 -1.2272543e-04 +3345 6.698 -6.9384434e-05 -1.2229389e-04 +3346 6.7 -6.9140277e-05 -1.2186387e-04 +3347 6.702 -6.8896978e-05 -1.2143536e-04 +3348 6.704 -6.8654534e-05 -1.2100836e-04 +3349 6.706 -6.8412943e-05 -1.2058285e-04 +3350 6.708 -6.8172202e-05 -1.2015883e-04 +3351 6.71 -6.7932307e-05 -1.1973631e-04 +3352 6.712 -6.7693256e-05 -1.1931527e-04 +3353 6.714 -6.7455045e-05 -1.1889571e-04 +3354 6.716 -6.7217672e-05 -1.1847762e-04 +3355 6.718 -6.6981134e-05 -1.1806099e-04 +3356 6.72 -6.6745427e-05 -1.1764584e-04 +3357 6.722 -6.6510549e-05 -1.1723214e-04 +3358 6.724 -6.6276498e-05 -1.1681989e-04 +3359 6.726 -6.6043269e-05 -1.1640909e-04 +3360 6.728 -6.5810860e-05 -1.1599973e-04 +3361 6.73 -6.5579269e-05 -1.1559181e-04 +3362 6.732 -6.5348492e-05 -1.1518532e-04 +3363 6.734 -6.5118527e-05 -1.1478026e-04 +3364 6.736 -6.4889370e-05 -1.1437662e-04 +3365 6.738 -6.4661019e-05 -1.1397440e-04 +3366 6.74 -6.4433472e-05 -1.1357359e-04 +3367 6.742 -6.4206724e-05 -1.1317419e-04 +3368 6.744 -6.3980774e-05 -1.1277620e-04 +3369 6.746 -6.3755618e-05 -1.1237960e-04 +3370 6.748 -6.3531255e-05 -1.1198439e-04 +3371 6.75 -6.3307680e-05 -1.1159057e-04 +3372 6.752 -6.3084891e-05 -1.1119813e-04 +3373 6.754 -6.2862886e-05 -1.1080707e-04 +3374 6.756 -6.2641662e-05 -1.1041739e-04 +3375 6.758 -6.2421216e-05 -1.1002907e-04 +3376 6.76 -6.2201545e-05 -1.0964212e-04 +3377 6.762 -6.1982646e-05 -1.0925653e-04 +3378 6.764 -6.1764518e-05 -1.0887229e-04 +3379 6.766 -6.1547156e-05 -1.0848940e-04 +3380 6.768 -6.1330559e-05 -1.0810785e-04 +3381 6.77 -6.1114724e-05 -1.0772765e-04 +3382 6.772 -6.0899648e-05 -1.0734878e-04 +3383 6.774 -6.0685328e-05 -1.0697124e-04 +3384 6.776 -6.0471762e-05 -1.0659503e-04 +3385 6.778 -6.0258947e-05 -1.0622014e-04 +3386 6.78 -6.0046881e-05 -1.0584656e-04 +3387 6.782 -5.9835560e-05 -1.0547430e-04 +3388 6.784 -5.9624983e-05 -1.0510335e-04 +3389 6.786 -5.9415146e-05 -1.0473370e-04 +3390 6.788 -5.9206047e-05 -1.0436534e-04 +3391 6.79 -5.8997683e-05 -1.0399828e-04 +3392 6.792 -5.8790053e-05 -1.0363251e-04 +3393 6.794 -5.8583153e-05 -1.0326803e-04 +3394 6.796 -5.8376980e-05 -1.0290482e-04 +3395 6.798 -5.8171532e-05 -1.0254289e-04 +3396 6.8 -5.7966807e-05 -1.0218224e-04 +3397 6.802 -5.7762803e-05 -1.0182285e-04 +3398 6.804 -5.7559515e-05 -1.0146472e-04 +3399 6.806 -5.7356943e-05 -1.0110785e-04 +3400 6.808 -5.7155083e-05 -1.0075223e-04 +3401 6.81 -5.6953933e-05 -1.0039786e-04 +3402 6.812 -5.6753491e-05 -1.0004474e-04 +3403 6.814 -5.6553753e-05 -9.9692859e-05 +3404 6.816 -5.6354718e-05 -9.9342214e-05 +3405 6.818 -5.6156384e-05 -9.8992799e-05 +3406 6.82 -5.5958746e-05 -9.8644613e-05 +3407 6.822 -5.5761804e-05 -9.8297650e-05 +3408 6.824 -5.5565555e-05 -9.7951905e-05 +3409 6.826 -5.5369996e-05 -9.7607376e-05 +3410 6.828 -5.5175125e-05 -9.7264056e-05 +3411 6.83 -5.4980939e-05 -9.6921943e-05 +3412 6.832 -5.4787436e-05 -9.6581032e-05 +3413 6.834 -5.4594614e-05 -9.6241318e-05 +3414 6.836 -5.4402470e-05 -9.5902798e-05 +3415 6.838 -5.4211002e-05 -9.5565467e-05 +3416 6.84 -5.4020207e-05 -9.5229322e-05 +3417 6.842 -5.3830084e-05 -9.4894357e-05 +3418 6.844 -5.3640629e-05 -9.4560569e-05 +3419 6.846 -5.3451841e-05 -9.4227954e-05 +3420 6.848 -5.3263717e-05 -9.3896508e-05 +3421 6.85 -5.3076254e-05 -9.3566226e-05 +3422 6.852 -5.2889451e-05 -9.3237105e-05 +3423 6.854 -5.2703305e-05 -9.2909140e-05 +3424 6.856 -5.2517814e-05 -9.2582327e-05 +3425 6.858 -5.2332975e-05 -9.2256662e-05 +3426 6.86 -5.2148786e-05 -9.1932142e-05 +3427 6.862 -5.1965246e-05 -9.1608762e-05 +3428 6.864 -5.1782350e-05 -9.1286519e-05 +3429 6.866 -5.1600099e-05 -9.0965407e-05 +3430 6.868 -5.1418488e-05 -9.0645424e-05 +3431 6.87 -5.1237516e-05 -9.0326565e-05 +3432 6.872 -5.1057181e-05 -9.0008827e-05 +3433 6.874 -5.0877480e-05 -8.9692205e-05 +3434 6.876 -5.0698411e-05 -8.9376696e-05 +3435 6.878 -5.0519973e-05 -8.9062295e-05 +3436 6.88 -5.0342162e-05 -8.8748999e-05 +3437 6.882 -5.0164976e-05 -8.8436804e-05 +3438 6.884 -4.9988414e-05 -8.8125706e-05 +3439 6.886 -4.9812472e-05 -8.7815702e-05 +3440 6.888 -4.9637150e-05 -8.7506786e-05 +3441 6.89 -4.9462445e-05 -8.7198956e-05 +3442 6.892 -4.9288354e-05 -8.6892208e-05 +3443 6.894 -4.9114875e-05 -8.6586538e-05 +3444 6.896 -4.8942007e-05 -8.6281942e-05 +3445 6.898 -4.8769746e-05 -8.5978416e-05 +3446 6.9 -4.8598092e-05 -8.5675957e-05 +3447 6.902 -4.8427042e-05 -8.5374561e-05 +3448 6.904 -4.8256593e-05 -8.5074224e-05 +3449 6.906 -4.8086744e-05 -8.4774943e-05 +3450 6.908 -4.7917493e-05 -8.4476713e-05 +3451 6.91 -4.7748837e-05 -8.4179531e-05 +3452 6.912 -4.7580774e-05 -8.3883394e-05 +3453 6.914 -4.7413303e-05 -8.3588297e-05 +3454 6.916 -4.7246420e-05 -8.3294238e-05 +3455 6.918 -4.7080125e-05 -8.3001212e-05 +3456 6.92 -4.6914415e-05 -8.2709215e-05 +3457 6.922 -4.6749287e-05 -8.2418245e-05 +3458 6.924 -4.6584741e-05 -8.2128298e-05 +3459 6.926 -4.6420773e-05 -8.1839369e-05 +3460 6.928 -4.6257383e-05 -8.1551456e-05 +3461 6.93 -4.6094567e-05 -8.1264555e-05 +3462 6.932 -4.5932324e-05 -8.0978663e-05 +3463 6.934 -4.5770652e-05 -8.0693775e-05 +3464 6.936 -4.5609548e-05 -8.0409888e-05 +3465 6.938 -4.5449011e-05 -8.0126999e-05 +3466 6.94 -4.5289039e-05 -7.9845104e-05 +3467 6.942 -4.5129630e-05 -7.9564200e-05 +3468 6.944 -4.4970782e-05 -7.9284284e-05 +3469 6.946 -4.4812493e-05 -7.9005351e-05 +3470 6.948 -4.4654760e-05 -7.8727399e-05 +3471 6.95 -4.4497582e-05 -7.8450423e-05 +3472 6.952 -4.4340958e-05 -7.8174421e-05 +3473 6.954 -4.4184884e-05 -7.7899389e-05 +3474 6.956 -4.4029359e-05 -7.7625324e-05 +3475 6.958 -4.3874382e-05 -7.7352222e-05 +3476 6.96 -4.3719950e-05 -7.7080080e-05 +3477 6.962 -4.3566061e-05 -7.6808895e-05 +3478 6.964 -4.3412714e-05 -7.6538663e-05 +3479 6.966 -4.3259906e-05 -7.6269380e-05 +3480 6.968 -4.3107636e-05 -7.6001045e-05 +3481 6.97 -4.2955901e-05 -7.5733652e-05 +3482 6.972 -4.2804700e-05 -7.5467199e-05 +3483 6.974 -4.2654032e-05 -7.5201683e-05 +3484 6.976 -4.2503893e-05 -7.4937100e-05 +3485 6.978 -4.2354283e-05 -7.4673448e-05 +3486 6.98 -4.2205199e-05 -7.4410722e-05 +3487 6.982 -4.2056639e-05 -7.4148919e-05 +3488 6.984 -4.1908602e-05 -7.3888037e-05 +3489 6.986 -4.1761086e-05 -7.3628072e-05 +3490 6.988 -4.1614089e-05 -7.3369021e-05 +3491 6.99 -4.1467610e-05 -7.3110880e-05 +3492 6.992 -4.1321645e-05 -7.2853647e-05 +3493 6.994 -4.1176194e-05 -7.2597318e-05 +3494 6.996 -4.1031255e-05 -7.2341890e-05 +3495 6.998 -4.0886826e-05 -7.2087360e-05 +3496 7.0 -4.0742905e-05 -7.1833725e-05 +3497 7.002 -4.0599491e-05 -7.1580981e-05 +3498 7.004 -4.0456581e-05 -7.1329126e-05 +3499 7.006 -4.0314174e-05 -7.1078156e-05 +3500 7.008 -4.0172268e-05 -7.0828069e-05 +3501 7.01 -4.0030861e-05 -7.0578860e-05 +3502 7.012 -3.9889952e-05 -7.0330528e-05 +3503 7.014 -3.9749538e-05 -7.0083069e-05 +3504 7.016 -3.9609619e-05 -6.9836480e-05 +3505 7.018 -3.9470192e-05 -6.9590757e-05 +3506 7.02 -3.9331255e-05 -6.9345899e-05 +3507 7.022 -3.9192807e-05 -6.9101901e-05 +3508 7.024 -3.9054847e-05 -6.8858761e-05 +3509 7.026 -3.8917372e-05 -6.8616476e-05 +3510 7.028 -3.8780380e-05 -6.8375043e-05 +3511 7.03 -3.8643871e-05 -6.8134458e-05 +3512 7.032 -3.8507842e-05 -6.7894720e-05 +3513 7.034 -3.8372292e-05 -6.7655824e-05 +3514 7.036 -3.8237218e-05 -6.7417768e-05 +3515 7.038 -3.8102620e-05 -6.7180549e-05 +3516 7.04 -3.7968495e-05 -6.6944164e-05 +3517 7.042 -3.7834843e-05 -6.6708610e-05 +3518 7.044 -3.7701660e-05 -6.6473884e-05 +3519 7.046 -3.7568947e-05 -6.6239984e-05 +3520 7.048 -3.7436700e-05 -6.6006906e-05 +3521 7.05 -3.7304919e-05 -6.5774647e-05 +3522 7.052 -3.7173601e-05 -6.5543205e-05 +3523 7.054 -3.7042745e-05 -6.5312576e-05 +3524 7.056 -3.6912350e-05 -6.5082759e-05 +3525 7.058 -3.6782414e-05 -6.4853750e-05 +3526 7.06 -3.6652934e-05 -6.4625545e-05 +3527 7.062 -3.6523911e-05 -6.4398143e-05 +3528 7.064 -3.6395341e-05 -6.4171541e-05 +3529 7.066 -3.6267224e-05 -6.3945735e-05 +3530 7.068 -3.6139558e-05 -6.3720724e-05 +3531 7.07 -3.6012341e-05 -6.3496503e-05 +3532 7.072 -3.5885571e-05 -6.3273071e-05 +3533 7.074 -3.5759248e-05 -6.3050425e-05 +3534 7.076 -3.5633369e-05 -6.2828561e-05 +3535 7.078 -3.5507933e-05 -6.2607477e-05 +3536 7.08 -3.5382939e-05 -6.2387171e-05 +3537 7.082 -3.5258384e-05 -6.2167640e-05 +3538 7.084 -3.5134268e-05 -6.1948880e-05 +3539 7.086 -3.5010588e-05 -6.1730890e-05 +3540 7.088 -3.4887344e-05 -6.1513666e-05 +3541 7.09 -3.4764533e-05 -6.1297206e-05 +3542 7.092 -3.4642154e-05 -6.1081507e-05 +3543 7.094 -3.4520206e-05 -6.0866566e-05 +3544 7.096 -3.4398687e-05 -6.0652381e-05 +3545 7.098 -3.4277596e-05 -6.0438950e-05 +3546 7.1 -3.4156931e-05 -6.0226269e-05 +3547 7.102 -3.4036691e-05 -6.0014336e-05 +3548 7.104 -3.3916873e-05 -5.9803148e-05 +3549 7.106 -3.3797478e-05 -5.9592702e-05 +3550 7.108 -3.3678502e-05 -5.9382997e-05 +3551 7.11 -3.3559945e-05 -5.9174029e-05 +3552 7.112 -3.3441805e-05 -5.8965796e-05 +3553 7.114 -3.3324081e-05 -5.8758295e-05 +3554 7.116 -3.3206772e-05 -5.8551524e-05 +3555 7.118 -3.3089875e-05 -5.8345480e-05 +3556 7.12 -3.2973389e-05 -5.8140160e-05 +3557 7.122 -3.2857314e-05 -5.7935563e-05 +3558 7.124 -3.2741647e-05 -5.7731685e-05 +3559 7.126 -3.2626387e-05 -5.7528524e-05 +3560 7.128 -3.2511532e-05 -5.7326077e-05 +3561 7.13 -3.2397082e-05 -5.7124342e-05 +3562 7.132 -3.2283034e-05 -5.6923317e-05 +3563 7.134 -3.2169388e-05 -5.6722999e-05 +3564 7.136 -3.2056142e-05 -5.6523385e-05 +3565 7.138 -3.1943294e-05 -5.6324473e-05 +3566 7.14 -3.1830843e-05 -5.6126261e-05 +3567 7.142 -3.1718788e-05 -5.5928745e-05 +3568 7.144 -3.1607128e-05 -5.5731925e-05 +3569 7.146 -3.1495860e-05 -5.5535796e-05 +3570 7.148 -3.1384984e-05 -5.5340357e-05 +3571 7.15 -3.1274498e-05 -5.5145606e-05 +3572 7.152 -3.1164401e-05 -5.4951539e-05 +3573 7.154 -3.1054692e-05 -5.4758155e-05 +3574 7.156 -3.0945368e-05 -5.4565451e-05 +3575 7.158 -3.0836430e-05 -5.4373425e-05 +3576 7.16 -3.0727874e-05 -5.4182074e-05 +3577 7.162 -3.0619701e-05 -5.3991396e-05 +3578 7.164 -3.0511908e-05 -5.3801389e-05 +3579 7.166 -3.0404495e-05 -5.3612049e-05 +3580 7.168 -3.0297459e-05 -5.3423376e-05 +3581 7.17 -3.0190801e-05 -5.3235366e-05 +3582 7.172 -3.0084518e-05 -5.3048018e-05 +3583 7.174 -2.9978608e-05 -5.2861328e-05 +3584 7.176 -2.9873072e-05 -5.2675295e-05 +3585 7.178 -2.9767907e-05 -5.2489917e-05 +3586 7.18 -2.9663112e-05 -5.2305190e-05 +3587 7.182 -2.9558686e-05 -5.2121113e-05 +3588 7.184 -2.9454627e-05 -5.1937683e-05 +3589 7.186 -2.9350934e-05 -5.1754899e-05 +3590 7.188 -2.9247607e-05 -5.1572757e-05 +3591 7.19 -2.9144643e-05 -5.1391256e-05 +3592 7.192 -2.9042041e-05 -5.1210394e-05 +3593 7.194 -2.8939801e-05 -5.1030167e-05 +3594 7.196 -2.8837920e-05 -5.0850574e-05 +3595 7.198 -2.8736398e-05 -5.0671613e-05 +3596 7.2 -2.8635233e-05 -5.0493282e-05 +3597 7.202 -2.8534425e-05 -5.0315577e-05 +3598 7.204 -2.8433971e-05 -5.0138498e-05 +3599 7.206 -2.8333870e-05 -4.9962042e-05 +3600 7.208 -2.8234122e-05 -4.9786206e-05 +3601 7.21 -2.8134725e-05 -4.9610989e-05 +3602 7.212 -2.8035678e-05 -4.9436387e-05 +3603 7.214 -2.7936979e-05 -4.9262401e-05 +3604 7.216 -2.7838628e-05 -4.9089026e-05 +3605 7.218 -2.7740623e-05 -4.8916260e-05 +3606 7.22 -2.7642962e-05 -4.8744103e-05 +3607 7.222 -2.7545646e-05 -4.8572551e-05 +3608 7.224 -2.7448672e-05 -4.8401602e-05 +3609 7.226 -2.7352039e-05 -4.8231255e-05 +3610 7.228 -2.7255746e-05 -4.8061507e-05 +3611 7.23 -2.7159792e-05 -4.7892356e-05 +3612 7.232 -2.7064176e-05 -4.7723800e-05 +3613 7.234 -2.6968897e-05 -4.7555837e-05 +3614 7.236 -2.6873953e-05 -4.7388464e-05 +3615 7.238 -2.6779343e-05 -4.7221681e-05 +3616 7.24 -2.6685066e-05 -4.7055484e-05 +3617 7.242 -2.6591120e-05 -4.6889871e-05 +3618 7.244 -2.6497506e-05 -4.6724842e-05 +3619 7.246 -2.6404221e-05 -4.6560392e-05 +3620 7.248 -2.6311264e-05 -4.6396521e-05 +3621 7.25 -2.6218634e-05 -4.6233227e-05 +3622 7.252 -2.6126330e-05 -4.6070507e-05 +3623 7.254 -2.6034352e-05 -4.5908359e-05 +3624 7.256 -2.5942697e-05 -4.5746782e-05 +3625 7.258 -2.5851364e-05 -4.5585773e-05 +3626 7.26 -2.5760353e-05 -4.5425331e-05 +3627 7.262 -2.5669662e-05 -4.5265452e-05 +3628 7.264 -2.5579291e-05 -4.5106137e-05 +3629 7.266 -2.5489238e-05 -4.4947381e-05 +3630 7.268 -2.5399501e-05 -4.4789184e-05 +3631 7.27 -2.5310080e-05 -4.4631544e-05 +3632 7.272 -2.5220975e-05 -4.4474458e-05 +3633 7.274 -2.5132182e-05 -4.4317925e-05 +3634 7.276 -2.5043702e-05 -4.4161942e-05 +3635 7.278 -2.4955534e-05 -4.4006508e-05 +3636 7.28 -2.4867676e-05 -4.3851621e-05 +3637 7.282 -2.4780127e-05 -4.3697278e-05 +3638 7.284 -2.4692887e-05 -4.3543479e-05 +3639 7.286 -2.4605953e-05 -4.3390221e-05 +3640 7.288 -2.4519325e-05 -4.3237502e-05 +3641 7.29 -2.4433003e-05 -4.3085320e-05 +3642 7.292 -2.4346984e-05 -4.2933673e-05 +3643 7.294 -2.4261268e-05 -4.2782560e-05 +3644 7.296 -2.4175853e-05 -4.2631978e-05 +3645 7.298 -2.4090739e-05 -4.2481926e-05 +3646 7.3 -2.4005925e-05 -4.2332402e-05 +3647 7.302 -2.3921409e-05 -4.2183404e-05 +3648 7.304 -2.3837191e-05 -4.2034931e-05 +3649 7.306 -2.3753269e-05 -4.1886979e-05 +3650 7.308 -2.3669643e-05 -4.1739548e-05 +3651 7.31 -2.3586311e-05 -4.1592636e-05 +3652 7.312 -2.3503272e-05 -4.1446240e-05 +3653 7.314 -2.3420525e-05 -4.1300360e-05 +3654 7.316 -2.3338070e-05 -4.1154992e-05 +3655 7.318 -2.3255905e-05 -4.1010137e-05 +3656 7.32 -2.3174029e-05 -4.0865790e-05 +3657 7.322 -2.3092442e-05 -4.0721952e-05 +3658 7.324 -2.3011141e-05 -4.0578619e-05 +3659 7.326 -2.2930127e-05 -4.0435791e-05 +3660 7.328 -2.2849398e-05 -4.0293466e-05 +3661 7.33 -2.2768953e-05 -4.0151641e-05 +3662 7.332 -2.2688791e-05 -4.0010314e-05 +3663 7.334 -2.2608911e-05 -3.9869486e-05 +3664 7.336 -2.2529312e-05 -3.9729152e-05 +3665 7.338 -2.2449994e-05 -3.9589313e-05 +3666 7.34 -2.2370955e-05 -3.9449965e-05 +3667 7.342 -2.2292194e-05 -3.9311107e-05 +3668 7.344 -2.2213710e-05 -3.9172738e-05 +3669 7.346 -2.2135503e-05 -3.9034856e-05 +3670 7.348 -2.2057570e-05 -3.8897459e-05 +3671 7.35 -2.1979912e-05 -3.8760546e-05 +3672 7.352 -2.1902528e-05 -3.8624114e-05 +3673 7.354 -2.1825416e-05 -3.8488162e-05 +3674 7.356 -2.1748575e-05 -3.8352688e-05 +3675 7.358 -2.1672005e-05 -3.8217691e-05 +3676 7.36 -2.1595704e-05 -3.8083169e-05 +3677 7.362 -2.1519672e-05 -3.7949120e-05 +3678 7.364 -2.1443907e-05 -3.7815543e-05 +3679 7.366 -2.1368409e-05 -3.7682436e-05 +3680 7.368 -2.1293177e-05 -3.7549797e-05 +3681 7.37 -2.1218210e-05 -3.7417625e-05 +3682 7.372 -2.1143506e-05 -3.7285917e-05 +3683 7.374 -2.1069066e-05 -3.7154674e-05 +3684 7.376 -2.0994887e-05 -3.7023892e-05 +3685 7.378 -2.0920970e-05 -3.6893570e-05 +3686 7.38 -2.0847313e-05 -3.6763706e-05 +3687 7.382 -2.0773915e-05 -3.6634300e-05 +3688 7.384 -2.0700775e-05 -3.6505349e-05 +3689 7.386 -2.0627893e-05 -3.6376851e-05 +3690 7.388 -2.0555267e-05 -3.6248806e-05 +3691 7.39 -2.0482897e-05 -3.6121211e-05 +3692 7.392 -2.0410782e-05 -3.5994065e-05 +3693 7.394 -2.0338921e-05 -3.5867366e-05 +3694 7.396 -2.0267312e-05 -3.5741114e-05 +3695 7.398 -2.0195956e-05 -3.5615305e-05 +3696 7.4 -2.0124851e-05 -3.5489939e-05 +3697 7.402 -2.0053996e-05 -3.5365014e-05 +3698 7.404 -1.9983391e-05 -3.5240529e-05 +3699 7.406 -1.9913034e-05 -3.5116482e-05 +3700 7.408 -1.9842924e-05 -3.4992871e-05 +3701 7.41 -1.9773062e-05 -3.4869695e-05 +3702 7.412 -1.9703445e-05 -3.4746953e-05 +3703 7.414 -1.9634074e-05 -3.4624642e-05 +3704 7.416 -1.9564946e-05 -3.4502762e-05 +3705 7.418 -1.9496062e-05 -3.4381310e-05 +3706 7.42 -1.9427421e-05 -3.4260286e-05 +3707 7.422 -1.9359021e-05 -3.4139688e-05 +3708 7.424 -1.9290862e-05 -3.4019514e-05 +3709 7.426 -1.9222943e-05 -3.3899763e-05 +3710 7.428 -1.9155263e-05 -3.3780433e-05 +3711 7.43 -1.9087821e-05 -3.3661524e-05 +3712 7.432 -1.9020616e-05 -3.3543032e-05 +3713 7.434 -1.8953648e-05 -3.3424958e-05 +3714 7.436 -1.8886916e-05 -3.3307299e-05 +3715 7.438 -1.8820419e-05 -3.3190054e-05 +3716 7.44 -1.8754156e-05 -3.3073221e-05 +3717 7.442 -1.8688126e-05 -3.2956800e-05 +3718 7.444 -1.8622328e-05 -3.2840788e-05 +3719 7.446 -1.8556762e-05 -3.2725185e-05 +3720 7.448 -1.8491427e-05 -3.2609988e-05 +3721 7.45 -1.8426322e-05 -3.2495196e-05 +3722 7.452 -1.8361446e-05 -3.2380809e-05 +3723 7.454 -1.8296799e-05 -3.2266824e-05 +3724 7.456 -1.8232379e-05 -3.2153240e-05 +3725 7.458 -1.8168185e-05 -3.2040056e-05 +3726 7.46 -1.8104218e-05 -3.1927270e-05 +3727 7.462 -1.8040476e-05 -3.1814881e-05 +3728 7.464 -1.7976958e-05 -3.1702887e-05 +3729 7.466 -1.7913664e-05 -3.1591288e-05 +3730 7.468 -1.7850593e-05 -3.1480081e-05 +3731 7.47 -1.7787744e-05 -3.1369266e-05 +3732 7.472 -1.7725116e-05 -3.1258840e-05 +3733 7.474 -1.7662708e-05 -3.1148803e-05 +3734 7.476 -1.7600520e-05 -3.1039153e-05 +3735 7.478 -1.7538551e-05 -3.0929889e-05 +3736 7.48 -1.7476800e-05 -3.0821010e-05 +3737 7.482 -1.7415267e-05 -3.0712514e-05 +3738 7.484 -1.7353950e-05 -3.0604399e-05 +3739 7.486 -1.7292849e-05 -3.0496665e-05 +3740 7.488 -1.7231963e-05 -3.0389310e-05 +3741 7.49 -1.7171291e-05 -3.0282333e-05 +3742 7.492 -1.7110833e-05 -3.0175732e-05 +3743 7.494 -1.7050588e-05 -3.0069506e-05 +3744 7.496 -1.6990555e-05 -2.9963655e-05 +3745 7.498 -1.6930733e-05 -2.9858175e-05 +3746 7.5 -1.6871122e-05 -2.9753067e-05 +3747 7.502 -1.6811721e-05 -2.9648329e-05 +3748 7.504 -1.6752529e-05 -2.9543959e-05 +3749 7.506 -1.6693545e-05 -2.9439957e-05 +3750 7.508 -1.6634769e-05 -2.9336320e-05 +3751 7.51 -1.6576199e-05 -2.9233049e-05 +3752 7.512 -1.6517836e-05 -2.9130140e-05 +3753 7.514 -1.6459678e-05 -2.9027594e-05 +3754 7.516 -1.6401726e-05 -2.8925409e-05 +3755 7.518 -1.6343977e-05 -2.8823583e-05 +3756 7.52 -1.6286431e-05 -2.8722116e-05 +3757 7.522 -1.6229088e-05 -2.8621005e-05 +3758 7.524 -1.6171947e-05 -2.8520251e-05 +3759 7.526 -1.6115007e-05 -2.8419851e-05 +3760 7.528 -1.6058267e-05 -2.8319804e-05 +3761 7.53 -1.6001727e-05 -2.8220109e-05 +3762 7.532 -1.5945386e-05 -2.8120766e-05 +3763 7.534 -1.5889244e-05 -2.8021772e-05 +3764 7.536 -1.5833299e-05 -2.7923126e-05 +3765 7.538 -1.5777551e-05 -2.7824827e-05 +3766 7.54 -1.5722000e-05 -2.7726875e-05 +3767 7.542 -1.5666643e-05 -2.7629267e-05 +3768 7.544 -1.5611482e-05 -2.7532002e-05 +3769 7.546 -1.5556515e-05 -2.7435080e-05 +3770 7.548 -1.5501742e-05 -2.7338499e-05 +3771 7.55 -1.5447161e-05 -2.7242258e-05 +3772 7.552 -1.5392772e-05 -2.7146355e-05 +3773 7.554 -1.5338575e-05 -2.7050790e-05 +3774 7.556 -1.5284569e-05 -2.6955561e-05 +3775 7.558 -1.5230753e-05 -2.6860668e-05 +3776 7.56 -1.5177126e-05 -2.6766108e-05 +3777 7.562 -1.5123688e-05 -2.6671881e-05 +3778 7.564 -1.5070438e-05 -2.6577986e-05 +3779 7.566 -1.5017376e-05 -2.6484421e-05 +3780 7.568 -1.4964500e-05 -2.6391186e-05 +3781 7.57 -1.4911811e-05 -2.6298278e-05 +3782 7.572 -1.4859307e-05 -2.6205698e-05 +3783 7.574 -1.4806988e-05 -2.6113443e-05 +3784 7.576 -1.4754853e-05 -2.6021513e-05 +3785 7.578 -1.4702902e-05 -2.5929907e-05 +3786 7.58 -1.4651133e-05 -2.5838623e-05 +3787 7.582 -1.4599547e-05 -2.5747660e-05 +3788 7.584 -1.4548142e-05 -2.5657017e-05 +3789 7.586 -1.4496919e-05 -2.5566694e-05 +3790 7.588 -1.4445875e-05 -2.5476688e-05 +3791 7.59 -1.4395012e-05 -2.5386999e-05 +3792 7.592 -1.4344327e-05 -2.5297626e-05 +3793 7.594 -1.4293821e-05 -2.5208567e-05 +3794 7.596 -1.4243493e-05 -2.5119821e-05 +3795 7.598 -1.4193342e-05 -2.5031388e-05 +3796 7.6 -1.4143367e-05 -2.4943267e-05 +3797 7.602 -1.4093568e-05 -2.4855455e-05 +3798 7.604 -1.4043945e-05 -2.4767952e-05 +3799 7.606 -1.3994496e-05 -2.4680757e-05 +3800 7.608 -1.3945222e-05 -2.4593870e-05 +3801 7.61 -1.3896121e-05 -2.4507288e-05 +3802 7.612 -1.3847192e-05 -2.4421010e-05 +3803 7.614 -1.3798436e-05 -2.4335037e-05 +3804 7.616 -1.3749852e-05 -2.4249366e-05 +3805 7.618 -1.3701439e-05 -2.4163996e-05 +3806 7.62 -1.3653196e-05 -2.4078927e-05 +3807 7.622 -1.3605123e-05 -2.3994157e-05 +3808 7.624 -1.3557219e-05 -2.3909686e-05 +3809 7.626 -1.3509484e-05 -2.3825512e-05 +3810 7.628 -1.3461917e-05 -2.3741634e-05 +3811 7.63 -1.3414517e-05 -2.3658051e-05 +3812 7.632 -1.3367284e-05 -2.3574763e-05 +3813 7.634 -1.3320218e-05 -2.3491767e-05 +3814 7.636 -1.3273317e-05 -2.3409064e-05 +3815 7.638 -1.3226581e-05 -2.3326652e-05 +3816 7.64 -1.3180010e-05 -2.3244530e-05 +3817 7.642 -1.3133603e-05 -2.3162697e-05 +3818 7.644 -1.3087359e-05 -2.3081152e-05 +3819 7.646 -1.3041278e-05 -2.2999894e-05 +3820 7.648 -1.2995360e-05 -2.2918922e-05 +3821 7.65 -1.2949603e-05 -2.2838235e-05 +3822 7.652 -1.2904006e-05 -2.2757832e-05 +3823 7.654 -1.2858571e-05 -2.2677712e-05 +3824 7.656 -1.2813295e-05 -2.2597873e-05 +3825 7.658 -1.2768179e-05 -2.2518316e-05 +3826 7.66 -1.2723222e-05 -2.2439039e-05 +3827 7.662 -1.2678423e-05 -2.2360041e-05 +3828 7.664 -1.2633782e-05 -2.2281321e-05 +3829 7.666 -1.2589297e-05 -2.2202878e-05 +3830 7.668 -1.2544970e-05 -2.2124711e-05 +3831 7.67 -1.2500798e-05 -2.2046820e-05 +3832 7.672 -1.2456782e-05 -2.1969202e-05 +3833 7.674 -1.2412921e-05 -2.1891858e-05 +3834 7.676 -1.2369215e-05 -2.1814785e-05 +3835 7.678 -1.2325662e-05 -2.1737984e-05 +3836 7.68 -1.2282263e-05 -2.1661454e-05 +3837 7.682 -1.2239016e-05 -2.1585193e-05 +3838 7.684 -1.2195922e-05 -2.1509200e-05 +3839 7.686 -1.2152979e-05 -2.1433474e-05 +3840 7.688 -1.2110188e-05 -2.1358015e-05 +3841 7.69 -1.2067547e-05 -2.1282822e-05 +3842 7.692 -1.2025056e-05 -2.1207894e-05 +3843 7.694 -1.1982715e-05 -2.1133229e-05 +3844 7.696 -1.1940523e-05 -2.1058827e-05 +3845 7.698 -1.1898480e-05 -2.0984687e-05 +3846 7.7 -1.1856584e-05 -2.0910807e-05 +3847 7.702 -1.1814836e-05 -2.0837188e-05 +3848 7.704 -1.1773235e-05 -2.0763828e-05 +3849 7.706 -1.1731781e-05 -2.0690726e-05 +3850 7.708 -1.1690472e-05 -2.0617882e-05 +3851 7.71 -1.1649309e-05 -2.0545293e-05 +3852 7.712 -1.1608291e-05 -2.0472961e-05 +3853 7.714 -1.1567417e-05 -2.0400883e-05 +3854 7.716 -1.1526687e-05 -2.0329058e-05 +3855 7.718 -1.1486101e-05 -2.0257487e-05 +3856 7.72 -1.1445657e-05 -2.0186167e-05 +3857 7.722 -1.1405356e-05 -2.0115098e-05 +3858 7.724 -1.1365197e-05 -2.0044280e-05 +3859 7.726 -1.1325179e-05 -1.9973711e-05 +3860 7.728 -1.1285302e-05 -1.9903390e-05 +3861 7.73 -1.1245565e-05 -1.9833316e-05 +3862 7.732 -1.1205968e-05 -1.9763490e-05 +3863 7.734 -1.1166511e-05 -1.9693909e-05 +3864 7.736 -1.1127192e-05 -1.9624573e-05 +3865 7.738 -1.1088012e-05 -1.9555481e-05 +3866 7.74 -1.1048970e-05 -1.9486632e-05 +3867 7.742 -1.1010066e-05 -1.9418026e-05 +3868 7.744 -1.0971298e-05 -1.9349661e-05 +3869 7.746 -1.0932667e-05 -1.9281537e-05 +3870 7.748 -1.0894172e-05 -1.9213652e-05 +3871 7.75 -1.0855812e-05 -1.9146007e-05 +3872 7.752 -1.0817587e-05 -1.9078599e-05 +3873 7.754 -1.0779497e-05 -1.9011429e-05 +3874 7.756 -1.0741542e-05 -1.8944495e-05 +3875 7.758 -1.0703719e-05 -1.8877797e-05 +3876 7.76 -1.0666030e-05 -1.8811334e-05 +3877 7.762 -1.0628474e-05 -1.8745104e-05 +3878 7.764 -1.0591050e-05 -1.8679108e-05 +3879 7.766 -1.0553757e-05 -1.8613344e-05 +3880 7.768 -1.0516596e-05 -1.8547812e-05 +3881 7.77 -1.0479566e-05 -1.8482510e-05 +3882 7.772 -1.0442666e-05 -1.8417438e-05 +3883 7.774 -1.0405896e-05 -1.8352595e-05 +3884 7.776 -1.0369255e-05 -1.8287980e-05 +3885 7.778 -1.0332744e-05 -1.8223593e-05 +3886 7.78 -1.0296361e-05 -1.8159432e-05 +3887 7.782 -1.0260106e-05 -1.8095497e-05 +3888 7.784 -1.0223979e-05 -1.8031788e-05 +3889 7.786 -1.0187979e-05 -1.7968302e-05 +3890 7.788 -1.0152105e-05 -1.7905040e-05 +3891 7.79 -1.0116358e-05 -1.7842001e-05 +3892 7.792 -1.0080737e-05 -1.7779184e-05 +3893 7.794 -1.0045242e-05 -1.7716587e-05 +3894 7.796 -1.0009871e-05 -1.7654211e-05 +3895 7.798 -9.9746245e-06 -1.7592055e-05 +3896 7.8 -9.9395024e-06 -1.7530117e-05 +3897 7.802 -9.9045039e-06 -1.7468398e-05 +3898 7.804 -9.8696286e-06 -1.7406895e-05 +3899 7.806 -9.8348762e-06 -1.7345610e-05 +3900 7.808 -9.8002461e-06 -1.7284540e-05 +3901 7.81 -9.7657379e-06 -1.7223684e-05 +3902 7.812 -9.7313512e-06 -1.7163043e-05 +3903 7.814 -9.6970856e-06 -1.7102616e-05 +3904 7.816 -9.6629406e-06 -1.7042401e-05 +3905 7.818 -9.6289158e-06 -1.6982398e-05 +3906 7.82 -9.5950108e-06 -1.6922607e-05 +3907 7.822 -9.5612252e-06 -1.6863026e-05 +3908 7.824 -9.5275586e-06 -1.6803654e-05 +3909 7.826 -9.4940105e-06 -1.6744492e-05 +3910 7.828 -9.4605805e-06 -1.6685538e-05 +3911 7.83 -9.4272682e-06 -1.6626791e-05 +3912 7.832 -9.3940732e-06 -1.6568251e-05 +3913 7.834 -9.3609951e-06 -1.6509918e-05 +3914 7.836 -9.3280334e-06 -1.6451789e-05 +3915 7.838 -9.2951878e-06 -1.6393865e-05 +3916 7.84 -9.2624578e-06 -1.6336146e-05 +3917 7.842 -9.2298430e-06 -1.6278629e-05 +3918 7.844 -9.1973431e-06 -1.6221315e-05 +3919 7.846 -9.1649577e-06 -1.6164202e-05 +3920 7.848 -9.1326862e-06 -1.6107291e-05 +3921 7.85 -9.1005284e-06 -1.6050580e-05 +3922 7.852 -9.0684837e-06 -1.5994068e-05 +3923 7.854 -9.0365520e-06 -1.5937756e-05 +3924 7.856 -9.0047326e-06 -1.5881641e-05 +3925 7.858 -8.9730253e-06 -1.5825724e-05 +3926 7.86 -8.9414296e-06 -1.5770005e-05 +3927 7.862 -8.9099451e-06 -1.5714481e-05 +3928 7.864 -8.8785715e-06 -1.5659152e-05 +3929 7.866 -8.8473084e-06 -1.5604019e-05 +3930 7.868 -8.8161553e-06 -1.5549079e-05 +3931 7.87 -8.7851119e-06 -1.5494333e-05 +3932 7.872 -8.7541778e-06 -1.5439780e-05 +3933 7.874 -8.7233527e-06 -1.5385418e-05 +3934 7.876 -8.6926360e-06 -1.5331248e-05 +3935 7.878 -8.6620276e-06 -1.5277269e-05 +3936 7.88 -8.6315268e-06 -1.5223480e-05 +3937 7.882 -8.6011335e-06 -1.5169880e-05 +3938 7.884 -8.5708472e-06 -1.5116469e-05 +3939 7.886 -8.5406675e-06 -1.5063245e-05 +3940 7.888 -8.5105941e-06 -1.5010210e-05 +3941 7.89 -8.4806265e-06 -1.4957360e-05 +3942 7.892 -8.4507645e-06 -1.4904697e-05 +3943 7.894 -8.4210076e-06 -1.4852220e-05 +3944 7.896 -8.3913555e-06 -1.4799927e-05 +3945 7.898 -8.3618078e-06 -1.4747818e-05 +3946 7.9 -8.3323641e-06 -1.4695892e-05 +3947 7.902 -8.3030241e-06 -1.4644149e-05 +3948 7.904 -8.2737874e-06 -1.4592589e-05 +3949 7.906 -8.2446536e-06 -1.4541210e-05 +3950 7.908 -8.2156224e-06 -1.4490012e-05 +3951 7.91 -8.1866935e-06 -1.4438994e-05 +3952 7.912 -8.1578664e-06 -1.4388155e-05 +3953 7.914 -8.1291407e-06 -1.4337496e-05 +3954 7.916 -8.1005162e-06 -1.4287015e-05 +3955 7.918 -8.0719926e-06 -1.4236712e-05 +3956 7.92 -8.0435693e-06 -1.4186585e-05 +3957 7.922 -8.0152461e-06 -1.4136636e-05 +3958 7.924 -7.9870226e-06 -1.4086862e-05 +3959 7.926 -7.9588985e-06 -1.4037263e-05 +3960 7.928 -7.9308735e-06 -1.3987839e-05 +3961 7.93 -7.9029471e-06 -1.3938589e-05 +3962 7.932 -7.8751190e-06 -1.3889512e-05 +3963 7.934 -7.8473889e-06 -1.3840608e-05 +3964 7.936 -7.8197564e-06 -1.3791876e-05 +3965 7.938 -7.7922213e-06 -1.3743316e-05 +3966 7.94 -7.7647831e-06 -1.3694927e-05 +3967 7.942 -7.7374415e-06 -1.3646708e-05 +3968 7.944 -7.7101961e-06 -1.3598658e-05 +3969 7.946 -7.6830467e-06 -1.3550778e-05 +3970 7.948 -7.6559929e-06 -1.3503067e-05 +3971 7.95 -7.6290343e-06 -1.3455523e-05 +3972 7.952 -7.6021707e-06 -1.3408147e-05 +3973 7.954 -7.5754016e-06 -1.3360937e-05 +3974 7.956 -7.5487268e-06 -1.3313894e-05 +3975 7.958 -7.5221459e-06 -1.3267017e-05 +3976 7.96 -7.4956586e-06 -1.3220304e-05 +3977 7.962 -7.4692646e-06 -1.3173756e-05 +3978 7.964 -7.4429635e-06 -1.3127372e-05 +3979 7.966 -7.4167550e-06 -1.3081151e-05 +3980 7.968 -7.3906388e-06 -1.3035092e-05 +3981 7.97 -7.3646145e-06 -1.2989196e-05 +3982 7.972 -7.3386819e-06 -1.2943462e-05 +3983 7.974 -7.3128406e-06 -1.2897888e-05 +3984 7.976 -7.2870903e-06 -1.2852475e-05 +3985 7.978 -7.2614306e-06 -1.2807222e-05 +3986 7.98 -7.2358613e-06 -1.2762128e-05 +3987 7.982 -7.2103820e-06 -1.2717193e-05 +3988 7.984 -7.1849924e-06 -1.2672416e-05 +3989 7.986 -7.1596922e-06 -1.2627797e-05 +3990 7.988 -7.1344811e-06 -1.2583334e-05 +3991 7.99 -7.1093588e-06 -1.2539029e-05 +3992 7.992 -7.0843249e-06 -1.2494879e-05 +3993 7.994 -7.0593791e-06 -1.2450884e-05 +3994 7.996 -7.0345212e-06 -1.2407045e-05 +3995 7.998 -7.0097509e-06 -1.2363360e-05 +3996 8.0 -6.9850677e-06 -1.2319829e-05 +3997 8.002 -6.9604714e-06 -1.2276450e-05 +3998 8.004 -6.9359618e-06 -1.2233225e-05 +3999 8.006 -6.9115384e-06 -1.2190152e-05 +4000 8.008 -6.8872011e-06 -1.2147230e-05 +4001 8.01 -6.8629494e-06 -1.2104460e-05 +4002 8.012 -6.8387831e-06 -1.2061840e-05 +4003 8.014 -6.8147020e-06 -1.2019370e-05 +4004 8.016 -6.7907056e-06 -1.1977050e-05 +4005 8.018 -6.7667937e-06 -1.1934879e-05 +4006 8.02 -6.7429659e-06 -1.1892856e-05 +4007 8.022 -6.7192221e-06 -1.1850981e-05 +4008 8.024 -6.6955619e-06 -1.1809253e-05 +4009 8.026 -6.6719850e-06 -1.1767673e-05 +4010 8.028 -6.6484911e-06 -1.1726238e-05 +4011 8.03 -6.6250800e-06 -1.1684950e-05 +4012 8.032 -6.6017512e-06 -1.1643807e-05 +4013 8.034 -6.5785046e-06 -1.1602809e-05 +4014 8.036 -6.5553399e-06 -1.1561955e-05 +4015 8.038 -6.5322567e-06 -1.1521245e-05 +4016 8.04 -6.5092548e-06 -1.1480679e-05 +4017 8.042 -6.4863339e-06 -1.1440255e-05 +4018 8.044 -6.4634937e-06 -1.1399973e-05 +4019 8.046 -6.4407339e-06 -1.1359833e-05 +4020 8.048 -6.4180543e-06 -1.1319835e-05 +4021 8.05 -6.3954545e-06 -1.1279977e-05 +4022 8.052 -6.3729343e-06 -1.1240260e-05 +4023 8.054 -6.3504934e-06 -1.1200683e-05 +4024 8.056 -6.3281315e-06 -1.1161245e-05 +4025 8.058 -6.3058483e-06 -1.1121945e-05 +4026 8.06 -6.2836436e-06 -1.1082784e-05 +4027 8.062 -6.2615171e-06 -1.1043761e-05 +4028 8.064 -6.2394684e-06 -1.1004876e-05 +4029 8.066 -6.2174975e-06 -1.0966127e-05 +4030 8.068 -6.1956038e-06 -1.0927515e-05 +4031 8.07 -6.1737873e-06 -1.0889038e-05 +4032 8.072 -6.1520476e-06 -1.0850697e-05 +4033 8.074 -6.1303844e-06 -1.0812491e-05 +4034 8.076 -6.1087976e-06 -1.0774420e-05 +4035 8.078 -6.0872867e-06 -1.0736483e-05 +4036 8.08 -6.0658515e-06 -1.0698679e-05 +4037 8.082 -6.0444919e-06 -1.0661008e-05 +4038 8.084 -6.0232074e-06 -1.0623470e-05 +4039 8.086 -6.0019979e-06 -1.0586064e-05 +4040 8.088 -5.9808631e-06 -1.0548790e-05 +4041 8.09 -5.9598027e-06 -1.0511647e-05 +4042 8.092 -5.9388164e-06 -1.0474634e-05 +4043 8.094 -5.9179040e-06 -1.0437752e-05 +4044 8.096 -5.8970653e-06 -1.0401000e-05 +4045 8.098 -5.8762999e-06 -1.0364377e-05 +4046 8.1 -5.8556077e-06 -1.0327884e-05 +4047 8.102 -5.8349883e-06 -1.0291518e-05 +4048 8.104 -5.8144415e-06 -1.0255281e-05 +4049 8.106 -5.7939671e-06 -1.0219171e-05 +4050 8.108 -5.7735648e-06 -1.0183189e-05 +4051 8.11 -5.7532343e-06 -1.0147333e-05 +4052 8.112 -5.7329754e-06 -1.0111603e-05 +4053 8.114 -5.7127878e-06 -1.0075999e-05 +4054 8.116 -5.6926713e-06 -1.0040521e-05 +4055 8.118 -5.6726256e-06 -1.0005167e-05 +4056 8.12 -5.6526505e-06 -9.9699380e-06 +4057 8.122 -5.6327458e-06 -9.9348328e-06 +4058 8.124 -5.6129111e-06 -9.8998513e-06 +4059 8.126 -5.5931463e-06 -9.8649929e-06 +4060 8.128 -5.5734511e-06 -9.8302573e-06 +4061 8.13 -5.5538252e-06 -9.7956439e-06 +4062 8.132 -5.5342684e-06 -9.7611525e-06 +4063 8.134 -5.5147805e-06 -9.7267824e-06 +4064 8.136 -5.4953612e-06 -9.6925334e-06 +4065 8.138 -5.4760103e-06 -9.6584049e-06 +4066 8.14 -5.4567275e-06 -9.6243966e-06 +4067 8.142 -5.4375126e-06 -9.5905080e-06 +4068 8.144 -5.4183654e-06 -9.5567387e-06 +4069 8.146 -5.3992856e-06 -9.5230884e-06 +4070 8.148 -5.3802729e-06 -9.4895565e-06 +4071 8.15 -5.3613273e-06 -9.4561426e-06 +4072 8.152 -5.3424483e-06 -9.4228464e-06 +4073 8.154 -5.3236358e-06 -9.3896674e-06 +4074 8.156 -5.3048896e-06 -9.3566053e-06 +4075 8.158 -5.2862093e-06 -9.3236595e-06 +4076 8.16 -5.2675948e-06 -9.2908297e-06 +4077 8.162 -5.2490459e-06 -9.2581155e-06 +4078 8.164 -5.2305623e-06 -9.2255165e-06 +4079 8.166 -5.2121438e-06 -9.1930323e-06 +4080 8.168 -5.1937901e-06 -9.1606624e-06 +4081 8.17 -5.1755010e-06 -9.1284065e-06 +4082 8.172 -5.1572764e-06 -9.0962642e-06 +4083 8.174 -5.1391159e-06 -9.0642350e-06 +4084 8.176 -5.1210194e-06 -9.0323186e-06 +4085 8.178 -5.1029866e-06 -9.0005146e-06 +4086 8.18 -5.0850172e-06 -8.9688225e-06 +4087 8.182 -5.0671112e-06 -8.9372421e-06 +4088 8.184 -5.0492682e-06 -8.9057728e-06 +4089 8.186 -5.0314880e-06 -8.8744143e-06 +4090 8.188 -5.0137705e-06 -8.8431662e-06 +4091 8.19 -4.9961153e-06 -8.8120281e-06 +4092 8.192 -4.9785223e-06 -8.7809997e-06 +4093 8.194 -4.9609912e-06 -8.7500805e-06 +4094 8.196 -4.9435219e-06 -8.7192701e-06 +4095 8.198 -4.9261141e-06 -8.6885682e-06 +4096 8.2 -4.9087675e-06 -8.6579745e-06 +4097 8.202 -4.8914821e-06 -8.6274884e-06 +4098 8.204 -4.8742575e-06 -8.5971097e-06 +4099 8.206 -4.8570936e-06 -8.5668379e-06 +4100 8.208 -4.8399901e-06 -8.5366728e-06 +4101 8.21 -4.8229468e-06 -8.5066138e-06 +4102 8.212 -4.8059636e-06 -8.4766606e-06 +4103 8.214 -4.7890401e-06 -8.4468129e-06 +4104 8.216 -4.7721762e-06 -8.4170703e-06 +4105 8.218 -4.7553718e-06 -8.3874325e-06 +4106 8.22 -4.7386264e-06 -8.3578989e-06 +4107 8.222 -4.7219401e-06 -8.3284694e-06 +4108 8.224 -4.7053125e-06 -8.2991434e-06 +4109 8.226 -4.6887435e-06 -8.2699207e-06 +4110 8.228 -4.6722328e-06 -8.2408009e-06 +4111 8.23 -4.6557802e-06 -8.2117837e-06 +4112 8.232 -4.6393855e-06 -8.1828686e-06 +4113 8.234 -4.6230486e-06 -8.1540553e-06 +4114 8.236 -4.6067693e-06 -8.1253434e-06 +4115 8.238 -4.5905472e-06 -8.0967326e-06 +4116 8.24 -4.5743823e-06 -8.0682226e-06 +4117 8.242 -4.5582742e-06 -8.0398130e-06 +4118 8.244 -4.5422229e-06 -8.0115033e-06 +4119 8.246 -4.5262282e-06 -7.9832934e-06 +4120 8.248 -4.5102897e-06 -7.9551827e-06 +4121 8.25 -4.4944074e-06 -7.9271711e-06 +4122 8.252 -4.4785810e-06 -7.8992581e-06 +4123 8.254 -4.4628103e-06 -7.8714433e-06 +4124 8.256 -4.4470951e-06 -7.8437265e-06 +4125 8.258 -4.4314353e-06 -7.8161072e-06 +4126 8.26 -4.4158306e-06 -7.7885852e-06 +4127 8.262 -4.4002809e-06 -7.7611601e-06 +4128 8.264 -4.3847859e-06 -7.7338316e-06 +4129 8.266 -4.3693455e-06 -7.7065993e-06 +4130 8.268 -4.3539595e-06 -7.6794629e-06 +4131 8.27 -4.3386276e-06 -7.6524220e-06 +4132 8.272 -4.3233497e-06 -7.6254763e-06 +4133 8.274 -4.3081256e-06 -7.5986255e-06 +4134 8.276 -4.2929551e-06 -7.5718692e-06 +4135 8.278 -4.2778381e-06 -7.5452071e-06 +4136 8.28 -4.2627742e-06 -7.5186390e-06 +4137 8.282 -4.2477635e-06 -7.4921643e-06 +4138 8.284 -4.2328055e-06 -7.4657829e-06 +4139 8.286 -4.2179003e-06 -7.4394943e-06 +4140 8.288 -4.2030475e-06 -7.4132983e-06 +4141 8.29 -4.1882470e-06 -7.3871946e-06 +4142 8.292 -4.1734986e-06 -7.3611827e-06 +4143 8.294 -4.1588022e-06 -7.3352625e-06 +4144 8.296 -4.1441575e-06 -7.3094335e-06 +4145 8.298 -4.1295644e-06 -7.2836954e-06 +4146 8.3 -4.1150227e-06 -7.2580480e-06 +4147 8.302 -4.1005322e-06 -7.2324908e-06 +4148 8.304 -4.0860927e-06 -7.2070237e-06 +4149 8.306 -4.0717040e-06 -7.1816462e-06 +4150 8.308 -4.0573660e-06 -7.1563581e-06 +4151 8.31 -4.0430785e-06 -7.1311590e-06 +4152 8.312 -4.0288413e-06 -7.1060486e-06 +4153 8.314 -4.0146543e-06 -7.0810266e-06 +4154 8.316 -4.0005172e-06 -7.0560928e-06 +4155 8.318 -3.9864298e-06 -7.0312467e-06 +4156 8.32 -3.9723921e-06 -7.0064881e-06 +4157 8.322 -3.9584038e-06 -6.9818167e-06 +4158 8.324 -3.9444648e-06 -6.9572322e-06 +4159 8.326 -3.9305748e-06 -6.9327342e-06 +4160 8.328 -3.9167338e-06 -6.9083224e-06 +4161 8.33 -3.9029415e-06 -6.8839967e-06 +4162 8.332 -3.8891978e-06 -6.8597565e-06 +4163 8.334 -3.8755024e-06 -6.8356017e-06 +4164 8.336 -3.8618553e-06 -6.8115320e-06 +4165 8.338 -3.8482562e-06 -6.7875470e-06 +4166 8.34 -3.8347051e-06 -6.7636465e-06 +4167 8.342 -3.8212016e-06 -6.7398301e-06 +4168 8.344 -3.8077457e-06 -6.7160976e-06 +4169 8.346 -3.7943371e-06 -6.6924486e-06 +4170 8.348 -3.7809758e-06 -6.6688829e-06 +4171 8.35 -3.7676616e-06 -6.6454002e-06 +4172 8.352 -3.7543942e-06 -6.6220001e-06 +4173 8.354 -3.7411735e-06 -6.5986824e-06 +4174 8.356 -3.7279994e-06 -6.5754469e-06 +4175 8.358 -3.7148717e-06 -6.5522931e-06 +4176 8.36 -3.7017902e-06 -6.5292209e-06 +4177 8.362 -3.6887547e-06 -6.5062299e-06 +4178 8.364 -3.6757652e-06 -6.4833199e-06 +4179 8.366 -3.6628214e-06 -6.4604905e-06 +4180 8.368 -3.6499232e-06 -6.4377416e-06 +4181 8.37 -3.6370704e-06 -6.4150727e-06 +4182 8.372 -3.6242628e-06 -6.3924836e-06 +4183 8.374 -3.6115004e-06 -6.3699741e-06 +4184 8.376 -3.5987829e-06 -6.3475438e-06 +4185 8.378 -3.5861102e-06 -6.3251925e-06 +4186 8.38 -3.5734821e-06 -6.3029199e-06 +4187 8.382 -3.5608984e-06 -6.2807257e-06 +4188 8.384 -3.5483591e-06 -6.2586096e-06 +4189 8.386 -3.5358639e-06 -6.2365715e-06 +4190 8.388 -3.5234128e-06 -6.2146109e-06 +4191 8.39 -3.5110054e-06 -6.1927276e-06 +4192 8.392 -3.4986418e-06 -6.1709214e-06 +4193 8.394 -3.4863217e-06 -6.1491920e-06 +4194 8.396 -3.4740450e-06 -6.1275391e-06 +4195 8.398 -3.4618115e-06 -6.1059624e-06 +4196 8.4 -3.4496211e-06 -6.0844617e-06 +4197 8.402 -3.4374736e-06 -6.0630367e-06 +4198 8.404 -3.4253689e-06 -6.0416872e-06 +4199 8.406 -3.4133068e-06 -6.0204128e-06 +4200 8.408 -3.4012872e-06 -5.9992133e-06 +4201 8.41 -3.3893099e-06 -5.9780885e-06 +4202 8.412 -3.3773748e-06 -5.9570380e-06 +4203 8.414 -3.3654817e-06 -5.9360617e-06 +4204 8.416 -3.3536305e-06 -5.9151592e-06 +4205 8.418 -3.3418210e-06 -5.8943303e-06 +4206 8.42 -3.3300531e-06 -5.8735748e-06 +4207 8.422 -3.3183267e-06 -5.8528923e-06 +4208 8.424 -3.3066415e-06 -5.8322827e-06 +4209 8.426 -3.2949975e-06 -5.8117456e-06 +4210 8.428 -3.2833945e-06 -5.7912809e-06 +4211 8.43 -3.2718323e-06 -5.7708882e-06 +4212 8.432 -3.2603109e-06 -5.7505673e-06 +4213 8.434 -3.2488300e-06 -5.7303179e-06 +4214 8.436 -3.2373895e-06 -5.7101399e-06 +4215 8.438 -3.2259894e-06 -5.6900329e-06 +4216 8.44 -3.2146294e-06 -5.6699967e-06 +4217 8.442 -3.2033093e-06 -5.6500310e-06 +4218 8.444 -3.1920292e-06 -5.6301357e-06 +4219 8.446 -3.1807888e-06 -5.6103104e-06 +4220 8.448 -3.1695879e-06 -5.5905549e-06 +4221 8.45 -3.1584265e-06 -5.5708689e-06 +4222 8.452 -3.1473044e-06 -5.5512523e-06 +4223 8.454 -3.1362214e-06 -5.5317048e-06 +4224 8.456 -3.1251775e-06 -5.5122260e-06 +4225 8.458 -3.1141725e-06 -5.4928159e-06 +4226 8.46 -3.1032062e-06 -5.4734741e-06 +4227 8.462 -3.0922785e-06 -5.4542004e-06 +4228 8.464 -3.0813894e-06 -5.4349946e-06 +4229 8.466 -3.0705385e-06 -5.4158564e-06 +4230 8.468 -3.0597259e-06 -5.3967856e-06 +4231 8.47 -3.0489513e-06 -5.3777819e-06 +4232 8.472 -3.0382147e-06 -5.3588451e-06 +4233 8.474 -3.0275159e-06 -5.3399751e-06 +4234 8.476 -3.0168548e-06 -5.3211714e-06 +4235 8.478 -3.0062312e-06 -5.3024340e-06 +4236 8.48 -2.9956450e-06 -5.2837626e-06 +4237 8.482 -2.9850961e-06 -5.2651569e-06 +4238 8.484 -2.9745843e-06 -5.2466167e-06 +4239 8.486 -2.9641096e-06 -5.2281418e-06 +4240 8.488 -2.9536717e-06 -5.2097319e-06 +4241 8.49 -2.9432706e-06 -5.1913869e-06 +4242 8.492 -2.9329061e-06 -5.1731064e-06 +4243 8.494 -2.9225781e-06 -5.1548903e-06 +4244 8.496 -2.9122865e-06 -5.1367384e-06 +4245 8.498 -2.9020311e-06 -5.1186504e-06 +4246 8.5 -2.8918119e-06 -5.1006261e-06 +4247 8.502 -2.8816286e-06 -5.0826652e-06 +4248 8.504 -2.8714812e-06 -5.0647676e-06 +4249 8.506 -2.8613695e-06 -5.0469330e-06 +4250 8.508 -2.8512934e-06 -5.0291612e-06 +4251 8.51 -2.8412528e-06 -5.0114519e-06 +4252 8.512 -2.8312476e-06 -4.9938050e-06 +4253 8.514 -2.8212775e-06 -4.9762203e-06 +4254 8.516 -2.8113426e-06 -4.9586975e-06 +4255 8.518 -2.8014427e-06 -4.9412364e-06 +4256 8.52 -2.7915776e-06 -4.9238367e-06 +4257 8.522 -2.7817473e-06 -4.9064984e-06 +4258 8.524 -2.7719516e-06 -4.8892210e-06 +4259 8.526 -2.7621904e-06 -4.8720045e-06 +4260 8.528 -2.7524635e-06 -4.8548487e-06 +4261 8.53 -2.7427710e-06 -4.8377532e-06 +4262 8.532 -2.7331125e-06 -4.8207179e-06 +4263 8.534 -2.7234880e-06 -4.8037427e-06 +4264 8.536 -2.7138975e-06 -4.7868272e-06 +4265 8.538 -2.7043407e-06 -4.7699712e-06 +4266 8.54 -2.6948176e-06 -4.7531746e-06 +4267 8.542 -2.6853280e-06 -4.7364372e-06 +4268 8.544 -2.6758718e-06 -4.7197586e-06 +4269 8.546 -2.6664489e-06 -4.7031388e-06 +4270 8.548 -2.6570592e-06 -4.6865776e-06 +4271 8.55 -2.6477025e-06 -4.6700746e-06 +4272 8.552 -2.6383788e-06 -4.6536298e-06 +4273 8.554 -2.6290880e-06 -4.6372428e-06 +4274 8.556 -2.6198298e-06 -4.6209136e-06 +4275 8.558 -2.6106043e-06 -4.6046418e-06 +4276 8.56 -2.6014112e-06 -4.5884274e-06 +4277 8.562 -2.5922505e-06 -4.5722700e-06 +4278 8.564 -2.5831221e-06 -4.5561695e-06 +4279 8.566 -2.5740258e-06 -4.5401258e-06 +4280 8.568 -2.5649616e-06 -4.5241385e-06 +4281 8.57 -2.5559292e-06 -4.5082075e-06 +4282 8.572 -2.5469287e-06 -4.4923326e-06 +4283 8.574 -2.5379599e-06 -4.4765136e-06 +4284 8.576 -2.5290226e-06 -4.4607503e-06 +4285 8.578 -2.5201168e-06 -4.4450425e-06 +4286 8.58 -2.5112424e-06 -4.4293900e-06 +4287 8.582 -2.5023992e-06 -4.4137927e-06 +4288 8.584 -2.4935872e-06 -4.3982502e-06 +4289 8.586 -2.4848062e-06 -4.3827625e-06 +4290 8.588 -2.4760561e-06 -4.3673293e-06 +4291 8.59 -2.4673368e-06 -4.3519505e-06 +4292 8.592 -2.4586483e-06 -4.3366258e-06 +4293 8.594 -2.4499903e-06 -4.3213551e-06 +4294 8.596 -2.4413628e-06 -4.3061381e-06 +4295 8.598 -2.4327657e-06 -4.2909747e-06 +4296 8.6 -2.4241989e-06 -4.2758647e-06 +4297 8.602 -2.4156622e-06 -4.2608080e-06 +4298 8.604 -2.4071556e-06 -4.2458042e-06 +4299 8.606 -2.3986790e-06 -4.2308533e-06 +4300 8.608 -2.3902322e-06 -4.2159550e-06 +4301 8.61 -2.3818151e-06 -4.2011091e-06 +4302 8.612 -2.3734277e-06 -4.1863156e-06 +4303 8.614 -2.3650698e-06 -4.1715741e-06 +4304 8.616 -2.3567414e-06 -4.1568846e-06 +4305 8.618 -2.3484422e-06 -4.1422467e-06 +4306 8.62 -2.3401723e-06 -4.1276604e-06 +4307 8.622 -2.3319316e-06 -4.1131255e-06 +4308 8.624 -2.3237198e-06 -4.0986418e-06 +4309 8.626 -2.3155370e-06 -4.0842090e-06 +4310 8.628 -2.3073829e-06 -4.0698271e-06 +4311 8.63 -2.2992576e-06 -4.0554958e-06 +4312 8.632 -2.2911609e-06 -4.0412150e-06 +4313 8.634 -2.2830927e-06 -4.0269844e-06 +4314 8.636 -2.2750529e-06 -4.0128040e-06 +4315 8.638 -2.2670415e-06 -3.9986735e-06 +4316 8.64 -2.2590582e-06 -3.9845927e-06 +4317 8.642 -2.2511031e-06 -3.9705616e-06 +4318 8.644 -2.2431759e-06 -3.9565798e-06 +4319 8.646 -2.2352767e-06 -3.9426473e-06 +4320 8.648 -2.2274053e-06 -3.9287638e-06 +4321 8.65 -2.2195616e-06 -3.9149293e-06 +4322 8.652 -2.2117456e-06 -3.9011434e-06 +4323 8.654 -2.2039570e-06 -3.8874061e-06 +4324 8.656 -2.1961959e-06 -3.8737171e-06 +4325 8.658 -2.1884621e-06 -3.8600764e-06 +4326 8.66 -2.1807556e-06 -3.8464837e-06 +4327 8.662 -2.1730762e-06 -3.8329388e-06 +4328 8.664 -2.1654238e-06 -3.8194416e-06 +4329 8.666 -2.1577984e-06 -3.8059920e-06 +4330 8.668 -2.1501998e-06 -3.7925897e-06 +4331 8.67 -2.1426280e-06 -3.7792346e-06 +4332 8.672 -2.1350828e-06 -3.7659266e-06 +4333 8.674 -2.1275642e-06 -3.7526654e-06 +4334 8.676 -2.1200721e-06 -3.7394509e-06 +4335 8.678 -2.1126064e-06 -3.7262829e-06 +4336 8.68 -2.1051670e-06 -3.7131613e-06 +4337 8.682 -2.0977537e-06 -3.7000859e-06 +4338 8.684 -2.0903666e-06 -3.6870565e-06 +4339 8.686 -2.0830055e-06 -3.6740731e-06 +4340 8.688 -2.0756703e-06 -3.6611353e-06 +4341 8.69 -2.0683609e-06 -3.6482431e-06 +4342 8.692 -2.0610773e-06 -3.6353963e-06 +4343 8.694 -2.0538193e-06 -3.6225947e-06 +4344 8.696 -2.0465869e-06 -3.6098382e-06 +4345 8.698 -2.0393799e-06 -3.5971266e-06 +4346 8.7 -2.0321983e-06 -3.5844598e-06 +4347 8.702 -2.0250420e-06 -3.5718376e-06 +4348 8.704 -2.0179109e-06 -3.5592598e-06 +4349 8.706 -2.0108050e-06 -3.5467264e-06 +4350 8.708 -2.0037240e-06 -3.5342370e-06 +4351 8.71 -1.9966680e-06 -3.5217916e-06 +4352 8.712 -1.9896368e-06 -3.5093901e-06 +4353 8.714 -1.9826304e-06 -3.4970322e-06 +4354 8.716 -1.9756486e-06 -3.4847178e-06 +4355 8.718 -1.9686915e-06 -3.4724468e-06 +4356 8.72 -1.9617588e-06 -3.4602191e-06 +4357 8.722 -1.9548506e-06 -3.4480343e-06 +4358 8.724 -1.9479667e-06 -3.4358925e-06 +4359 8.726 -1.9411070e-06 -3.4237934e-06 +4360 8.728 -1.9342715e-06 -3.4117369e-06 +4361 8.73 -1.9274600e-06 -3.3997229e-06 +4362 8.732 -1.9206725e-06 -3.3877512e-06 +4363 8.734 -1.9139090e-06 -3.3758216e-06 +4364 8.736 -1.9071692e-06 -3.3639341e-06 +4365 8.738 -1.9004532e-06 -3.3520884e-06 +4366 8.74 -1.8937608e-06 -3.3402844e-06 +4367 8.742 -1.8870920e-06 -3.3285220e-06 +4368 8.744 -1.8804467e-06 -3.3168010e-06 +4369 8.746 -1.8738248e-06 -3.3051213e-06 +4370 8.748 -1.8672262e-06 -3.2934827e-06 +4371 8.75 -1.8606509e-06 -3.2818850e-06 +4372 8.752 -1.8540987e-06 -3.2703283e-06 +4373 8.754 -1.8475695e-06 -3.2588122e-06 +4374 8.756 -1.8410634e-06 -3.2473366e-06 +4375 8.758 -1.8345801e-06 -3.2359015e-06 +4376 8.76 -1.8281197e-06 -3.2245067e-06 +4377 8.762 -1.8216821e-06 -3.2131519e-06 +4378 8.764 -1.8152671e-06 -3.2018372e-06 +4379 8.766 -1.8088747e-06 -3.1905623e-06 +4380 8.768 -1.8025048e-06 -3.1793270e-06 +4381 8.77 -1.7961574e-06 -3.1681314e-06 +4382 8.772 -1.7898323e-06 -3.1569752e-06 +4383 8.774 -1.7835295e-06 -3.1458582e-06 +4384 8.776 -1.7772488e-06 -3.1347804e-06 +4385 8.778 -1.7709903e-06 -3.1237416e-06 +4386 8.78 -1.7647538e-06 -3.1127417e-06 +4387 8.782 -1.7585393e-06 -3.1017805e-06 +4388 8.784 -1.7523467e-06 -3.0908580e-06 +4389 8.786 -1.7461759e-06 -3.0799738e-06 +4390 8.788 -1.7400268e-06 -3.0691280e-06 +4391 8.79 -1.7338993e-06 -3.0583204e-06 +4392 8.792 -1.7277935e-06 -3.0475509e-06 +4393 8.794 -1.7217091e-06 -3.0368192e-06 +4394 8.796 -1.7156462e-06 -3.0261254e-06 +4395 8.798 -1.7096046e-06 -3.0154692e-06 +4396 8.8 -1.7035843e-06 -3.0048505e-06 +4397 8.802 -1.6975851e-06 -2.9942693e-06 +4398 8.804 -1.6916072e-06 -2.9837253e-06 +4399 8.806 -1.6856502e-06 -2.9732184e-06 +4400 8.808 -1.6797143e-06 -2.9627485e-06 +4401 8.81 -1.6737992e-06 -2.9523155e-06 +4402 8.812 -1.6679050e-06 -2.9419192e-06 +4403 8.814 -1.6620315e-06 -2.9315595e-06 +4404 8.816 -1.6561787e-06 -2.9212363e-06 +4405 8.818 -1.6503465e-06 -2.9109495e-06 +4406 8.82 -1.6445349e-06 -2.9006989e-06 +4407 8.822 -1.6387437e-06 -2.8904843e-06 +4408 8.824 -1.6329729e-06 -2.8803058e-06 +4409 8.826 -1.6272225e-06 -2.8701631e-06 +4410 8.828 -1.6214922e-06 -2.8600561e-06 +4411 8.83 -1.6157822e-06 -2.8499846e-06 +4412 8.832 -1.6100923e-06 -2.8399487e-06 +4413 8.834 -1.6044224e-06 -2.8299481e-06 +4414 8.836 -1.5987725e-06 -2.8199827e-06 +4415 8.838 -1.5931424e-06 -2.8100524e-06 +4416 8.84 -1.5875322e-06 -2.8001571e-06 +4417 8.842 -1.5819418e-06 -2.7902966e-06 +4418 8.844 -1.5763710e-06 -2.7804708e-06 +4419 8.846 -1.5708199e-06 -2.7706796e-06 +4420 8.848 -1.5652883e-06 -2.7609230e-06 +4421 8.85 -1.5597762e-06 -2.7512006e-06 +4422 8.852 -1.5542835e-06 -2.7415125e-06 +4423 8.854 -1.5488101e-06 -2.7318585e-06 +4424 8.856 -1.5433560e-06 -2.7222385e-06 +4425 8.858 -1.5379211e-06 -2.7126524e-06 +4426 8.86 -1.5325054e-06 -2.7031001e-06 +4427 8.862 -1.5271087e-06 -2.6935813e-06 +4428 8.864 -1.5217310e-06 -2.6840961e-06 +4429 8.866 -1.5163723e-06 -2.6746443e-06 +4430 8.868 -1.5110324e-06 -2.6652258e-06 +4431 8.87 -1.5057114e-06 -2.6558404e-06 +4432 8.872 -1.5004090e-06 -2.6464881e-06 +4433 8.874 -1.4951254e-06 -2.6371688e-06 +4434 8.876 -1.4898603e-06 -2.6278822e-06 +4435 8.878 -1.4846138e-06 -2.6186283e-06 +4436 8.88 -1.4793858e-06 -2.6094071e-06 +4437 8.882 -1.4741762e-06 -2.6002183e-06 +4438 8.884 -1.4689849e-06 -2.5910618e-06 +4439 8.886 -1.4638119e-06 -2.5819376e-06 +4440 8.888 -1.4586571e-06 -2.5728455e-06 +4441 8.89 -1.4535205e-06 -2.5637855e-06 +4442 8.892 -1.4484020e-06 -2.5547573e-06 +4443 8.894 -1.4433015e-06 -2.5457610e-06 +4444 8.896 -1.4382189e-06 -2.5367963e-06 +4445 8.898 -1.4331543e-06 -2.5278632e-06 +4446 8.9 -1.4281074e-06 -2.5189615e-06 +4447 8.902 -1.4230784e-06 -2.5100912e-06 +4448 8.904 -1.4180671e-06 -2.5012521e-06 +4449 8.906 -1.4130734e-06 -2.4924441e-06 +4450 8.908 -1.4080973e-06 -2.4836672e-06 +4451 8.91 -1.4031387e-06 -2.4749212e-06 +4452 8.912 -1.3981975e-06 -2.4662059e-06 +4453 8.914 -1.3932738e-06 -2.4575214e-06 +4454 8.916 -1.3883674e-06 -2.4488674e-06 +4455 8.918 -1.3834783e-06 -2.4402439e-06 +4456 8.92 -1.3786064e-06 -2.4316508e-06 +4457 8.922 -1.3737517e-06 -2.4230879e-06 +4458 8.924 -1.3689141e-06 -2.4145552e-06 +4459 8.926 -1.3640935e-06 -2.4060525e-06 +4460 8.928 -1.3592898e-06 -2.3975798e-06 +4461 8.93 -1.3545031e-06 -2.3891369e-06 +4462 8.932 -1.3497333e-06 -2.3807238e-06 +4463 8.934 -1.3449802e-06 -2.3723402e-06 +4464 8.936 -1.3402439e-06 -2.3639862e-06 +4465 8.938 -1.3355243e-06 -2.3556616e-06 +4466 8.94 -1.3308212e-06 -2.3473663e-06 +4467 8.942 -1.3261348e-06 -2.3391002e-06 +4468 8.944 -1.3214648e-06 -2.3308633e-06 +4469 8.946 -1.3168113e-06 -2.3226553e-06 +4470 8.948 -1.3121742e-06 -2.3144762e-06 +4471 8.95 -1.3075534e-06 -2.3063260e-06 +4472 8.952 -1.3029488e-06 -2.2982044e-06 +4473 8.954 -1.2983605e-06 -2.2901115e-06 +4474 8.956 -1.2937884e-06 -2.2820470e-06 +4475 8.958 -1.2892323e-06 -2.2740109e-06 +4476 8.96 -1.2846923e-06 -2.2660032e-06 +4477 8.962 -1.2801683e-06 -2.2580236e-06 +4478 8.964 -1.2756602e-06 -2.2500721e-06 +4479 8.966 -1.2711680e-06 -2.2421487e-06 +4480 8.968 -1.2666916e-06 -2.2342531e-06 +4481 8.97 -1.2622310e-06 -2.2263853e-06 +4482 8.972 -1.2577860e-06 -2.2185453e-06 +4483 8.974 -1.2533568e-06 -2.2107328e-06 +4484 8.976 -1.2489431e-06 -2.2029479e-06 +4485 8.978 -1.2445450e-06 -2.1951903e-06 +4486 8.98 -1.2401623e-06 -2.1874601e-06 +4487 8.982 -1.2357951e-06 -2.1797571e-06 +4488 8.984 -1.2314433e-06 -2.1720812e-06 +4489 8.986 -1.2271067e-06 -2.1644324e-06 +4490 8.988 -1.2227855e-06 -2.1568105e-06 +4491 8.99 -1.2184795e-06 -2.1492154e-06 +4492 8.992 -1.2141886e-06 -2.1416471e-06 +4493 8.994 -1.2099129e-06 -2.1341054e-06 +4494 8.996 -1.2056522e-06 -2.1265903e-06 +4495 8.998 -1.2014065e-06 -2.1191017e-06 +4496 9.0 -1.1971758e-06 -2.1116394e-06 +4497 9.002 -1.1929599e-06 -2.1042034e-06 +4498 9.004 -1.1887589e-06 -2.0967936e-06 +4499 9.006 -1.1845727e-06 -2.0894098e-06 +4500 9.008 -1.1804013e-06 -2.0820521e-06 +4501 9.01 -1.1762445e-06 -2.0747203e-06 +4502 9.012 -1.1721024e-06 -2.0674143e-06 +4503 9.014 -1.1679748e-06 -2.0601340e-06 +4504 9.016 -1.1638618e-06 -2.0528794e-06 +4505 9.018 -1.1597633e-06 -2.0456503e-06 +4506 9.02 -1.1556792e-06 -2.0384467e-06 +4507 9.022 -1.1516095e-06 -2.0312684e-06 +4508 9.024 -1.1475541e-06 -2.0241154e-06 +4509 9.026 -1.1435130e-06 -2.0169876e-06 +4510 9.028 -1.1394862e-06 -2.0098849e-06 +4511 9.03 -1.1354735e-06 -2.0028072e-06 +4512 9.032 -1.1314749e-06 -1.9957545e-06 +4513 9.034 -1.1274904e-06 -1.9887265e-06 +4514 9.036 -1.1235200e-06 -1.9817234e-06 +4515 9.038 -1.1195635e-06 -1.9747448e-06 +4516 9.04 -1.1156210e-06 -1.9677909e-06 +4517 9.042 -1.1116923e-06 -1.9608614e-06 +4518 9.044 -1.1077775e-06 -1.9539564e-06 +4519 9.046 -1.1038765e-06 -1.9470756e-06 +4520 9.048 -1.0999892e-06 -1.9402191e-06 +4521 9.05 -1.0961156e-06 -1.9333867e-06 +4522 9.052 -1.0922556e-06 -1.9265784e-06 +4523 9.054 -1.0884093e-06 -1.9197941e-06 +4524 9.056 -1.0845765e-06 -1.9130336e-06 +4525 9.058 -1.0807571e-06 -1.9062970e-06 +4526 9.06 -1.0769512e-06 -1.8995841e-06 +4527 9.062 -1.0731588e-06 -1.8928948e-06 +4528 9.064 -1.0693797e-06 -1.8862290e-06 +4529 9.066 -1.0656138e-06 -1.8795868e-06 +4530 9.068 -1.0618613e-06 -1.8729679e-06 +4531 9.07 -1.0581220e-06 -1.8663724e-06 +4532 9.072 -1.0543958e-06 -1.8598000e-06 +4533 9.074 -1.0506827e-06 -1.8532509e-06 +4534 9.076 -1.0469828e-06 -1.8467247e-06 +4535 9.078 -1.0432958e-06 -1.8402216e-06 +4536 9.08 -1.0396219e-06 -1.8337413e-06 +4537 9.082 -1.0359608e-06 -1.8272839e-06 +4538 9.084 -1.0323127e-06 -1.8208492e-06 +4539 9.086 -1.0286774e-06 -1.8144372e-06 +4540 9.088 -1.0250550e-06 -1.8080478e-06 +4541 9.09 -1.0214452e-06 -1.8016808e-06 +4542 9.092 -1.0178482e-06 -1.7953363e-06 +4543 9.094 -1.0142639e-06 -1.7890141e-06 +4544 9.096 -1.0106921e-06 -1.7827142e-06 +4545 9.098 -1.0071330e-06 -1.7764364e-06 +4546 9.1 -1.0035864e-06 -1.7701808e-06 +4547 9.102 -1.0000523e-06 -1.7639472e-06 +4548 9.104 -9.9653058e-07 -1.7577355e-06 +4549 9.106 -9.9302130e-07 -1.7515457e-06 +4550 9.108 -9.8952438e-07 -1.7453778e-06 +4551 9.11 -9.8603977e-07 -1.7392315e-06 +4552 9.112 -9.8256744e-07 -1.7331069e-06 +4553 9.114 -9.7910733e-07 -1.7270038e-06 +4554 9.116 -9.7565941e-07 -1.7209223e-06 +4555 9.118 -9.7222363e-07 -1.7148621e-06 +4556 9.12 -9.6879995e-07 -1.7088233e-06 +4557 9.122 -9.6538832e-07 -1.7028058e-06 +4558 9.124 -9.6198871e-07 -1.6968094e-06 +4559 9.126 -9.5860107e-07 -1.6908342e-06 +4560 9.128 -9.5522536e-07 -1.6848800e-06 +4561 9.13 -9.5186154e-07 -1.6789467e-06 +4562 9.132 -9.4850956e-07 -1.6730344e-06 +4563 9.134 -9.4516938e-07 -1.6671429e-06 +4564 9.136 -9.4184097e-07 -1.6612721e-06 +4565 9.138 -9.3852428e-07 -1.6554220e-06 +4566 9.14 -9.3521927e-07 -1.6495925e-06 +4567 9.142 -9.3192590e-07 -1.6437836e-06 +4568 9.144 -9.2864412e-07 -1.6379951e-06 +4569 9.146 -9.2537390e-07 -1.6322269e-06 +4570 9.148 -9.2211520e-07 -1.6264791e-06 +4571 9.15 -9.1886797e-07 -1.6207515e-06 +4572 9.152 -9.1563218e-07 -1.6150441e-06 +4573 9.154 -9.1240778e-07 -1.6093568e-06 +4574 9.156 -9.0919474e-07 -1.6036895e-06 +4575 9.158 -9.0599301e-07 -1.5980422e-06 +4576 9.16 -9.0280256e-07 -1.5924148e-06 +4577 9.162 -8.9962334e-07 -1.5868071e-06 +4578 9.164 -8.9645532e-07 -1.5812193e-06 +4579 9.166 -8.9329845e-07 -1.5756511e-06 +4580 9.168 -8.9015270e-07 -1.5701025e-06 +4581 9.17 -8.8701803e-07 -1.5645734e-06 +4582 9.172 -8.8389439e-07 -1.5590638e-06 +4583 9.174 -8.8078176e-07 -1.5535737e-06 +4584 9.176 -8.7768009e-07 -1.5481028e-06 +4585 9.178 -8.7458934e-07 -1.5426512e-06 +4586 9.18 -8.7150947e-07 -1.5372188e-06 +4587 9.182 -8.6844045e-07 -1.5318056e-06 +4588 9.184 -8.6538223e-07 -1.5264114e-06 +4589 9.186 -8.6233479e-07 -1.5210362e-06 +4590 9.188 -8.5929808e-07 -1.5156799e-06 +4591 9.19 -8.5627206e-07 -1.5103425e-06 +4592 9.192 -8.5325669e-07 -1.5050239e-06 +4593 9.194 -8.5025195e-07 -1.4997240e-06 +4594 9.196 -8.4725779e-07 -1.4944428e-06 +4595 9.198 -8.4427417e-07 -1.4891801e-06 +4596 9.2 -8.4130105e-07 -1.4839361e-06 +4597 9.202 -8.3833841e-07 -1.4787104e-06 +4598 9.204 -8.3538620e-07 -1.4735032e-06 +4599 9.206 -8.3244438e-07 -1.4683143e-06 +4600 9.208 -8.2951293e-07 -1.4631437e-06 +4601 9.21 -8.2659180e-07 -1.4579913e-06 +4602 9.212 -8.2368095e-07 -1.4528570e-06 +4603 9.214 -8.2078036e-07 -1.4477408e-06 +4604 9.216 -8.1788998e-07 -1.4426427e-06 +4605 9.218 -8.1500977e-07 -1.4375624e-06 +4606 9.22 -8.1213971e-07 -1.4325001e-06 +4607 9.222 -8.0927976e-07 -1.4274556e-06 +4608 9.224 -8.0642988e-07 -1.4224289e-06 +4609 9.226 -8.0359003e-07 -1.4174198e-06 +4610 9.228 -8.0076019e-07 -1.4124284e-06 +4611 9.23 -7.9794031e-07 -1.4074546e-06 +4612 9.232 -7.9513036e-07 -1.4024983e-06 +4613 9.234 -7.9233030e-07 -1.3975595e-06 +4614 9.236 -7.8954011e-07 -1.3926380e-06 +4615 9.238 -7.8675974e-07 -1.3877339e-06 +4616 9.24 -7.8398916e-07 -1.3828470e-06 +4617 9.242 -7.8122834e-07 -1.3779774e-06 +4618 9.244 -7.7847724e-07 -1.3731249e-06 +4619 9.246 -7.7573583e-07 -1.3682894e-06 +4620 9.248 -7.7300407e-07 -1.3634711e-06 +4621 9.25 -7.7028193e-07 -1.3586696e-06 +4622 9.252 -7.6756938e-07 -1.3538851e-06 +4623 9.254 -7.6486638e-07 -1.3491175e-06 +4624 9.256 -7.6217290e-07 -1.3443666e-06 +4625 9.258 -7.5948891e-07 -1.3396324e-06 +4626 9.26 -7.5681436e-07 -1.3349150e-06 +4627 9.262 -7.5414923e-07 -1.3302141e-06 +4628 9.264 -7.5149349e-07 -1.3255298e-06 +4629 9.266 -7.4884710e-07 -1.3208620e-06 +4630 9.268 -7.4621004e-07 -1.3162106e-06 +4631 9.27 -7.4358225e-07 -1.3115756e-06 +4632 9.272 -7.4096372e-07 -1.3069569e-06 +4633 9.274 -7.3835441e-07 -1.3023545e-06 +4634 9.276 -7.3575429e-07 -1.2977683e-06 +4635 9.278 -7.3316333e-07 -1.2931982e-06 +4636 9.28 -7.3058149e-07 -1.2886443e-06 +4637 9.282 -7.2800874e-07 -1.2841063e-06 +4638 9.284 -7.2544505e-07 -1.2795844e-06 +4639 9.286 -7.2289039e-07 -1.2750784e-06 +4640 9.288 -7.2034473e-07 -1.2705882e-06 +4641 9.29 -7.1780803e-07 -1.2661139e-06 +4642 9.292 -7.1528026e-07 -1.2616553e-06 +4643 9.294 -7.1276140e-07 -1.2572124e-06 +4644 9.296 -7.1025140e-07 -1.2527852e-06 +4645 9.298 -7.0775025e-07 -1.2483735e-06 +4646 9.3 -7.0525790e-07 -1.2439774e-06 +4647 9.302 -7.0277433e-07 -1.2395968e-06 +4648 9.304 -7.0029950e-07 -1.2352316e-06 +4649 9.306 -6.9783339e-07 -1.2308817e-06 +4650 9.308 -6.9537596e-07 -1.2265472e-06 +4651 9.31 -6.9292719e-07 -1.2222279e-06 +4652 9.312 -6.9048704e-07 -1.2179239e-06 +4653 9.314 -6.8805549e-07 -1.2136350e-06 +4654 9.316 -6.8563249e-07 -1.2093612e-06 +4655 9.318 -6.8321803e-07 -1.2051025e-06 +4656 9.32 -6.8081207e-07 -1.2008587e-06 +4657 9.322 -6.7841459e-07 -1.1966299e-06 +4658 9.324 -6.7602554e-07 -1.1924160e-06 +4659 9.326 -6.7364491e-07 -1.1882170e-06 +4660 9.328 -6.7127266e-07 -1.1840327e-06 +4661 9.33 -6.6890877e-07 -1.1798632e-06 +4662 9.332 -6.6655320e-07 -1.1757083e-06 +4663 9.334 -6.6420593e-07 -1.1715681e-06 +4664 9.336 -6.6186692e-07 -1.1674424e-06 +4665 9.338 -6.5953615e-07 -1.1633313e-06 +4666 9.34 -6.5721359e-07 -1.1592346e-06 +4667 9.342 -6.5489920e-07 -1.1551524e-06 +4668 9.344 -6.5259297e-07 -1.1510846e-06 +4669 9.346 -6.5029485e-07 -1.1470311e-06 +4670 9.348 -6.4800483e-07 -1.1429918e-06 +4671 9.35 -6.4572288e-07 -1.1389668e-06 +4672 9.352 -6.4344896e-07 -1.1349559e-06 +4673 9.354 -6.4118304e-07 -1.1309592e-06 +4674 9.356 -6.3892511e-07 -1.1269766e-06 +4675 9.358 -6.3667513e-07 -1.1230079e-06 +4676 9.36 -6.3443307e-07 -1.1190533e-06 +4677 9.362 -6.3219891e-07 -1.1151126e-06 +4678 9.364 -6.2997261e-07 -1.1111857e-06 +4679 9.366 -6.2775415e-07 -1.1072727e-06 +4680 9.368 -6.2554351e-07 -1.1033735e-06 +4681 9.37 -6.2334065e-07 -1.0994879e-06 +4682 9.372 -6.2114555e-07 -1.0956161e-06 +4683 9.374 -6.1895818e-07 -1.0917579e-06 +4684 9.376 -6.1677851e-07 -1.0879133e-06 +4685 9.378 -6.1460651e-07 -1.0840823e-06 +4686 9.38 -6.1244217e-07 -1.0802647e-06 +4687 9.382 -6.1028545e-07 -1.0764605e-06 +4688 9.384 -6.0813632e-07 -1.0726698e-06 +4689 9.386 -6.0599476e-07 -1.0688924e-06 +4690 9.388 -6.0386074e-07 -1.0651283e-06 +4691 9.39 -6.0173424e-07 -1.0613775e-06 +4692 9.392 -5.9961522e-07 -1.0576399e-06 +4693 9.394 -5.9750367e-07 -1.0539154e-06 +4694 9.396 -5.9539955e-07 -1.0502041e-06 +4695 9.398 -5.9330284e-07 -1.0465058e-06 +4696 9.4 -5.9121352e-07 -1.0428205e-06 +4697 9.402 -5.8913155e-07 -1.0391483e-06 +4698 9.404 -5.8705692e-07 -1.0354889e-06 +4699 9.406 -5.8498959e-07 -1.0318425e-06 +4700 9.408 -5.8292954e-07 -1.0282088e-06 +4701 9.41 -5.8087674e-07 -1.0245880e-06 +4702 9.412 -5.7883118e-07 -1.0209799e-06 +4703 9.414 -5.7679282e-07 -1.0173846e-06 +4704 9.416 -5.7476163e-07 -1.0138019e-06 +4705 9.418 -5.7273760e-07 -1.0102318e-06 +4706 9.42 -5.7072070e-07 -1.0066743e-06 +4707 9.422 -5.6871089e-07 -1.0031293e-06 +4708 9.424 -5.6670817e-07 -9.9959678e-07 +4709 9.426 -5.6471250e-07 -9.9607671e-07 +4710 9.428 -5.6272386e-07 -9.9256904e-07 +4711 9.43 -5.6074221e-07 -9.8907372e-07 +4712 9.432 -5.5876755e-07 -9.8559071e-07 +4713 9.434 -5.5679984e-07 -9.8211997e-07 +4714 9.436 -5.5483906e-07 -9.7866144e-07 +4715 9.438 -5.5288519e-07 -9.7521510e-07 +4716 9.44 -5.5093820e-07 -9.7178089e-07 +4717 9.442 -5.4899806e-07 -9.6835878e-07 +4718 9.444 -5.4706475e-07 -9.6494871e-07 +4719 9.446 -5.4513826e-07 -9.6155066e-07 +4720 9.448 -5.4321854e-07 -9.5816457e-07 +4721 9.45 -5.4130559e-07 -9.5479040e-07 +4722 9.452 -5.3939937e-07 -9.5142812e-07 +4723 9.454 -5.3749987e-07 -9.4807768e-07 +4724 9.456 -5.3560705e-07 -9.4473903e-07 +4725 9.458 -5.3372090e-07 -9.4141215e-07 +4726 9.46 -5.3184140e-07 -9.3809697e-07 +4727 9.462 -5.2996851e-07 -9.3479347e-07 +4728 9.464 -5.2810222e-07 -9.3150161e-07 +4729 9.466 -5.2624249e-07 -9.2822134e-07 +4730 9.468 -5.2438932e-07 -9.2495261e-07 +4731 9.47 -5.2254268e-07 -9.2169540e-07 +4732 9.472 -5.2070253e-07 -9.1844966e-07 +4733 9.474 -5.1886887e-07 -9.1521535e-07 +4734 9.476 -5.1704166e-07 -9.1199243e-07 +4735 9.478 -5.1522089e-07 -9.0878086e-07 +4736 9.48 -5.1340653e-07 -9.0558059e-07 +4737 9.482 -5.1159856e-07 -9.0239160e-07 +4738 9.484 -5.0979696e-07 -8.9921384e-07 +4739 9.486 -5.0800170e-07 -8.9604726e-07 +4740 9.488 -5.0621276e-07 -8.9289184e-07 +4741 9.49 -5.0443013e-07 -8.8974753e-07 +4742 9.492 -5.0265377e-07 -8.8661429e-07 +4743 9.494 -5.0088366e-07 -8.8349209e-07 +4744 9.496 -4.9911979e-07 -8.8038088e-07 +4745 9.498 -4.9736213e-07 -8.7728062e-07 +4746 9.5 -4.9561066e-07 -8.7419129e-07 +4747 9.502 -4.9386536e-07 -8.7111283e-07 +4748 9.504 -4.9212620e-07 -8.6804521e-07 +4749 9.506 -4.9039317e-07 -8.6498840e-07 +4750 9.508 -4.8866624e-07 -8.6194235e-07 +4751 9.51 -4.8694539e-07 -8.5890702e-07 +4752 9.512 -4.8523061e-07 -8.5588239e-07 +4753 9.514 -4.8352186e-07 -8.5286840e-07 +4754 9.516 -4.8181913e-07 -8.4986503e-07 +4755 9.518 -4.8012239e-07 -8.4687224e-07 +4756 9.52 -4.7843163e-07 -8.4388998e-07 +4757 9.522 -4.7674682e-07 -8.4091823e-07 +4758 9.524 -4.7506795e-07 -8.3795694e-07 +4759 9.526 -4.7339499e-07 -8.3500608e-07 +4760 9.528 -4.7172792e-07 -8.3206561e-07 +4761 9.53 -4.7006672e-07 -8.2913550e-07 +4762 9.532 -4.6841137e-07 -8.2621570e-07 +4763 9.534 -4.6676185e-07 -8.2330619e-07 +4764 9.536 -4.6511814e-07 -8.2040692e-07 +4765 9.538 -4.6348021e-07 -8.1751786e-07 +4766 9.54 -4.6184806e-07 -8.1463898e-07 +4767 9.542 -4.6022165e-07 -8.1177023e-07 +4768 9.544 -4.5860097e-07 -8.0891158e-07 +4769 9.546 -4.5698600e-07 -8.0606301e-07 +4770 9.548 -4.5537671e-07 -8.0322446e-07 +4771 9.55 -4.5377309e-07 -8.0039591e-07 +4772 9.552 -4.5217512e-07 -7.9757732e-07 +4773 9.554 -4.5058278e-07 -7.9476865e-07 +4774 9.556 -4.4899604e-07 -7.9196988e-07 +4775 9.558 -4.4741489e-07 -7.8918096e-07 +4776 9.56 -4.4583931e-07 -7.8640186e-07 +4777 9.562 -4.4426928e-07 -7.8363255e-07 +4778 9.564 -4.4270477e-07 -7.8087299e-07 +4779 9.566 -4.4114578e-07 -7.7812315e-07 +4780 9.568 -4.3959228e-07 -7.7538299e-07 +4781 9.57 -4.3804424e-07 -7.7265248e-07 +4782 9.572 -4.3650166e-07 -7.6993159e-07 +4783 9.574 -4.3496451e-07 -7.6722028e-07 +4784 9.576 -4.3343277e-07 -7.6451851e-07 +4785 9.578 -4.3190643e-07 -7.6182626e-07 +4786 9.58 -4.3038546e-07 -7.5914349e-07 +4787 9.582 -4.2886985e-07 -7.5647017e-07 +4788 9.584 -4.2735957e-07 -7.5380626e-07 +4789 9.586 -4.2585462e-07 -7.5115173e-07 +4790 9.588 -4.2435496e-07 -7.4850656e-07 +4791 9.59 -4.2286058e-07 -7.4587069e-07 +4792 9.592 -4.2137147e-07 -7.4324411e-07 +4793 9.594 -4.1988760e-07 -7.4062678e-07 +4794 9.596 -4.1840896e-07 -7.3801866e-07 +4795 9.598 -4.1693552e-07 -7.3541973e-07 +4796 9.6 -4.1546727e-07 -7.3282995e-07 +4797 9.602 -4.1400420e-07 -7.3024929e-07 +4798 9.604 -4.1254627e-07 -7.2767772e-07 +4799 9.606 -4.1109348e-07 -7.2511520e-07 +4800 9.608 -4.0964580e-07 -7.2256171e-07 +4801 9.61 -4.0820323e-07 -7.2001721e-07 +4802 9.612 -4.0676573e-07 -7.1748166e-07 +4803 9.614 -4.0533329e-07 -7.1495505e-07 +4804 9.616 -4.0390590e-07 -7.1243734e-07 +4805 9.618 -4.0248354e-07 -7.0992849e-07 +4806 9.62 -4.0106618e-07 -7.0742848e-07 +4807 9.622 -3.9965382e-07 -7.0493727e-07 +4808 9.624 -3.9824643e-07 -7.0245483e-07 +4809 9.626 -3.9684399e-07 -6.9998114e-07 +4810 9.628 -3.9544650e-07 -6.9751615e-07 +4811 9.63 -3.9405392e-07 -6.9505985e-07 +4812 9.632 -3.9266625e-07 -6.9261219e-07 +4813 9.634 -3.9128347e-07 -6.9017316e-07 +4814 9.636 -3.8990555e-07 -6.8774271e-07 +4815 9.638 -3.8853249e-07 -6.8532083e-07 +4816 9.64 -3.8716426e-07 -6.8290747e-07 +4817 9.642 -3.8580086e-07 -6.8050261e-07 +4818 9.644 -3.8444225e-07 -6.7810622e-07 +4819 9.646 -3.8308843e-07 -6.7571827e-07 +4820 9.648 -3.8173937e-07 -6.7333872e-07 +4821 9.65 -3.8039506e-07 -6.7096756e-07 +4822 9.652 -3.7905549e-07 -6.6860475e-07 +4823 9.654 -3.7772064e-07 -6.6625025e-07 +4824 9.656 -3.7639049e-07 -6.6390405e-07 +4825 9.658 -3.7506502e-07 -6.6156611e-07 +4826 9.66 -3.7374422e-07 -6.5923640e-07 +4827 9.662 -3.7242807e-07 -6.5691490e-07 +4828 9.664 -3.7111655e-07 -6.5460157e-07 +4829 9.666 -3.6980966e-07 -6.5229639e-07 +4830 9.668 -3.6850736e-07 -6.4999933e-07 +4831 9.67 -3.6720965e-07 -6.4771035e-07 +4832 9.672 -3.6591651e-07 -6.4542944e-07 +4833 9.674 -3.6462793e-07 -6.4315656e-07 +4834 9.676 -3.6334388e-07 -6.4089168e-07 +4835 9.678 -3.6206436e-07 -6.3863478e-07 +4836 9.68 -3.6078934e-07 -6.3638582e-07 +4837 9.682 -3.5951881e-07 -6.3414479e-07 +4838 9.684 -3.5825275e-07 -6.3191164e-07 +4839 9.686 -3.5699116e-07 -6.2968637e-07 +4840 9.688 -3.5573400e-07 -6.2746892e-07 +4841 9.69 -3.5448128e-07 -6.2525929e-07 +4842 9.692 -3.5323296e-07 -6.2305743e-07 +4843 9.694 -3.5198904e-07 -6.2086333e-07 +4844 9.696 -3.5074950e-07 -6.1867696e-07 +4845 9.698 -3.4951433e-07 -6.1649829e-07 +4846 9.7 -3.4828350e-07 -6.1432729e-07 +4847 9.702 -3.4705701e-07 -6.1216393e-07 +4848 9.704 -3.4583484e-07 -6.1000819e-07 +4849 9.706 -3.4461698e-07 -6.0786004e-07 +4850 9.708 -3.4340340e-07 -6.0571946e-07 +4851 9.71 -3.4219409e-07 -6.0358642e-07 +4852 9.712 -3.4098905e-07 -6.0146088e-07 +4853 9.714 -3.3978825e-07 -5.9934284e-07 +4854 9.716 -3.3859167e-07 -5.9723225e-07 +4855 9.718 -3.3739931e-07 -5.9512909e-07 +4856 9.72 -3.3621115e-07 -5.9303334e-07 +4857 9.722 -3.3502717e-07 -5.9094497e-07 +4858 9.724 -3.3384737e-07 -5.8886395e-07 +4859 9.726 -3.3267171e-07 -5.8679026e-07 +4860 9.728 -3.3150020e-07 -5.8472388e-07 +4861 9.73 -3.3033281e-07 -5.8266477e-07 +4862 9.732 -3.2916954e-07 -5.8061291e-07 +4863 9.734 -3.2801036e-07 -5.7856828e-07 +4864 9.736 -3.2685526e-07 -5.7653085e-07 +4865 9.738 -3.2570423e-07 -5.7450059e-07 +4866 9.74 -3.2455725e-07 -5.7247748e-07 +4867 9.742 -3.2341431e-07 -5.7046150e-07 +4868 9.744 -3.2227540e-07 -5.6845262e-07 +4869 9.746 -3.2114050e-07 -5.6645081e-07 +4870 9.748 -3.2000959e-07 -5.6445604e-07 +4871 9.75 -3.1888267e-07 -5.6246831e-07 +4872 9.752 -3.1775971e-07 -5.6048757e-07 +4873 9.754 -3.1664071e-07 -5.5851381e-07 +4874 9.756 -3.1552565e-07 -5.5654700e-07 +4875 9.758 -3.1441452e-07 -5.5458711e-07 +4876 9.76 -3.1330730e-07 -5.5263413e-07 +4877 9.762 -3.1220398e-07 -5.5068803e-07 +4878 9.764 -3.1110454e-07 -5.4874877e-07 +4879 9.766 -3.1000898e-07 -5.4681635e-07 +4880 9.768 -3.0891727e-07 -5.4489073e-07 +4881 9.77 -3.0782941e-07 -5.4297189e-07 +4882 9.772 -3.0674538e-07 -5.4105981e-07 +4883 9.774 -3.0566517e-07 -5.3915447e-07 +4884 9.776 -3.0458876e-07 -5.3725583e-07 +4885 9.778 -3.0351614e-07 -5.3536388e-07 +4886 9.78 -3.0244730e-07 -5.3347859e-07 +4887 9.782 -3.0138222e-07 -5.3159994e-07 +4888 9.784 -3.0032090e-07 -5.2972791e-07 +4889 9.786 -2.9926331e-07 -5.2786246e-07 +4890 9.788 -2.9820944e-07 -5.2600359e-07 +4891 9.79 -2.9715929e-07 -5.2415127e-07 +4892 9.792 -2.9611283e-07 -5.2230546e-07 +4893 9.794 -2.9507006e-07 -5.2046616e-07 +4894 9.796 -2.9403096e-07 -5.1863333e-07 +4895 9.798 -2.9299552e-07 -5.1680696e-07 +4896 9.8 -2.9196373e-07 -5.1498702e-07 +4897 9.802 -2.9093557e-07 -5.1317349e-07 +4898 9.804 -2.8991103e-07 -5.1136634e-07 +4899 9.806 -2.8889010e-07 -5.0956556e-07 +4900 9.808 -2.8787277e-07 -5.0777112e-07 +4901 9.81 -2.8685901e-07 -5.0598300e-07 +4902 9.812 -2.8584883e-07 -5.0420117e-07 +4903 9.814 -2.8484220e-07 -5.0242562e-07 +4904 9.816 -2.8383912e-07 -5.0065632e-07 +4905 9.818 -2.8283957e-07 -4.9889326e-07 +4906 9.82 -2.8184355e-07 -4.9713640e-07 +4907 9.822 -2.8085103e-07 -4.9538573e-07 +4908 9.824 -2.7986200e-07 -4.9364122e-07 +4909 9.826 -2.7887646e-07 -4.9190286e-07 +4910 9.828 -2.7789438e-07 -4.9017062e-07 +4911 9.83 -2.7691577e-07 -4.8844448e-07 +4912 9.832 -2.7594060e-07 -4.8672441e-07 +4913 9.834 -2.7496887e-07 -4.8501041e-07 +4914 9.836 -2.7400056e-07 -4.8330244e-07 +4915 9.838 -2.7303565e-07 -4.8160048e-07 +4916 9.84 -2.7207415e-07 -4.7990452e-07 +4917 9.842 -2.7111603e-07 -4.7821453e-07 +4918 9.844 -2.7016129e-07 -4.7653049e-07 +4919 9.846 -2.6920991e-07 -4.7485238e-07 +4920 9.848 -2.6826187e-07 -4.7318019e-07 +4921 9.85 -2.6731718e-07 -4.7151388e-07 +4922 9.852 -2.6637582e-07 -4.6985343e-07 +4923 9.854 -2.6543776e-07 -4.6819884e-07 +4924 9.856 -2.6450302e-07 -4.6655007e-07 +4925 9.858 -2.6357156e-07 -4.6490711e-07 +4926 9.86 -2.6264338e-07 -4.6326993e-07 +4927 9.862 -2.6171848e-07 -4.6163852e-07 +4928 9.864 -2.6079683e-07 -4.6001286e-07 +4929 9.866 -2.5987842e-07 -4.5839291e-07 +4930 9.868 -2.5896325e-07 -4.5677868e-07 +4931 9.87 -2.5805130e-07 -4.5517013e-07 +4932 9.872 -2.5714257e-07 -4.5356724e-07 +4933 9.874 -2.5623703e-07 -4.5196999e-07 +4934 9.876 -2.5533468e-07 -4.5037838e-07 +4935 9.878 -2.5443551e-07 -4.4879236e-07 +4936 9.88 -2.5353951e-07 -4.4721193e-07 +4937 9.882 -2.5264666e-07 -4.4563707e-07 +4938 9.884 -2.5175696e-07 -4.4406775e-07 +4939 9.886 -2.5087039e-07 -4.4250396e-07 +4940 9.888 -2.4998694e-07 -4.4094568e-07 +4941 9.89 -2.4910660e-07 -4.3939288e-07 +4942 9.892 -2.4822936e-07 -4.3784555e-07 +4943 9.894 -2.4735521e-07 -4.3630368e-07 +4944 9.896 -2.4648414e-07 -4.3476723e-07 +4945 9.898 -2.4561614e-07 -4.3323619e-07 +4946 9.9 -2.4475120e-07 -4.3171054e-07 +4947 9.902 -2.4388930e-07 -4.3019026e-07 +4948 9.904 -2.4303043e-07 -4.2867534e-07 +4949 9.906 -2.4217459e-07 -4.2716576e-07 +4950 9.908 -2.4132176e-07 -4.2566149e-07 +4951 9.91 -2.4047194e-07 -4.2416251e-07 +4952 9.912 -2.3962511e-07 -4.2266882e-07 +4953 9.914 -2.3878126e-07 -4.2118038e-07 +4954 9.916 -2.3794039e-07 -4.1969719e-07 +4955 9.918 -2.3710247e-07 -4.1821922e-07 +4956 9.92 -2.3626751e-07 -4.1674645e-07 +4957 9.922 -2.3543548e-07 -4.1527887e-07 +4958 9.924 -2.3460639e-07 -4.1381646e-07 +4959 9.926 -2.3378021e-07 -4.1235920e-07 +4960 9.928 -2.3295695e-07 -4.1090707e-07 +4961 9.93 -2.3213658e-07 -4.0946006e-07 +4962 9.932 -2.3131910e-07 -4.0801814e-07 +4963 9.934 -2.3050450e-07 -4.0658129e-07 +4964 9.936 -2.2969277e-07 -4.0514951e-07 +4965 9.938 -2.2888390e-07 -4.0372277e-07 +4966 9.94 -2.2807788e-07 -4.0230106e-07 +4967 9.942 -2.2727470e-07 -4.0088435e-07 +4968 9.944 -2.2647434e-07 -3.9947262e-07 +4969 9.946 -2.2567680e-07 -3.9806588e-07 +4970 9.948 -2.2488207e-07 -3.9666408e-07 +4971 9.95 -2.2409014e-07 -3.9526722e-07 +4972 9.952 -2.2330100e-07 -3.9387528e-07 +4973 9.954 -2.2251464e-07 -3.9248824e-07 +4974 9.956 -2.2173104e-07 -3.9110609e-07 +4975 9.958 -2.2095021e-07 -3.8972880e-07 +4976 9.96 -2.2017213e-07 -3.8835636e-07 +4977 9.962 -2.1939678e-07 -3.8698876e-07 +4978 9.964 -2.1862417e-07 -3.8562597e-07 +4979 9.966 -2.1785427e-07 -3.8426798e-07 +4980 9.968 -2.1708709e-07 -3.8291478e-07 +4981 9.97 -2.1632261e-07 -3.8156634e-07 +4982 9.972 -2.1556082e-07 -3.8022264e-07 +4983 9.974 -2.1480172e-07 -3.7888368e-07 +4984 9.976 -2.1404529e-07 -3.7754944e-07 +4985 9.978 -2.1329152e-07 -3.7621989e-07 +4986 9.98 -2.1254040e-07 -3.7489503e-07 +4987 9.982 -2.1179193e-07 -3.7357483e-07 +4988 9.984 -2.1104610e-07 -3.7225928e-07 +4989 9.986 -2.1030289e-07 -3.7094836e-07 +4990 9.988 -2.0956230e-07 -3.6964206e-07 +4991 9.99 -2.0882432e-07 -3.6834036e-07 +4992 9.992 -2.0808894e-07 -3.6704324e-07 +4993 9.994 -2.0735615e-07 -3.6575069e-07 +4994 9.996 -2.0662593e-07 -3.6446269e-07 +4995 9.998 -2.0589829e-07 -3.6317923e-07 + +Pair_O-O +N 4995 + +1 0.01 2.2000000e+25 2.6400000e+28 +2 0.012 2.4674464e+24 2.4674464e+27 +3 0.014 3.8804872e+23 3.3261319e+26 +4 0.016 7.8159701e+22 5.8619776e+25 +5 0.018 1.9017465e+22 1.2678310e+25 +6 0.02 5.3710938e+21 3.2226562e+24 +7 0.022 1.7113960e+21 9.3348872e+23 +8 0.024 6.0240391e+20 3.0120195e+23 +9 0.026 2.3053799e+20 1.0640215e+23 +10 0.028 9.4738456e+19 4.0602196e+22 +11 0.03 4.1396881e+19 1.6558753e+22 +12 0.032 1.9081958e+19 7.1557343e+21 +13 0.034 9.2188272e+18 3.2537037e+21 +14 0.036 4.6429357e+18 1.5476452e+21 +15 0.038 2.4267192e+18 7.6633237e+20 +16 0.04 1.3113022e+18 3.9339066e+20 +17 0.042 7.3018212e+17 2.0862346e+20 +18 0.044 4.1782129e+17 1.1395126e+20 +19 0.046 2.4509175e+17 6.3936979e+19 +20 0.048 1.4707127e+17 3.6767817e+19 +21 0.05 9.0112000e+16 2.1626880e+19 +22 0.052 5.6283689e+16 1.2988544e+19 +23 0.054 3.5784715e+16 7.9521589e+18 +24 0.056 2.3129506e+16 4.9563227e+18 +25 0.058 1.5180524e+16 3.1407980e+18 +26 0.06 1.0106660e+16 2.0213321e+18 +27 0.062 6.8190269e+15 1.3198117e+18 +28 0.064 4.6586812e+15 8.7350273e+17 +29 0.066 3.2202935e+15 5.8550791e+17 +30 0.068 2.2506902e+15 3.9718063e+17 +31 0.07 1.5894475e+15 2.7247672e+17 +32 0.072 1.1335292e+15 1.8892154e+17 +33 0.074 8.1590960e+14 1.3230967e+17 +34 0.076 5.9246074e+14 9.3546432e+16 +35 0.078 4.3379790e+14 6.6738139e+16 +36 0.08 3.2014214e+14 4.8021320e+16 +37 0.082 2.3804357e+14 3.4835644e+16 +38 0.084 1.7826712e+14 2.5466731e+16 +39 0.086 1.3441300e+14 1.8755302e+16 +40 0.088 1.0200715e+14 1.3910066e+16 +41 0.09 7.7895536e+13 1.0386071e+16 +42 0.092 5.9836854e+13 7.8048071e+15 +43 0.094 4.6226226e+13 5.9012203e+15 +44 0.096 3.5906071e+13 4.4882589e+15 +45 0.098 2.8035595e+13 3.4329300e+15 +46 0.1 2.2000000e+13 2.6400000e+15 +47 0.102 1.7346850e+13 2.0408059e+15 +48 0.104 1.3741135e+13 1.5855156e+15 +49 0.106 1.0933326e+13 1.2377350e+15 +50 0.108 8.7365027e+12 9.7072252e+14 +51 0.11 7.0098780e+12 7.6471396e+14 +52 0.112 5.6468520e+12 6.0501986e+14 +53 0.114 4.5663003e+12 4.8066318e+14 +54 0.116 3.7061826e+12 3.8339820e+14 +55 0.118 3.0188296e+12 3.0699962e+14 +56 0.12 2.4674464e+12 2.4674464e+14 +57 0.122 2.0235070e+12 1.9903348e+14 +58 0.124 1.6648015e+12 1.6110982e+14 +59 0.126 1.3739665e+12 1.3085395e+14 +60 0.128 1.1373733e+12 1.0662875e+14 +61 0.13 9.4428361e+11 8.7164641e+13 +62 0.132 7.8620447e+11 7.1473133e+13 +63 0.134 6.5639475e+11 5.8781620e+13 +64 0.136 5.4948492e+11 4.8483964e+13 +65 0.138 4.6118338e+11 4.0102902e+13 +66 0.14 3.8804872e+11 3.3261319e+13 +67 0.142 3.2731247e+11 2.7660209e+13 +68 0.144 2.7674054e+11 2.3061711e+13 +69 0.146 2.3452460e+11 1.9275995e+13 +70 0.148 1.9919668e+11 1.6151082e+13 +71 0.15 1.6956163e+11 1.3564930e+13 +72 0.152 1.4464373e+11 1.1419242e+13 +73 0.154 1.2364428e+11 9.6346192e+12 +74 0.156 1.0590769e+11 8.1467455e+12 +75 0.158 9.0894507e+10 6.9033803e+12 +76 0.16 7.8159702e+10 5.8619776e+12 +77 0.162 6.7335255e+10 4.9877966e+12 +78 0.164 5.8116106e+10 4.2523980e+12 +79 0.166 5.0248792e+10 3.6324428e+12 +80 0.168 4.3522247e+10 3.1087319e+12 +81 0.17 3.7760317e+10 2.6654341e+12 +82 0.172 3.2815674e+10 2.2894656e+12 +83 0.174 2.8564834e+10 1.9699885e+12 +84 0.176 2.4904090e+10 1.6980061e+12 +85 0.178 2.1746164e+10 1.4660335e+12 +86 0.18 1.9017465e+10 1.2678310e+12 +87 0.182 1.6655821e+10 1.0981860e+12 +88 0.184 1.4608608e+10 9.5273524e+11 +89 0.186 1.2831203e+10 8.2781950e+11 +90 0.188 1.1285700e+10 7.2036381e+11 +91 0.19 9.9398423e+09 6.2777948e+11 +92 0.192 8.7661311e+09 5.4788316e+11 +93 0.194 7.7410871e+09 4.7883010e+11 +94 0.196 6.8446281e+09 4.1905883e+11 +95 0.198 6.0595509e+09 3.6724548e+11 +96 0.2 5.3710943e+09 3.2226563e+11 +97 0.202 4.7665735e+09 2.8316275e+11 +98 0.204 4.2350713e+09 2.4912181e+11 +99 0.206 3.7671776e+09 2.1944721e+11 +100 0.208 3.3547698e+09 1.9354438e+11 +101 0.21 2.9908265e+09 1.7090434e+11 +102 0.212 2.6692695e+09 1.5109070e+11 +103 0.214 2.3848304e+09 1.3372878e+11 +104 0.216 2.1329357e+09 1.1849640e+11 +105 0.218 1.9096108e+09 1.0511617e+11 +106 0.22 1.7113965e+09 9.3348874e+10 +107 0.222 1.5352783e+09 8.2987994e+10 +108 0.224 1.3786265e+09 7.3854965e+10 +109 0.226 1.2391434e+09 6.5795202e+10 +110 0.228 1.1148199e+09 5.8674706e+10 +111 0.23 1.0038963e+09 5.2377175e+10 +112 0.232 9.0483021e+08 4.6801539e+10 +113 0.234 8.1626776e+08 4.1859862e+10 +114 0.236 7.3701940e+08 3.7475540e+10 +115 0.238 6.6603876e+08 3.3581764e+10 +116 0.24 6.0240437e+08 3.0120197e+10 +117 0.242 5.4530397e+08 2.7039845e+10 +118 0.244 4.9402072e+08 2.4296080e+10 +119 0.246 4.4792143e+08 2.1849805e+10 +120 0.248 4.0644613e+08 1.9666728e+10 +121 0.25 3.6909920e+08 1.7716741e+10 +122 0.252 3.3544149e+08 1.5973384e+10 +123 0.254 3.0508350e+08 1.4413374e+10 +124 0.256 2.7767948e+08 1.3016206e+10 +125 0.258 2.5292221e+08 1.1763804e+10 +126 0.26 2.3053843e+08 1.0640216e+10 +127 0.262 2.1028490e+08 9.6313507e+09 +128 0.264 1.9194488e+08 8.7247489e+09 +129 0.266 1.7532511e+08 7.9093850e+09 +130 0.268 1.6025305e+08 7.1754919e+09 +131 0.27 1.4657462e+08 6.5144098e+09 +132 0.272 1.3415202e+08 5.9184538e+09 +133 0.274 1.2286195e+08 5.3807982e+09 +134 0.276 1.1259402e+08 4.8953750e+09 +135 0.278 1.0324925e+08 4.4567851e+09 +136 0.28 9.4738872e+07 4.0602207e+09 +137 0.282 8.6983213e+07 3.7013969e+09 +138 0.284 7.9910681e+07 3.3764914e+09 +139 0.286 7.3456917e+07 3.0820924e+09 +140 0.288 6.7564013e+07 2.8151514e+09 +141 0.29 6.2179830e+07 2.5729429e+09 +142 0.292 5.7257385e+07 2.3530278e+09 +143 0.294 5.2754317e+07 2.1532222e+09 +144 0.296 4.8632399e+07 1.9715688e+09 +145 0.298 4.4857115e+07 1.8063120e+09 +146 0.3 4.1397274e+07 1.6558763e+09 +147 0.302 3.8224675e+07 1.5188468e+09 +148 0.304 3.5313800e+07 1.3939515e+09 +149 0.306 3.2641545e+07 1.2800465e+09 +150 0.308 3.0186976e+07 1.1761021e+09 +151 0.31 2.7931116e+07 1.0811908e+09 +152 0.312 2.5856750e+07 9.9447683e+08 +153 0.314 2.3948249e+07 9.1520630e+08 +154 0.316 2.2191417e+07 8.4269883e+08 +155 0.318 2.0573355e+07 7.7633998e+08 +156 0.32 1.9082330e+07 7.1557447e+08 +157 0.322 1.7707664e+07 6.5990022e+08 +158 0.324 1.6439639e+07 6.0886292e+08 +159 0.326 1.5269397e+07 5.6205124e+08 +160 0.328 1.4188866e+07 5.1909256e+08 +161 0.33 1.3190684e+07 4.7964909e+08 +162 0.332 1.2268131e+07 4.4341443e+08 +163 0.334 1.1415073e+07 4.1011052e+08 +164 0.336 1.0625904e+07 3.7948486e+08 +165 0.338 9.8955010e+06 3.5130800e+08 +166 0.34 9.2191787e+06 3.2537135e+08 +167 0.342 8.5926490e+06 3.0148517e+08 +168 0.344 8.0119865e+06 2.7947675e+08 +169 0.346 7.4735953e+06 2.5918882e+08 +170 0.348 6.9741801e+06 2.4047808e+08 +171 0.35 6.5107189e+06 2.2321388e+08 +172 0.352 6.0804398e+06 2.0727708e+08 +173 0.354 5.6807984e+06 1.9255892e+08 +174 0.356 5.3094581e+06 1.7896011e+08 +175 0.358 4.9642724e+06 1.6638992e+08 +176 0.36 4.6432681e+06 1.5476545e+08 +177 0.362 4.3446308e+06 1.4401088e+08 +178 0.364 4.0666910e+06 1.3405682e+08 +179 0.366 3.8079123e+06 1.2483978e+08 +180 0.368 3.5668795e+06 1.1630160e+08 +181 0.37 3.3422890e+06 1.0838898e+08 +182 0.372 3.1329392e+06 1.0105308e+08 +183 0.374 2.9377221e+06 9.4249099e+07 +184 0.376 2.7556156e+06 8.7935923e+07 +185 0.378 2.5856764e+06 8.2075814e+07 +186 0.38 2.4270335e+06 7.6634114e+07 +187 0.382 2.2788823e+06 7.1578980e+07 +188 0.384 2.1404794e+06 6.6881136e+07 +189 0.386 2.0111376e+06 6.2513665e+07 +190 0.388 1.8902211e+06 5.8451797e+07 +191 0.39 1.7771419e+06 5.4672737e+07 +192 0.392 1.6713556e+06 5.1155491e+07 +193 0.394 1.5723583e+06 4.7880723e+07 +194 0.396 1.4796830e+06 4.4830609e+07 +195 0.398 1.3928971e+06 4.1988719e+07 +196 0.4 1.3115994e+06 3.9339895e+07 +197 0.402 1.2354181e+06 3.6870155e+07 +198 0.404 1.1640081e+06 3.4566586e+07 +199 0.406 1.0970490e+06 3.2417269e+07 +200 0.408 1.0342435e+06 3.0411189e+07 +201 0.41 9.7531553e+05 2.8538167e+07 +202 0.412 9.2000843e+05 2.6788792e+07 +203 0.414 8.6808375e+05 2.5154360e+07 +204 0.416 8.1931975e+05 2.3626817e+07 +205 0.418 7.7351020e+05 2.2198709e+07 +206 0.42 7.3046324e+05 2.0863132e+07 +207 0.422 6.9000026e+05 1.9613692e+07 +208 0.424 6.5195500e+05 1.8444465e+07 +209 0.426 6.1617259e+05 1.7349960e+07 +210 0.428 5.8250875e+05 1.6325082e+07 +211 0.43 5.5082901e+05 1.5365107e+07 +212 0.432 5.2100799e+05 1.4465652e+07 +213 0.434 4.9292877e+05 1.3622648e+07 +214 0.436 4.6648229e+05 1.2832314e+07 +215 0.438 4.4156675e+05 1.2091142e+07 +216 0.44 4.1808713e+05 1.1395869e+07 +217 0.442 3.9595470e+05 1.0743463e+07 +218 0.444 3.7508658e+05 1.0131105e+07 +219 0.446 3.5540533e+05 9.5561721e+06 +220 0.448 3.3683857e+05 9.0162249e+06 +221 0.45 3.1931863e+05 8.5089921e+06 +222 0.452 3.0278221e+05 8.0323591e+06 +223 0.454 2.8717011e+05 7.5843567e+06 +224 0.456 2.7242692e+05 7.1631501e+06 +225 0.458 2.5850078e+05 6.7670293e+06 +226 0.46 2.4534314e+05 6.3944006e+06 +227 0.462 2.3290851e+05 6.0437773e+06 +228 0.464 2.2115429e+05 5.7137732e+06 +229 0.466 2.1004054e+05 5.4030944e+06 +230 0.468 1.9952983e+05 5.1105335e+06 +231 0.47 1.8958708e+05 4.8349631e+06 +232 0.472 1.8017936e+05 4.5753303e+06 +233 0.474 1.7127579e+05 4.3306518e+06 +234 0.476 1.6284740e+05 4.1000083e+06 +235 0.478 1.5486697e+05 3.8825409e+06 +236 0.48 1.4730899e+05 3.6774463e+06 +237 0.482 1.4014944e+05 3.4839734e+06 +238 0.484 1.3336581e+05 3.3014194e+06 +239 0.486 1.2693692e+05 3.1291268e+06 +240 0.488 1.2084288e+05 2.9664800e+06 +241 0.49 1.1506496e+05 2.8129027e+06 +242 0.492 1.0958558e+05 2.6678552e+06 +243 0.494 1.0438819e+05 2.5308320e+06 +244 0.496 9.9457219e+04 2.4013592e+06 +245 0.498 9.4778016e+04 2.2789929e+06 +246 0.5 9.0336788e+04 2.1633167e+06 +247 0.502 8.6120550e+04 2.0539404e+06 +248 0.504 8.2117071e+04 1.9504976e+06 +249 0.506 7.8314833e+04 1.8526449e+06 +250 0.508 7.4702980e+04 1.7600598e+06 +251 0.51 7.1271284e+04 1.6724397e+06 +252 0.512 6.8010102e+04 1.5895003e+06 +253 0.514 6.4910341e+04 1.5109749e+06 +254 0.516 6.1963427e+04 1.4366125e+06 +255 0.518 5.9161272e+04 1.3661778e+06 +256 0.52 5.6496245e+04 1.2994491e+06 +257 0.522 5.3961144e+04 1.2362185e+06 +258 0.524 5.1549170e+04 1.1762900e+06 +259 0.526 4.9253906e+04 1.1194797e+06 +260 0.528 4.7069288e+04 1.0656144e+06 +261 0.53 4.4989594e+04 1.0145310e+06 +262 0.532 4.3009412e+04 9.6607621e+05 +263 0.534 4.1123633e+04 9.2010564e+05 +264 0.536 3.9327424e+04 8.7648329e+05 +265 0.538 3.7616220e+04 8.3508113e+05 +266 0.54 3.5985700e+04 7.9577850e+05 +267 0.542 3.4431782e+04 7.5846176e+05 +268 0.544 3.2950601e+04 7.2302376e+05 +269 0.546 3.1538502e+04 6.8936352e+05 +270 0.548 3.0192025e+04 6.5738582e+05 +271 0.55 2.8907897e+04 6.2700087e+05 +272 0.552 2.7683017e+04 5.9812397e+05 +273 0.554 2.6514449e+04 5.7067521e+05 +274 0.556 2.5399414e+04 5.4457916e+05 +275 0.558 2.4335278e+04 5.1976464e+05 +276 0.56 2.3319546e+04 4.9616447e+05 +277 0.562 2.2349853e+04 4.7371518e+05 +278 0.564 2.1423958e+04 4.5235685e+05 +279 0.566 2.0539736e+04 4.3203286e+05 +280 0.568 1.9695173e+04 4.1268972e+05 +281 0.57 1.8888357e+04 3.9427689e+05 +282 0.572 1.8117477e+04 3.7674659e+05 +283 0.574 1.7380813e+04 3.6005364e+05 +284 0.576 1.6676733e+04 3.4415533e+05 +285 0.578 1.6003689e+04 3.2901126e+05 +286 0.58 1.5360210e+04 3.1458322e+05 +287 0.582 1.4744902e+04 3.0083506e+05 +288 0.584 1.4156440e+04 2.8773256e+05 +289 0.586 1.3593563e+04 2.7524333e+05 +290 0.588 1.3055078e+04 2.6333672e+05 +291 0.59 1.2539847e+04 2.5198370e+05 +292 0.592 1.2046792e+04 2.4115678e+05 +293 0.594 1.1574887e+04 2.3082992e+05 +294 0.596 1.1123156e+04 2.2097845e+05 +295 0.598 1.0690672e+04 2.1157900e+05 +296 0.6 1.0276553e+04 2.0260940e+05 +297 0.602 9.8799617e+03 1.9404867e+05 +298 0.604 9.5000994e+03 1.8587690e+05 +299 0.606 9.1362074e+03 1.7807521e+05 +300 0.608 8.7875638e+03 1.7062569e+05 +301 0.61 8.4534812e+03 1.6351136e+05 +302 0.612 8.1333056e+03 1.5671611e+05 +303 0.614 7.8264143e+03 1.5022466e+05 +304 0.616 7.5322142e+03 1.4402249e+05 +305 0.618 7.2501407e+03 1.3809583e+05 +306 0.62 6.9796559e+03 1.3243160e+05 +307 0.622 6.7202476e+03 1.2701739e+05 +308 0.624 6.4714275e+03 1.2184142e+05 +309 0.626 6.2327306e+03 1.1689247e+05 +310 0.628 6.0037134e+03 1.1215991e+05 +311 0.63 5.7839534e+03 1.0763363e+05 +312 0.632 5.5730478e+03 1.0330403e+05 +313 0.634 5.3706123e+03 9.9161967e+04 +314 0.636 5.1762807e+03 9.5198764e+04 +315 0.638 4.9897035e+03 9.1406169e+04 +316 0.64 4.8105475e+03 8.7776334e+04 +317 0.642 4.6384946e+03 8.4301793e+04 +318 0.644 4.4732415e+03 8.0975447e+04 +319 0.646 4.3144986e+03 7.7790540e+04 +320 0.648 4.1619894e+03 7.4740645e+04 +321 0.65 4.0154501e+03 7.1819646e+04 +322 0.652 3.8746287e+03 6.9021719e+04 +323 0.654 3.7392848e+03 6.6341323e+04 +324 0.656 3.6091886e+03 6.3773180e+04 +325 0.658 3.4841206e+03 6.1312265e+04 +326 0.66 3.3638713e+03 5.8953793e+04 +327 0.662 3.2482402e+03 5.6693205e+04 +328 0.664 3.1370361e+03 5.4526157e+04 +329 0.666 3.0300760e+03 5.2448513e+04 +330 0.668 2.9271851e+03 5.0456329e+04 +331 0.67 2.8281962e+03 4.8545846e+04 +332 0.672 2.7329496e+03 4.6713483e+04 +333 0.674 2.6412925e+03 4.4955823e+04 +334 0.676 2.5530787e+03 4.3269611e+04 +335 0.678 2.4681685e+03 4.1651740e+04 +336 0.68 2.3864282e+03 4.0099250e+04 +337 0.682 2.3077298e+03 3.8609314e+04 +338 0.684 2.2319510e+03 3.7179236e+04 +339 0.686 2.1589747e+03 3.5806446e+04 +340 0.688 2.0886887e+03 3.4488489e+04 +341 0.69 2.0209857e+03 3.3223021e+04 +342 0.692 1.9557631e+03 3.2007808e+04 +343 0.694 1.8929224e+03 3.0840714e+04 +344 0.696 1.8323695e+03 2.9719701e+04 +345 0.698 1.7740142e+03 2.8642822e+04 +346 0.7 1.7177700e+03 2.7608219e+04 +347 0.702 1.6635543e+03 2.6614116e+04 +348 0.704 1.6112877e+03 2.5658817e+04 +349 0.706 1.5608942e+03 2.4740701e+04 +350 0.708 1.5123011e+03 2.3858219e+04 +351 0.71 1.4654386e+03 2.3009891e+04 +352 0.712 1.4202398e+03 2.2194303e+04 +353 0.714 1.3766405e+03 2.1410102e+04 +354 0.716 1.3345793e+03 2.0655995e+04 +355 0.718 1.2939973e+03 1.9930746e+04 +356 0.72 1.2548378e+03 1.9233174e+04 +357 0.722 1.2170469e+03 1.8562146e+04 +358 0.724 1.1805723e+03 1.7916583e+04 +359 0.726 1.1453642e+03 1.7295448e+04 +360 0.728 1.1113749e+03 1.6697753e+04 +361 0.73 1.0785582e+03 1.6122550e+04 +362 0.732 1.0468703e+03 1.5568932e+04 +363 0.734 1.0162687e+03 1.5036033e+04 +364 0.736 9.8671289e+02 1.4523021e+04 +365 0.738 9.5816389e+02 1.4029101e+04 +366 0.74 9.3058427e+02 1.3553512e+04 +367 0.742 9.0393811e+02 1.3095526e+04 +368 0.744 8.7819090e+02 1.2654444e+04 +369 0.746 8.5330951e+02 1.2229598e+04 +370 0.748 8.2926211e+02 1.1820346e+04 +371 0.75 8.0601813e+02 1.1426077e+04 +372 0.752 7.8354821e+02 1.1046200e+04 +373 0.754 7.6182411e+02 1.0680154e+04 +374 0.756 7.4081873e+02 1.0327399e+04 +375 0.758 7.2050600e+02 9.9874166e+03 +376 0.76 7.0086088e+02 9.6597112e+03 +377 0.762 6.8185929e+02 9.3438073e+03 +378 0.764 6.6347809e+02 9.0392491e+03 +379 0.766 6.4569502e+02 8.7455994e+03 +380 0.768 6.2848870e+02 8.4624390e+03 +381 0.77 6.1183854e+02 8.1893659e+03 +382 0.772 5.9572477e+02 7.9259944e+03 +383 0.774 5.8012834e+02 7.6719545e+03 +384 0.776 5.6503096e+02 7.4268914e+03 +385 0.778 5.5041502e+02 7.1904644e+03 +386 0.78 5.3626357e+02 6.9623467e+03 +387 0.782 5.2256030e+02 6.7422248e+03 +388 0.784 5.0928954e+02 6.5297976e+03 +389 0.786 4.9643618e+02 6.3247762e+03 +390 0.788 4.8398568e+02 6.1268830e+03 +391 0.79 4.7192407e+02 5.9358519e+03 +392 0.792 4.6023787e+02 5.7514270e+03 +393 0.794 4.4891412e+02 5.5733628e+03 +394 0.796 4.3794034e+02 5.4014234e+03 +395 0.798 4.2730450e+02 5.2353822e+03 +396 0.8 4.1699502e+02 5.0750216e+03 +397 0.802 4.0700076e+02 4.9201326e+03 +398 0.804 3.9731098e+02 4.7705142e+03 +399 0.806 3.8791532e+02 4.6259735e+03 +400 0.808 3.7880382e+02 4.4863250e+03 +401 0.81 3.6996688e+02 4.3513903e+03 +402 0.812 3.6139523e+02 4.2209982e+03 +403 0.814 3.5307997e+02 4.0949839e+03 +404 0.816 3.4501248e+02 3.9731891e+03 +405 0.818 3.3718450e+02 3.8554615e+03 +406 0.82 3.2958802e+02 3.7416547e+03 +407 0.822 3.2221536e+02 3.6316280e+03 +408 0.824 3.1505908e+02 3.5252459e+03 +409 0.826 3.0811203e+02 3.4223782e+03 +410 0.828 3.0136731e+02 3.3228997e+03 +411 0.83 2.9481826e+02 3.2266899e+03 +412 0.832 2.8845845e+02 3.1336328e+03 +413 0.834 2.8228170e+02 3.0436169e+03 +414 0.836 2.7628203e+02 2.9565348e+03 +415 0.838 2.7045367e+02 2.8722831e+03 +416 0.84 2.6479107e+02 2.7907626e+03 +417 0.842 2.5928886e+02 2.7118774e+03 +418 0.844 2.5394187e+02 2.6355355e+03 +419 0.846 2.4874509e+02 2.5616481e+03 +420 0.848 2.4369370e+02 2.4901299e+03 +421 0.85 2.3878304e+02 2.4208986e+03 +422 0.852 2.3400863e+02 2.3538750e+03 +423 0.854 2.2936612e+02 2.2889829e+03 +424 0.856 2.2485133e+02 2.2261489e+03 +425 0.858 2.2046020e+02 2.1653021e+03 +426 0.86 2.1618884e+02 2.1063744e+03 +427 0.862 2.1203347e+02 2.0493002e+03 +428 0.864 2.0799044e+02 1.9940162e+03 +429 0.866 2.0405625e+02 1.9404614e+03 +430 0.868 2.0022748e+02 1.8885771e+03 +431 0.87 1.9650087e+02 1.8383067e+03 +432 0.872 1.9287322e+02 1.7895956e+03 +433 0.874 1.8934148e+02 1.7423912e+03 +434 0.876 1.8590268e+02 1.6966429e+03 +435 0.878 1.8255397e+02 1.6523016e+03 +436 0.88 1.7929257e+02 1.6093204e+03 +437 0.882 1.7611581e+02 1.5676537e+03 +438 0.884 1.7302111e+02 1.5272578e+03 +439 0.886 1.7000596e+02 1.4880903e+03 +440 0.888 1.6706795e+02 1.4501106e+03 +441 0.89 1.6420475e+02 1.4132792e+03 +442 0.892 1.6141410e+02 1.3775583e+03 +443 0.894 1.5869380e+02 1.3429114e+03 +444 0.896 1.5604176e+02 1.3093030e+03 +445 0.898 1.5345592e+02 1.2766991e+03 +446 0.9 1.5093432e+02 1.2450669e+03 +447 0.902 1.4847503e+02 1.2143747e+03 +448 0.904 1.4607621e+02 1.1845918e+03 +449 0.906 1.4373607e+02 1.1556887e+03 +450 0.908 1.4145289e+02 1.1276369e+03 +451 0.91 1.3922498e+02 1.1004089e+03 +452 0.912 1.3705072e+02 1.0739781e+03 +453 0.914 1.3492855e+02 1.0483188e+03 +454 0.916 1.3285695e+02 1.0234062e+03 +455 0.918 1.3083444e+02 9.9921647e+02 +456 0.92 1.2885962e+02 9.7572648e+02 +457 0.922 1.2693109e+02 9.5291390e+02 +458 0.924 1.2504752e+02 9.3075720e+02 +459 0.926 1.2320763e+02 9.0923554e+02 +460 0.928 1.2141017e+02 8.8832884e+02 +461 0.93 1.1965392e+02 8.6801765e+02 +462 0.932 1.1793772e+02 8.4828321e+02 +463 0.934 1.1626042e+02 8.2910739e+02 +464 0.936 1.1462093e+02 8.1047266e+02 +465 0.938 1.1301818e+02 7.9236209e+02 +466 0.94 1.1145114e+02 7.7475931e+02 +467 0.942 1.0991881e+02 7.5764851e+02 +468 0.944 1.0842023e+02 7.4101440e+02 +469 0.946 1.0695445e+02 7.2484218e+02 +470 0.948 1.0552056e+02 7.0911759e+02 +471 0.95 1.0411769e+02 6.9382680e+02 +472 0.952 1.0274497e+02 6.7895646e+02 +473 0.954 1.0140159e+02 6.6449366e+02 +474 0.956 1.0008673e+02 6.5042590e+02 +475 0.958 9.8799630e+01 6.3674111e+02 +476 0.96 9.7539522e+01 6.2342761e+02 +477 0.962 9.6305680e+01 6.1047410e+02 +478 0.964 9.5097393e+01 5.9786965e+02 +479 0.966 9.3913975e+01 5.8560370e+02 +480 0.968 9.2754760e+01 5.7366601e+02 +481 0.97 9.1619099e+01 5.6204670e+02 +482 0.972 9.0506367e+01 5.5073618e+02 +483 0.974 8.9415955e+01 5.3972519e+02 +484 0.976 8.8347272e+01 5.2900478e+02 +485 0.978 8.7299748e+01 5.1856626e+02 +486 0.98 8.6272825e+01 5.0840124e+02 +487 0.982 8.5265966e+01 4.9850159e+02 +488 0.984 8.4278647e+01 4.8885944e+02 +489 0.986 8.3310361e+01 4.7946719e+02 +490 0.988 8.2360617e+01 4.7031745e+02 +491 0.99 8.1428935e+01 4.6140309e+02 +492 0.992 8.0514852e+01 4.5271720e+02 +493 0.994 7.9617918e+01 4.4425309e+02 +494 0.996 7.8737696e+01 4.3600428e+02 +495 0.998 7.7873762e+01 4.2796449e+02 +496 1.0 7.7025703e+01 4.2012765e+02 +497 1.002 7.6193120e+01 4.1248787e+02 +498 1.004 7.5375624e+01 4.0503944e+02 +499 1.006 7.4572838e+01 3.9777685e+02 +500 1.008 7.3784396e+01 3.9069474e+02 +501 1.01 7.3009942e+01 3.8378793e+02 +502 1.012 7.2249131e+01 3.7705139e+02 +503 1.014 7.1501626e+01 3.7048027e+02 +504 1.016 7.0767103e+01 3.6406984e+02 +505 1.018 7.0045243e+01 3.5781553e+02 +506 1.02 6.9335739e+01 3.5171292e+02 +507 1.022 6.8638293e+01 3.4575771e+02 +508 1.024 6.7952613e+01 3.3994574e+02 +509 1.026 6.7278417e+01 3.3427298e+02 +510 1.028 6.6615431e+01 3.2873553e+02 +511 1.03 6.5963387e+01 3.2332958e+02 +512 1.032 6.5322027e+01 3.1805146e+02 +513 1.034 6.4691099e+01 3.1289762e+02 +514 1.036 6.4070356e+01 3.0786460e+02 +515 1.038 6.3459562e+01 3.0294904e+02 +516 1.04 6.2858484e+01 2.9814770e+02 +517 1.042 6.2266897e+01 2.9345743e+02 +518 1.044 6.1684582e+01 2.8887518e+02 +519 1.046 6.1111326e+01 2.8439797e+02 +520 1.048 6.0546922e+01 2.8002293e+02 +521 1.05 5.9991168e+01 2.7574728e+02 +522 1.052 5.9443869e+01 2.7156831e+02 +523 1.054 5.8904833e+01 2.6748339e+02 +524 1.056 5.8373874e+01 2.6348998e+02 +525 1.058 5.7850813e+01 2.5958560e+02 +526 1.06 5.7335474e+01 2.5576786e+02 +527 1.062 5.6827686e+01 2.5203443e+02 +528 1.064 5.6327282e+01 2.4838305e+02 +529 1.066 5.5834100e+01 2.4481153e+02 +530 1.068 5.5347984e+01 2.4131774e+02 +531 1.07 5.4868779e+01 2.3789962e+02 +532 1.072 5.4396336e+01 2.3455516e+02 +533 1.074 5.3930510e+01 2.3128241e+02 +534 1.076 5.3471160e+01 2.2807949e+02 +535 1.078 5.3018147e+01 2.2494456e+02 +536 1.08 5.2571338e+01 2.2187583e+02 +537 1.082 5.2130601e+01 2.1887159e+02 +538 1.084 5.1695809e+01 2.1593014e+02 +539 1.086 5.1266839e+01 2.1304986e+02 +540 1.088 5.0843570e+01 2.1022916e+02 +541 1.09 5.0425884e+01 2.0746651e+02 +542 1.092 5.0013666e+01 2.0476041e+02 +543 1.094 4.9606806e+01 2.0210940e+02 +544 1.096 4.9205193e+01 1.9951208e+02 +545 1.098 4.8808722e+01 1.9696708e+02 +546 1.1 4.8417291e+01 1.9447306e+02 +547 1.102 4.8030797e+01 1.9202873e+02 +548 1.104 4.7649144e+01 1.8963283e+02 +549 1.106 4.7272234e+01 1.8728414e+02 +550 1.108 4.6899976e+01 1.8498148e+02 +551 1.11 4.6532278e+01 1.8272369e+02 +552 1.112 4.6169052e+01 1.8050965e+02 +553 1.114 4.5810211e+01 1.7833827e+02 +554 1.116 4.5455672e+01 1.7620849e+02 +555 1.118 4.5105350e+01 1.7411928e+02 +556 1.12 4.4759168e+01 1.7206963e+02 +557 1.122 4.4417046e+01 1.7005859e+02 +558 1.124 4.4078909e+01 1.6808519e+02 +559 1.126 4.3744681e+01 1.6614851e+02 +560 1.128 4.3414291e+01 1.6424768e+02 +561 1.13 4.3087667e+01 1.6238180e+02 +562 1.132 4.2764741e+01 1.6055004e+02 +563 1.134 4.2445445e+01 1.5875158e+02 +564 1.136 4.2129713e+01 1.5698560e+02 +565 1.138 4.1817481e+01 1.5525134e+02 +566 1.14 4.1508687e+01 1.5354804e+02 +567 1.142 4.1203269e+01 1.5187496e+02 +568 1.144 4.0901167e+01 1.5023138e+02 +569 1.146 4.0602324e+01 1.4861660e+02 +570 1.148 4.0306682e+01 1.4702995e+02 +571 1.15 4.0014186e+01 1.4547077e+02 +572 1.152 3.9724781e+01 1.4393841e+02 +573 1.154 3.9438415e+01 1.4243225e+02 +574 1.156 3.9155035e+01 1.4095167e+02 +575 1.158 3.8874591e+01 1.3949610e+02 +576 1.16 3.8597034e+01 1.3806494e+02 +577 1.162 3.8322316e+01 1.3665764e+02 +578 1.164 3.8050388e+01 1.3527366e+02 +579 1.166 3.7781206e+01 1.3391246e+02 +580 1.168 3.7514724e+01 1.3257351e+02 +581 1.17 3.7250897e+01 1.3125633e+02 +582 1.172 3.6989684e+01 1.2996042e+02 +583 1.174 3.6731042e+01 1.2868529e+02 +584 1.176 3.6474929e+01 1.2743049e+02 +585 1.178 3.6221307e+01 1.2619556e+02 +586 1.18 3.5970134e+01 1.2498006e+02 +587 1.182 3.5721374e+01 1.2378356e+02 +588 1.184 3.5474988e+01 1.2260563e+02 +589 1.186 3.5230939e+01 1.2144588e+02 +590 1.188 3.4989192e+01 1.2030391e+02 +591 1.19 3.4749712e+01 1.1917932e+02 +592 1.192 3.4512464e+01 1.1807174e+02 +593 1.194 3.4277414e+01 1.1698081e+02 +594 1.196 3.4044530e+01 1.1590616e+02 +595 1.198 3.3813779e+01 1.1484744e+02 +596 1.2 3.3585129e+01 1.1380432e+02 +597 1.202 3.3358551e+01 1.1277646e+02 +598 1.204 3.3134014e+01 1.1176354e+02 +599 1.206 3.2911487e+01 1.1076525e+02 +600 1.208 3.2690943e+01 1.0978127e+02 +601 1.21 3.2472353e+01 1.0881131e+02 +602 1.212 3.2255689e+01 1.0785508e+02 +603 1.214 3.2040923e+01 1.0691230e+02 +604 1.216 3.1828031e+01 1.0598267e+02 +605 1.218 3.1616984e+01 1.0506595e+02 +606 1.22 3.1407758e+01 1.0416185e+02 +607 1.222 3.1200329e+01 1.0327012e+02 +608 1.224 3.0994670e+01 1.0239052e+02 +609 1.226 3.0790759e+01 1.0152280e+02 +610 1.228 3.0588571e+01 1.0066671e+02 +611 1.23 3.0388084e+01 9.9822035e+01 +612 1.232 3.0189275e+01 9.8988536e+01 +613 1.234 2.9992123e+01 9.8165995e+01 +614 1.236 2.9796604e+01 9.7354195e+01 +615 1.238 2.9602699e+01 9.6552926e+01 +616 1.24 2.9410386e+01 9.5761982e+01 +617 1.242 2.9219644e+01 9.4981162e+01 +618 1.244 2.9030454e+01 9.4210270e+01 +619 1.246 2.8842797e+01 9.3449115e+01 +620 1.248 2.8656652e+01 9.2697509e+01 +621 1.25 2.8472000e+01 9.1955272e+01 +622 1.252 2.8288824e+01 9.1222224e+01 +623 1.254 2.8107105e+01 9.0498193e+01 +624 1.256 2.7926826e+01 8.9783008e+01 +625 1.258 2.7747968e+01 8.9076505e+01 +626 1.26 2.7570514e+01 8.8378521e+01 +627 1.262 2.7394448e+01 8.7688899e+01 +628 1.264 2.7219753e+01 8.7007484e+01 +629 1.266 2.7046413e+01 8.6334126e+01 +630 1.268 2.6874411e+01 8.5668679e+01 +631 1.27 2.6703733e+01 8.5010997e+01 +632 1.272 2.6534362e+01 8.4360942e+01 +633 1.274 2.6366284e+01 8.3718377e+01 +634 1.276 2.6199484e+01 8.3083166e+01 +635 1.278 2.6033946e+01 8.2455180e+01 +636 1.28 2.5869658e+01 8.1834290e+01 +637 1.282 2.5706605e+01 8.1220373e+01 +638 1.284 2.5544772e+01 8.0613305e+01 +639 1.286 2.5384147e+01 8.0012968e+01 +640 1.288 2.5224716e+01 7.9419244e+01 +641 1.29 2.5066466e+01 7.8832021e+01 +642 1.292 2.4909383e+01 7.8251187e+01 +643 1.294 2.4753457e+01 7.7676632e+01 +644 1.296 2.4598673e+01 7.7108251e+01 +645 1.298 2.4445020e+01 7.6545939e+01 +646 1.3 2.4292485e+01 7.5989595e+01 +647 1.302 2.4141057e+01 7.5439119e+01 +648 1.304 2.3990725e+01 7.4894414e+01 +649 1.306 2.3841476e+01 7.4355384e+01 +650 1.308 2.3693300e+01 7.3821937e+01 +651 1.31 2.3546185e+01 7.3293982e+01 +652 1.312 2.3400120e+01 7.2771430e+01 +653 1.314 2.3255095e+01 7.2254193e+01 +654 1.316 2.3111100e+01 7.1742187e+01 +655 1.318 2.2968123e+01 7.1235327e+01 +656 1.32 2.2826155e+01 7.0733533e+01 +657 1.322 2.2685186e+01 7.0236724e+01 +658 1.324 2.2545205e+01 6.9744823e+01 +659 1.326 2.2406203e+01 6.9257753e+01 +660 1.328 2.2268171e+01 6.8775439e+01 +661 1.33 2.2131098e+01 6.8297808e+01 +662 1.332 2.1994976e+01 6.7824788e+01 +663 1.334 2.1859796e+01 6.7356310e+01 +664 1.336 2.1725548e+01 6.6892303e+01 +665 1.338 2.1592224e+01 6.6432702e+01 +666 1.34 2.1459814e+01 6.5977440e+01 +667 1.342 2.1328311e+01 6.5526452e+01 +668 1.344 2.1197706e+01 6.5079676e+01 +669 1.346 2.1067990e+01 6.4637050e+01 +670 1.348 2.0939155e+01 6.4198512e+01 +671 1.35 2.0811193e+01 6.3764004e+01 +672 1.352 2.0684096e+01 6.3333468e+01 +673 1.354 2.0557857e+01 6.2906845e+01 +674 1.356 2.0432466e+01 6.2484082e+01 +675 1.358 2.0307918e+01 6.2065122e+01 +676 1.36 2.0184203e+01 6.1649912e+01 +677 1.362 2.0061316e+01 6.1238400e+01 +678 1.364 1.9939247e+01 6.0830534e+01 +679 1.366 1.9817991e+01 6.0426264e+01 +680 1.368 1.9697540e+01 6.0025540e+01 +681 1.37 1.9577887e+01 5.9628314e+01 +682 1.372 1.9459024e+01 5.9234537e+01 +683 1.374 1.9340946e+01 5.8844164e+01 +684 1.376 1.9223645e+01 5.8457149e+01 +685 1.378 1.9107115e+01 5.8073447e+01 +686 1.38 1.8991349e+01 5.7693014e+01 +687 1.382 1.8876341e+01 5.7315806e+01 +688 1.384 1.8762084e+01 5.6941782e+01 +689 1.386 1.8648572e+01 5.6570900e+01 +690 1.388 1.8535798e+01 5.6203119e+01 +691 1.39 1.8423757e+01 5.5838399e+01 +692 1.392 1.8312443e+01 5.5476702e+01 +693 1.394 1.8201849e+01 5.5117988e+01 +694 1.396 1.8091969e+01 5.4762220e+01 +695 1.398 1.7982798e+01 5.4409360e+01 +696 1.4 1.7874330e+01 5.4059373e+01 +697 1.402 1.7766558e+01 5.3712223e+01 +698 1.404 1.7659479e+01 5.3367875e+01 +699 1.406 1.7553085e+01 5.3026294e+01 +700 1.408 1.7447372e+01 5.2687447e+01 +701 1.41 1.7342333e+01 5.2351299e+01 +702 1.412 1.7237965e+01 5.2017820e+01 +703 1.414 1.7134260e+01 5.1686977e+01 +704 1.416 1.7031215e+01 5.1358738e+01 +705 1.418 1.6928824e+01 5.1033073e+01 +706 1.42 1.6827081e+01 5.0709951e+01 +707 1.422 1.6725982e+01 5.0389342e+01 +708 1.424 1.6625522e+01 5.0071218e+01 +709 1.426 1.6525696e+01 4.9755549e+01 +710 1.428 1.6426498e+01 4.9442308e+01 +711 1.43 1.6327925e+01 4.9131466e+01 +712 1.432 1.6229971e+01 4.8822996e+01 +713 1.434 1.6132631e+01 4.8516872e+01 +714 1.436 1.6035902e+01 4.8213067e+01 +715 1.438 1.5939778e+01 4.7911555e+01 +716 1.44 1.5844254e+01 4.7612311e+01 +717 1.442 1.5749327e+01 4.7315310e+01 +718 1.444 1.5654991e+01 4.7020527e+01 +719 1.446 1.5561243e+01 4.6727937e+01 +720 1.448 1.5468078e+01 4.6437518e+01 +721 1.45 1.5375492e+01 4.6149246e+01 +722 1.452 1.5283480e+01 4.5863097e+01 +723 1.454 1.5192038e+01 4.5579049e+01 +724 1.456 1.5101162e+01 4.5297080e+01 +725 1.458 1.5010848e+01 4.5017167e+01 +726 1.46 1.4921092e+01 4.4739290e+01 +727 1.462 1.4831890e+01 4.4463427e+01 +728 1.464 1.4743237e+01 4.4189557e+01 +729 1.466 1.4655130e+01 4.3917659e+01 +730 1.468 1.4567565e+01 4.3647714e+01 +731 1.47 1.4480538e+01 4.3379701e+01 +732 1.472 1.4394045e+01 4.3113601e+01 +733 1.474 1.4308082e+01 4.2849395e+01 +734 1.476 1.4222646e+01 4.2587062e+01 +735 1.478 1.4137733e+01 4.2326586e+01 +736 1.48 1.4053339e+01 4.2067947e+01 +737 1.482 1.3969460e+01 4.1811128e+01 +738 1.484 1.3886093e+01 4.1556109e+01 +739 1.486 1.3803234e+01 4.1302875e+01 +740 1.488 1.3720880e+01 4.1051407e+01 +741 1.49 1.3639028e+01 4.0801688e+01 +742 1.492 1.3557672e+01 4.0553701e+01 +743 1.494 1.3476812e+01 4.0307431e+01 +744 1.496 1.3396442e+01 4.0062860e+01 +745 1.498 1.3316559e+01 3.9819973e+01 +746 1.5 1.3237161e+01 3.9578754e+01 +747 1.502 1.3158243e+01 3.9339186e+01 +748 1.504 1.3079803e+01 3.9101255e+01 +749 1.506 1.3001837e+01 3.8864946e+01 +750 1.508 1.2924342e+01 3.8630243e+01 +751 1.51 1.2847315e+01 3.8397132e+01 +752 1.512 1.2770752e+01 3.8165598e+01 +753 1.514 1.2694651e+01 3.7935627e+01 +754 1.516 1.2619009e+01 3.7707204e+01 +755 1.518 1.2543822e+01 3.7480316e+01 +756 1.52 1.2469087e+01 3.7254949e+01 +757 1.522 1.2394801e+01 3.7031090e+01 +758 1.524 1.2320961e+01 3.6808724e+01 +759 1.526 1.2247565e+01 3.6587840e+01 +760 1.528 1.2174609e+01 3.6368423e+01 +761 1.53 1.2102090e+01 3.6150461e+01 +762 1.532 1.2030006e+01 3.5933941e+01 +763 1.534 1.1958353e+01 3.5718851e+01 +764 1.536 1.1887130e+01 3.5505179e+01 +765 1.538 1.1816332e+01 3.5292911e+01 +766 1.54 1.1745957e+01 3.5082037e+01 +767 1.542 1.1676003e+01 3.4872544e+01 +768 1.544 1.1606466e+01 3.4664421e+01 +769 1.546 1.1537344e+01 3.4457655e+01 +770 1.548 1.1468634e+01 3.4252236e+01 +771 1.55 1.1400334e+01 3.4048153e+01 +772 1.552 1.1332441e+01 3.3845394e+01 +773 1.554 1.1264952e+01 3.3643948e+01 +774 1.556 1.1197864e+01 3.3443804e+01 +775 1.558 1.1131176e+01 3.3244952e+01 +776 1.56 1.1064884e+01 3.3047381e+01 +777 1.562 1.0998985e+01 3.2851080e+01 +778 1.564 1.0933479e+01 3.2656040e+01 +779 1.566 1.0868360e+01 3.2462250e+01 +780 1.568 1.0803629e+01 3.2269699e+01 +781 1.57 1.0739281e+01 3.2078379e+01 +782 1.572 1.0675314e+01 3.1888279e+01 +783 1.574 1.0611727e+01 3.1699389e+01 +784 1.576 1.0548516e+01 3.1511700e+01 +785 1.578 1.0485679e+01 3.1325203e+01 +786 1.58 1.0423214e+01 3.1139887e+01 +787 1.582 1.0361119e+01 3.0955744e+01 +788 1.584 1.0299391e+01 3.0772764e+01 +789 1.586 1.0238027e+01 3.0590939e+01 +790 1.588 1.0177026e+01 3.0410260e+01 +791 1.59 1.0116385e+01 3.0230717e+01 +792 1.592 1.0056103e+01 3.0052301e+01 +793 1.594 9.9961754e+00 2.9875005e+01 +794 1.596 9.9366017e+00 2.9698820e+01 +795 1.598 9.8773794e+00 2.9523737e+01 +796 1.6 9.8185061e+00 2.9349747e+01 +797 1.602 9.7599797e+00 2.9176843e+01 +798 1.604 9.7017980e+00 2.9005017e+01 +799 1.606 9.6439589e+00 2.8834259e+01 +800 1.608 9.5864602e+00 2.8664563e+01 +801 1.61 9.5292999e+00 2.8495920e+01 +802 1.612 9.4724759e+00 2.8328323e+01 +803 1.614 9.4159859e+00 2.8161763e+01 +804 1.616 9.3598281e+00 2.7996233e+01 +805 1.618 9.3040003e+00 2.7831726e+01 +806 1.62 9.2485005e+00 2.7668233e+01 +807 1.622 9.1933267e+00 2.7505748e+01 +808 1.624 9.1384769e+00 2.7344263e+01 +809 1.626 9.0839490e+00 2.7183771e+01 +810 1.628 9.0297411e+00 2.7024264e+01 +811 1.63 8.9758513e+00 2.6865736e+01 +812 1.632 8.9222775e+00 2.6708180e+01 +813 1.634 8.8690179e+00 2.6551588e+01 +814 1.636 8.8160706e+00 2.6395953e+01 +815 1.638 8.7634335e+00 2.6241269e+01 +816 1.64 8.7111048e+00 2.6087529e+01 +817 1.642 8.6590827e+00 2.5934726e+01 +818 1.644 8.6073653e+00 2.5782854e+01 +819 1.646 8.5559507e+00 2.5631905e+01 +820 1.648 8.5048371e+00 2.5481874e+01 +821 1.65 8.4540226e+00 2.5332754e+01 +822 1.652 8.4035055e+00 2.5184539e+01 +823 1.654 8.3532839e+00 2.5037222e+01 +824 1.656 8.3033560e+00 2.4890797e+01 +825 1.658 8.2537201e+00 2.4745258e+01 +826 1.66 8.2043744e+00 2.4600598e+01 +827 1.662 8.1553171e+00 2.4456812e+01 +828 1.664 8.1065465e+00 2.4313893e+01 +829 1.666 8.0580610e+00 2.4171836e+01 +830 1.668 8.0098586e+00 2.4030635e+01 +831 1.67 7.9619379e+00 2.3890283e+01 +832 1.672 7.9142969e+00 2.3750775e+01 +833 1.674 7.8669342e+00 2.3612106e+01 +834 1.676 7.8198480e+00 2.3474269e+01 +835 1.678 7.7730366e+00 2.3337259e+01 +836 1.68 7.7264984e+00 2.3201070e+01 +837 1.682 7.6802317e+00 2.3065696e+01 +838 1.684 7.6342350e+00 2.2931133e+01 +839 1.686 7.5885067e+00 2.2797375e+01 +840 1.688 7.5430450e+00 2.2664416e+01 +841 1.69 7.4978485e+00 2.2532251e+01 +842 1.692 7.4529155e+00 2.2400875e+01 +843 1.694 7.4082445e+00 2.2270282e+01 +844 1.696 7.3638338e+00 2.2140467e+01 +845 1.698 7.3196821e+00 2.2011425e+01 +846 1.7 7.2757876e+00 2.1883151e+01 +847 1.702 7.2321490e+00 2.1755640e+01 +848 1.704 7.1887646e+00 2.1628887e+01 +849 1.706 7.1456329e+00 2.1502887e+01 +850 1.708 7.1027525e+00 2.1377634e+01 +851 1.71 7.0601219e+00 2.1253124e+01 +852 1.712 7.0177395e+00 2.1129353e+01 +853 1.714 6.9756040e+00 2.1006314e+01 +854 1.716 6.9337138e+00 2.0884004e+01 +855 1.718 6.8920675e+00 2.0762418e+01 +856 1.72 6.8506636e+00 2.0641551e+01 +857 1.722 6.8095008e+00 2.0521398e+01 +858 1.724 6.7685776e+00 2.0401955e+01 +859 1.726 6.7278925e+00 2.0283217e+01 +860 1.728 6.6874442e+00 2.0165180e+01 +861 1.73 6.6472313e+00 2.0047838e+01 +862 1.732 6.6072524e+00 1.9931188e+01 +863 1.734 6.5675061e+00 1.9815226e+01 +864 1.736 6.5279911e+00 1.9699946e+01 +865 1.738 6.4887059e+00 1.9585344e+01 +866 1.74 6.4496492e+00 1.9471417e+01 +867 1.742 6.4108198e+00 1.9358159e+01 +868 1.744 6.3722162e+00 1.9245567e+01 +869 1.746 6.3338371e+00 1.9133635e+01 +870 1.748 6.2956812e+00 1.9022361e+01 +871 1.75 6.2577472e+00 1.8911740e+01 +872 1.752 6.2200338e+00 1.8801768e+01 +873 1.754 6.1825397e+00 1.8692440e+01 +874 1.756 6.1452636e+00 1.8583752e+01 +875 1.758 6.1082042e+00 1.8475702e+01 +876 1.76 6.0713604e+00 1.8368283e+01 +877 1.762 6.0347307e+00 1.8261494e+01 +878 1.764 5.9983140e+00 1.8155329e+01 +879 1.766 5.9621090e+00 1.8049784e+01 +880 1.768 5.9261144e+00 1.7944857e+01 +881 1.77 5.8903291e+00 1.7840542e+01 +882 1.772 5.8547519e+00 1.7736836e+01 +883 1.774 5.8193814e+00 1.7633736e+01 +884 1.776 5.7842165e+00 1.7531237e+01 +885 1.778 5.7492560e+00 1.7429336e+01 +886 1.78 5.7144988e+00 1.7328030e+01 +887 1.782 5.6799435e+00 1.7227313e+01 +888 1.784 5.6455891e+00 1.7127184e+01 +889 1.786 5.6114344e+00 1.7027637e+01 +890 1.788 5.5774782e+00 1.6928670e+01 +891 1.79 5.5437193e+00 1.6830279e+01 +892 1.792 5.5101567e+00 1.6732461e+01 +893 1.794 5.4767891e+00 1.6635211e+01 +894 1.796 5.4436155e+00 1.6538527e+01 +895 1.798 5.4106346e+00 1.6442404e+01 +896 1.8 5.3778455e+00 1.6346840e+01 +897 1.802 5.3452469e+00 1.6251831e+01 +898 1.804 5.3128378e+00 1.6157374e+01 +899 1.806 5.2806170e+00 1.6063465e+01 +900 1.808 5.2485836e+00 1.5970101e+01 +901 1.81 5.2167363e+00 1.5877279e+01 +902 1.812 5.1850741e+00 1.5784994e+01 +903 1.814 5.1535959e+00 1.5693245e+01 +904 1.816 5.1223008e+00 1.5602028e+01 +905 1.818 5.0911875e+00 1.5511339e+01 +906 1.82 5.0602550e+00 1.5421175e+01 +907 1.822 5.0295024e+00 1.5331534e+01 +908 1.824 4.9989286e+00 1.5242411e+01 +909 1.826 4.9685324e+00 1.5153805e+01 +910 1.828 4.9383130e+00 1.5065711e+01 +911 1.83 4.9082693e+00 1.4978126e+01 +912 1.832 4.8784002e+00 1.4891049e+01 +913 1.834 4.8487047e+00 1.4804474e+01 +914 1.836 4.8191819e+00 1.4718400e+01 +915 1.838 4.7898308e+00 1.4632824e+01 +916 1.84 4.7606503e+00 1.4547742e+01 +917 1.842 4.7316395e+00 1.4463151e+01 +918 1.844 4.7027974e+00 1.4379049e+01 +919 1.846 4.6741230e+00 1.4295433e+01 +920 1.848 4.6456153e+00 1.4212299e+01 +921 1.85 4.6172735e+00 1.4129645e+01 +922 1.852 4.5890964e+00 1.4047468e+01 +923 1.854 4.5610833e+00 1.3965765e+01 +924 1.856 4.5332330e+00 1.3884534e+01 +925 1.858 4.5055448e+00 1.3803770e+01 +926 1.86 4.4780177e+00 1.3723473e+01 +927 1.862 4.4506506e+00 1.3643638e+01 +928 1.864 4.4234428e+00 1.3564263e+01 +929 1.866 4.3963933e+00 1.3485346e+01 +930 1.868 4.3695011e+00 1.3406883e+01 +931 1.87 4.3427654e+00 1.3328872e+01 +932 1.872 4.3161853e+00 1.3251310e+01 +933 1.874 4.2897599e+00 1.3174195e+01 +934 1.876 4.2634882e+00 1.3097524e+01 +935 1.878 4.2373695e+00 1.3021294e+01 +936 1.88 4.2114028e+00 1.2945503e+01 +937 1.882 4.1855872e+00 1.2870148e+01 +938 1.884 4.1599219e+00 1.2795227e+01 +939 1.886 4.1344060e+00 1.2720736e+01 +940 1.888 4.1090387e+00 1.2646674e+01 +941 1.89 4.0838190e+00 1.2573038e+01 +942 1.892 4.0587462e+00 1.2499825e+01 +943 1.894 4.0338194e+00 1.2427033e+01 +944 1.896 4.0090378e+00 1.2354659e+01 +945 1.898 3.9844005e+00 1.2282702e+01 +946 1.9 3.9599067e+00 1.2211157e+01 +947 1.902 3.9355556e+00 1.2140024e+01 +948 1.904 3.9113464e+00 1.2069299e+01 +949 1.906 3.8872782e+00 1.1998981e+01 +950 1.908 3.8633502e+00 1.1929067e+01 +951 1.91 3.8395616e+00 1.1859553e+01 +952 1.912 3.8159117e+00 1.1790440e+01 +953 1.914 3.7923996e+00 1.1721722e+01 +954 1.916 3.7690245e+00 1.1653400e+01 +955 1.918 3.7457857e+00 1.1585469e+01 +956 1.92 3.7226824e+00 1.1517928e+01 +957 1.922 3.6997138e+00 1.1450775e+01 +958 1.924 3.6768790e+00 1.1384007e+01 +959 1.926 3.6541775e+00 1.1317622e+01 +960 1.928 3.6316083e+00 1.1251618e+01 +961 1.93 3.6091708e+00 1.1185993e+01 +962 1.932 3.5868641e+00 1.1120744e+01 +963 1.934 3.5646875e+00 1.1055869e+01 +964 1.936 3.5426404e+00 1.0991366e+01 +965 1.938 3.5207218e+00 1.0927233e+01 +966 1.94 3.4989312e+00 1.0863468e+01 +967 1.942 3.4772677e+00 1.0800068e+01 +968 1.944 3.4557307e+00 1.0737031e+01 +969 1.946 3.4343193e+00 1.0674356e+01 +970 1.948 3.4130330e+00 1.0612040e+01 +971 1.95 3.3918709e+00 1.0550081e+01 +972 1.952 3.3708324e+00 1.0488478e+01 +973 1.954 3.3499168e+00 1.0427227e+01 +974 1.956 3.3291233e+00 1.0366327e+01 +975 1.958 3.3084513e+00 1.0305776e+01 +976 1.96 3.2879000e+00 1.0245572e+01 +977 1.962 3.2674687e+00 1.0185713e+01 +978 1.964 3.2471569e+00 1.0126196e+01 +979 1.966 3.2269637e+00 1.0067021e+01 +980 1.968 3.2068886e+00 1.0008184e+01 +981 1.97 3.1869308e+00 9.9496842e+00 +982 1.972 3.1670896e+00 9.8915194e+00 +983 1.974 3.1473645e+00 9.8336877e+00 +984 1.976 3.1277546e+00 9.7761872e+00 +985 1.978 3.1082595e+00 9.7190158e+00 +986 1.98 3.0888784e+00 9.6621717e+00 +987 1.982 3.0696106e+00 9.6056531e+00 +988 1.984 3.0504555e+00 9.5494580e+00 +989 1.986 3.0314125e+00 9.4935846e+00 +990 1.988 3.0124810e+00 9.4380309e+00 +991 1.99 2.9936602e+00 9.3827953e+00 +992 1.992 2.9749496e+00 9.3278758e+00 +993 1.994 2.9563485e+00 9.2732706e+00 +994 1.996 2.9378563e+00 9.2189779e+00 +995 1.998 2.9194724e+00 9.1649959e+00 +996 2.0 2.9011961e+00 9.1113228e+00 +997 2.002 2.8830269e+00 9.0579568e+00 +998 2.004 2.8649641e+00 9.0048962e+00 +999 2.006 2.8470071e+00 8.9521392e+00 +1000 2.008 2.8291553e+00 8.8996841e+00 +1001 2.01 2.8114082e+00 8.8475291e+00 +1002 2.012 2.7937650e+00 8.7956725e+00 +1003 2.014 2.7762253e+00 8.7441126e+00 +1004 2.016 2.7587884e+00 8.6928477e+00 +1005 2.018 2.7414537e+00 8.6418761e+00 +1006 2.02 2.7242207e+00 8.5911961e+00 +1007 2.022 2.7070887e+00 8.5408060e+00 +1008 2.024 2.6900572e+00 8.4907041e+00 +1009 2.026 2.6731257e+00 8.4408889e+00 +1010 2.028 2.6562935e+00 8.3913586e+00 +1011 2.03 2.6395601e+00 8.3421117e+00 +1012 2.032 2.6229249e+00 8.2931465e+00 +1013 2.034 2.6063873e+00 8.2444614e+00 +1014 2.036 2.5899468e+00 8.1960548e+00 +1015 2.038 2.5736029e+00 8.1479250e+00 +1016 2.04 2.5573550e+00 8.1000706e+00 +1017 2.042 2.5412024e+00 8.0524899e+00 +1018 2.044 2.5251448e+00 8.0051813e+00 +1019 2.046 2.5091815e+00 7.9581434e+00 +1020 2.048 2.4933121e+00 7.9113745e+00 +1021 2.05 2.4775359e+00 7.8648731e+00 +1022 2.052 2.4618524e+00 7.8186378e+00 +1023 2.054 2.4462611e+00 7.7726668e+00 +1024 2.056 2.4307615e+00 7.7269589e+00 +1025 2.058 2.4153531e+00 7.6815124e+00 +1026 2.06 2.4000353e+00 7.6363258e+00 +1027 2.062 2.3848076e+00 7.5913977e+00 +1028 2.064 2.3696696e+00 7.5467266e+00 +1029 2.066 2.3546206e+00 7.5023111e+00 +1030 2.068 2.3396601e+00 7.4581496e+00 +1031 2.07 2.3247878e+00 7.4142407e+00 +1032 2.072 2.3100030e+00 7.3705829e+00 +1033 2.074 2.2953053e+00 7.3271750e+00 +1034 2.076 2.2806942e+00 7.2840153e+00 +1035 2.078 2.2661691e+00 7.2411025e+00 +1036 2.08 2.2517296e+00 7.1984352e+00 +1037 2.082 2.2373752e+00 7.1560120e+00 +1038 2.084 2.2231054e+00 7.1138315e+00 +1039 2.086 2.2089197e+00 7.0718923e+00 +1040 2.088 2.1948176e+00 7.0301931e+00 +1041 2.09 2.1807988e+00 6.9887324e+00 +1042 2.092 2.1668626e+00 6.9475089e+00 +1043 2.094 2.1530086e+00 6.9065213e+00 +1044 2.096 2.1392363e+00 6.8657681e+00 +1045 2.098 2.1255453e+00 6.8252482e+00 +1046 2.1 2.1119352e+00 6.7849601e+00 +1047 2.102 2.0984053e+00 6.7449026e+00 +1048 2.104 2.0849554e+00 6.7050742e+00 +1049 2.106 2.0715849e+00 6.6654738e+00 +1050 2.108 2.0582934e+00 6.6260999e+00 +1051 2.11 2.0450803e+00 6.5869514e+00 +1052 2.112 2.0319454e+00 6.5480270e+00 +1053 2.114 2.0188881e+00 6.5093253e+00 +1054 2.116 2.0059080e+00 6.4708451e+00 +1055 2.118 1.9930046e+00 6.4325851e+00 +1056 2.12 1.9801775e+00 6.3945441e+00 +1057 2.122 1.9674262e+00 6.3567209e+00 +1058 2.124 1.9547504e+00 6.3191141e+00 +1059 2.126 1.9421496e+00 6.2817227e+00 +1060 2.128 1.9296234e+00 6.2445452e+00 +1061 2.13 1.9171713e+00 6.2075806e+00 +1062 2.132 1.9047929e+00 6.1708277e+00 +1063 2.134 1.8924879e+00 6.1342851e+00 +1064 2.136 1.8802557e+00 6.0979518e+00 +1065 2.138 1.8680959e+00 6.0618265e+00 +1066 2.14 1.8560082e+00 6.0259080e+00 +1067 2.142 1.8439921e+00 5.9901952e+00 +1068 2.144 1.8320473e+00 5.9546870e+00 +1069 2.146 1.8201733e+00 5.9193820e+00 +1070 2.148 1.8083696e+00 5.8842793e+00 +1071 2.15 1.7966360e+00 5.8493776e+00 +1072 2.152 1.7849720e+00 5.8146758e+00 +1073 2.154 1.7733772e+00 5.7801728e+00 +1074 2.156 1.7618512e+00 5.7458674e+00 +1075 2.158 1.7503936e+00 5.7117585e+00 +1076 2.16 1.7390040e+00 5.6778450e+00 +1077 2.162 1.7276821e+00 5.6441258e+00 +1078 2.164 1.7164274e+00 5.6105999e+00 +1079 2.166 1.7052395e+00 5.5772659e+00 +1080 2.168 1.6941182e+00 5.5441230e+00 +1081 2.17 1.6830629e+00 5.5111701e+00 +1082 2.172 1.6720734e+00 5.4784059e+00 +1083 2.174 1.6611492e+00 5.4458295e+00 +1084 2.176 1.6502899e+00 5.4134399e+00 +1085 2.178 1.6394953e+00 5.3812359e+00 +1086 2.18 1.6287649e+00 5.3492164e+00 +1087 2.182 1.6180983e+00 5.3173805e+00 +1088 2.184 1.6074952e+00 5.2857272e+00 +1089 2.186 1.5969553e+00 5.2542553e+00 +1090 2.188 1.5864781e+00 5.2229638e+00 +1091 2.19 1.5760633e+00 5.1918517e+00 +1092 2.192 1.5657106e+00 5.1609181e+00 +1093 2.194 1.5554195e+00 5.1301618e+00 +1094 2.196 1.5451898e+00 5.0995820e+00 +1095 2.198 1.5350211e+00 5.0691775e+00 +1096 2.2 1.5249130e+00 5.0389474e+00 +1097 2.202 1.5148652e+00 5.0088907e+00 +1098 2.204 1.5048773e+00 4.9790064e+00 +1099 2.206 1.4949490e+00 4.9492936e+00 +1100 2.208 1.4850800e+00 4.9197512e+00 +1101 2.21 1.4752699e+00 4.8903784e+00 +1102 2.212 1.4655184e+00 4.8611741e+00 +1103 2.214 1.4558251e+00 4.8321373e+00 +1104 2.216 1.4461897e+00 4.8032673e+00 +1105 2.218 1.4366119e+00 4.7745629e+00 +1106 2.22 1.4270914e+00 4.7460233e+00 +1107 2.222 1.4176277e+00 4.7176475e+00 +1108 2.224 1.4082207e+00 4.6894346e+00 +1109 2.226 1.3988699e+00 4.6613836e+00 +1110 2.228 1.3895750e+00 4.6334938e+00 +1111 2.23 1.3803358e+00 4.6057641e+00 +1112 2.232 1.3711518e+00 4.5781936e+00 +1113 2.234 1.3620229e+00 4.5507814e+00 +1114 2.236 1.3529486e+00 4.5235267e+00 +1115 2.238 1.3439287e+00 4.4964285e+00 +1116 2.24 1.3349628e+00 4.4694860e+00 +1117 2.242 1.3260506e+00 4.4426983e+00 +1118 2.244 1.3171919e+00 4.4160645e+00 +1119 2.246 1.3083863e+00 4.3895837e+00 +1120 2.248 1.2996335e+00 4.3632551e+00 +1121 2.25 1.2909332e+00 4.3370778e+00 +1122 2.252 1.2822851e+00 4.3110510e+00 +1123 2.254 1.2736889e+00 4.2851737e+00 +1124 2.256 1.2651443e+00 4.2594452e+00 +1125 2.258 1.2566510e+00 4.2338646e+00 +1126 2.26 1.2482087e+00 4.2084310e+00 +1127 2.262 1.2398172e+00 4.1831437e+00 +1128 2.264 1.2314760e+00 4.1580018e+00 +1129 2.266 1.2231851e+00 4.1330045e+00 +1130 2.268 1.2149439e+00 4.1081510e+00 +1131 2.27 1.2067524e+00 4.0834404e+00 +1132 2.272 1.1986101e+00 4.0588720e+00 +1133 2.274 1.1905168e+00 4.0344449e+00 +1134 2.276 1.1824722e+00 4.0101584e+00 +1135 2.278 1.1744760e+00 3.9860116e+00 +1136 2.28 1.1665281e+00 3.9620037e+00 +1137 2.282 1.1586279e+00 3.9381341e+00 +1138 2.284 1.1507754e+00 3.9144018e+00 +1139 2.286 1.1429702e+00 3.8908061e+00 +1140 2.288 1.1352121e+00 3.8673463e+00 +1141 2.29 1.1275008e+00 3.8440215e+00 +1142 2.292 1.1198359e+00 3.8208310e+00 +1143 2.294 1.1122173e+00 3.7977741e+00 +1144 2.296 1.1046447e+00 3.7748499e+00 +1145 2.298 1.0971179e+00 3.7520578e+00 +1146 2.3 1.0896364e+00 3.7293970e+00 +1147 2.302 1.0822002e+00 3.7068668e+00 +1148 2.304 1.0748089e+00 3.6844663e+00 +1149 2.306 1.0674622e+00 3.6621949e+00 +1150 2.308 1.0601600e+00 3.6400519e+00 +1151 2.31 1.0529019e+00 3.6180365e+00 +1152 2.312 1.0456878e+00 3.5961479e+00 +1153 2.314 1.0385173e+00 3.5743856e+00 +1154 2.316 1.0313902e+00 3.5527487e+00 +1155 2.318 1.0243062e+00 3.5312365e+00 +1156 2.32 1.0172651e+00 3.5098484e+00 +1157 2.322 1.0102667e+00 3.4885837e+00 +1158 2.324 1.0033107e+00 3.4674416e+00 +1159 2.326 9.9639687e-01 3.4464214e+00 +1160 2.328 9.8952494e-01 3.4255226e+00 +1161 2.33 9.8269470e-01 3.4047442e+00 +1162 2.332 9.7590588e-01 3.3840858e+00 +1163 2.334 9.6915827e-01 3.3635466e+00 +1164 2.336 9.6245162e-01 3.3431260e+00 +1165 2.338 9.5578569e-01 3.3228232e+00 +1166 2.34 9.4916025e-01 3.3026376e+00 +1167 2.342 9.4257506e-01 3.2825685e+00 +1168 2.344 9.3602990e-01 3.2626154e+00 +1169 2.346 9.2952452e-01 3.2427774e+00 +1170 2.348 9.2305871e-01 3.2230541e+00 +1171 2.35 9.1663223e-01 3.2034446e+00 +1172 2.352 9.1024486e-01 3.1839484e+00 +1173 2.354 9.0389636e-01 3.1645649e+00 +1174 2.356 8.9758652e-01 3.1452934e+00 +1175 2.358 8.9131511e-01 3.1261332e+00 +1176 2.36 8.8508192e-01 3.1070838e+00 +1177 2.362 8.7888671e-01 3.0881445e+00 +1178 2.364 8.7272927e-01 3.0693147e+00 +1179 2.366 8.6660938e-01 3.0505937e+00 +1180 2.368 8.6052682e-01 3.0319810e+00 +1181 2.37 8.5448138e-01 3.0134759e+00 +1182 2.372 8.4847284e-01 2.9950779e+00 +1183 2.374 8.4250100e-01 2.9767862e+00 +1184 2.376 8.3656563e-01 2.9586005e+00 +1185 2.378 8.3066652e-01 2.9405199e+00 +1186 2.38 8.2480348e-01 2.9225439e+00 +1187 2.382 8.1897628e-01 2.9046720e+00 +1188 2.384 8.1318472e-01 2.8869035e+00 +1189 2.386 8.0742860e-01 2.8692379e+00 +1190 2.388 8.0170770e-01 2.8516746e+00 +1191 2.39 7.9602183e-01 2.8342129e+00 +1192 2.392 7.9037078e-01 2.8168524e+00 +1193 2.394 7.8475435e-01 2.7995925e+00 +1194 2.396 7.7917235e-01 2.7824325e+00 +1195 2.398 7.7362456e-01 2.7653719e+00 +1196 2.4 7.6811079e-01 2.7484102e+00 +1197 2.402 7.6263085e-01 2.7315467e+00 +1198 2.404 7.5718454e-01 2.7147811e+00 +1199 2.406 7.5177166e-01 2.6981125e+00 +1200 2.408 7.4639203e-01 2.6815407e+00 +1201 2.41 7.4104544e-01 2.6650649e+00 +1202 2.412 7.3573170e-01 2.6486846e+00 +1203 2.414 7.3045063e-01 2.6323993e+00 +1204 2.416 7.2520204e-01 2.6162085e+00 +1205 2.418 7.1998574e-01 2.6001117e+00 +1206 2.42 7.1480153e-01 2.5841082e+00 +1207 2.422 7.0964924e-01 2.5681976e+00 +1208 2.424 7.0452868e-01 2.5523793e+00 +1209 2.426 6.9943966e-01 2.5366529e+00 +1210 2.428 6.9438201e-01 2.5210177e+00 +1211 2.43 6.8935553e-01 2.5054733e+00 +1212 2.432 6.8436006e-01 2.4900192e+00 +1213 2.434 6.7939540e-01 2.4746548e+00 +1214 2.436 6.7446138e-01 2.4593797e+00 +1215 2.438 6.6955782e-01 2.4441933e+00 +1216 2.44 6.6468454e-01 2.4290952e+00 +1217 2.442 6.5984138e-01 2.4140847e+00 +1218 2.444 6.5502815e-01 2.3991616e+00 +1219 2.446 6.5024468e-01 2.3843251e+00 +1220 2.448 6.4549079e-01 2.3695750e+00 +1221 2.45 6.4076632e-01 2.3549106e+00 +1222 2.452 6.3607109e-01 2.3403314e+00 +1223 2.454 6.3140494e-01 2.3258371e+00 +1224 2.456 6.2676769e-01 2.3114271e+00 +1225 2.458 6.2215917e-01 2.2971009e+00 +1226 2.46 6.1757923e-01 2.2828580e+00 +1227 2.462 6.1302768e-01 2.2686981e+00 +1228 2.464 6.0850438e-01 2.2546206e+00 +1229 2.466 6.0400915e-01 2.2406250e+00 +1230 2.468 5.9954183e-01 2.2267109e+00 +1231 2.47 5.9510225e-01 2.2128779e+00 +1232 2.472 5.9069026e-01 2.1991254e+00 +1233 2.474 5.8630570e-01 2.1854530e+00 +1234 2.476 5.8194840e-01 2.1718603e+00 +1235 2.478 5.7761820e-01 2.1583467e+00 +1236 2.48 5.7331496e-01 2.1449119e+00 +1237 2.482 5.6903850e-01 2.1315555e+00 +1238 2.484 5.6478868e-01 2.1182769e+00 +1239 2.486 5.6056534e-01 2.1050757e+00 +1240 2.488 5.5636833e-01 2.0919515e+00 +1241 2.49 5.5219749e-01 2.0789038e+00 +1242 2.492 5.4805266e-01 2.0659323e+00 +1243 2.494 5.4393371e-01 2.0530364e+00 +1244 2.496 5.3984047e-01 2.0402158e+00 +1245 2.498 5.3577279e-01 2.0274700e+00 +1246 2.5 5.3173054e-01 2.0147986e+00 +1247 2.502 5.2771355e-01 2.0022012e+00 +1248 2.504 5.2372168e-01 1.9896773e+00 +1249 2.506 5.1975479e-01 1.9772266e+00 +1250 2.508 5.1581273e-01 1.9648486e+00 +1251 2.51 5.1189535e-01 1.9525429e+00 +1252 2.512 5.0800251e-01 1.9403091e+00 +1253 2.514 5.0413406e-01 1.9281468e+00 +1254 2.516 5.0028987e-01 1.9160556e+00 +1255 2.518 4.9646980e-01 1.9040351e+00 +1256 2.52 4.9267369e-01 1.8920848e+00 +1257 2.522 4.8890141e-01 1.8802044e+00 +1258 2.524 4.8515282e-01 1.8683936e+00 +1259 2.526 4.8142779e-01 1.8566518e+00 +1260 2.528 4.7772617e-01 1.8449787e+00 +1261 2.53 4.7404783e-01 1.8333739e+00 +1262 2.532 4.7039263e-01 1.8218371e+00 +1263 2.534 4.6676044e-01 1.8103677e+00 +1264 2.536 4.6315111e-01 1.7989656e+00 +1265 2.538 4.5956453e-01 1.7876302e+00 +1266 2.54 4.5600055e-01 1.7763612e+00 +1267 2.542 4.5245904e-01 1.7651582e+00 +1268 2.544 4.4893987e-01 1.7540208e+00 +1269 2.546 4.4544291e-01 1.7429487e+00 +1270 2.548 4.4196803e-01 1.7319415e+00 +1271 2.55 4.3851510e-01 1.7209988e+00 +1272 2.552 4.3508400e-01 1.7101203e+00 +1273 2.554 4.3167458e-01 1.6993056e+00 +1274 2.556 4.2828673e-01 1.6885543e+00 +1275 2.558 4.2492032e-01 1.6778661e+00 +1276 2.56 4.2157522e-01 1.6672406e+00 +1277 2.562 4.1825132e-01 1.6566775e+00 +1278 2.564 4.1494847e-01 1.6461763e+00 +1279 2.566 4.1166657e-01 1.6357368e+00 +1280 2.568 4.0840549e-01 1.6253587e+00 +1281 2.57 4.0516510e-01 1.6150414e+00 +1282 2.572 4.0194528e-01 1.6047848e+00 +1283 2.574 3.9874592e-01 1.5945884e+00 +1284 2.576 3.9556689e-01 1.5844519e+00 +1285 2.578 3.9240807e-01 1.5743750e+00 +1286 2.58 3.8926935e-01 1.5643574e+00 +1287 2.582 3.8615060e-01 1.5543986e+00 +1288 2.584 3.8305171e-01 1.5444985e+00 +1289 2.586 3.7997257e-01 1.5346565e+00 +1290 2.588 3.7691305e-01 1.5248725e+00 +1291 2.59 3.7387304e-01 1.5151460e+00 +1292 2.592 3.7085243e-01 1.5054767e+00 +1293 2.594 3.6785109e-01 1.4958644e+00 +1294 2.596 3.6486893e-01 1.4863087e+00 +1295 2.598 3.6190582e-01 1.4768092e+00 +1296 2.6 3.5896166e-01 1.4673657e+00 +1297 2.602 3.5603632e-01 1.4579778e+00 +1298 2.604 3.5312971e-01 1.4486453e+00 +1299 2.606 3.5024170e-01 1.4393677e+00 +1300 2.608 3.4737220e-01 1.4301448e+00 +1301 2.61 3.4452109e-01 1.4209763e+00 +1302 2.612 3.4168826e-01 1.4118619e+00 +1303 2.614 3.3887360e-01 1.4028012e+00 +1304 2.616 3.3607702e-01 1.3937940e+00 +1305 2.618 3.3329839e-01 1.3848400e+00 +1306 2.62 3.3053762e-01 1.3759387e+00 +1307 2.622 3.2779460e-01 1.3670900e+00 +1308 2.624 3.2506923e-01 1.3582936e+00 +1309 2.626 3.2236139e-01 1.3495491e+00 +1310 2.628 3.1967100e-01 1.3408563e+00 +1311 2.63 3.1699794e-01 1.3322148e+00 +1312 2.632 3.1434210e-01 1.3236244e+00 +1313 2.634 3.1170340e-01 1.3150847e+00 +1314 2.636 3.0908173e-01 1.3065955e+00 +1315 2.638 3.0647699e-01 1.2981566e+00 +1316 2.64 3.0388907e-01 1.2897675e+00 +1317 2.642 3.0131788e-01 1.2814281e+00 +1318 2.644 2.9876333e-01 1.2731380e+00 +1319 2.646 2.9622530e-01 1.2648969e+00 +1320 2.648 2.9370371e-01 1.2567047e+00 +1321 2.65 2.9119845e-01 1.2485609e+00 +1322 2.652 2.8870943e-01 1.2404654e+00 +1323 2.654 2.8623656e-01 1.2324178e+00 +1324 2.656 2.8377973e-01 1.2244179e+00 +1325 2.658 2.8133885e-01 1.2164654e+00 +1326 2.66 2.7891383e-01 1.2085600e+00 +1327 2.662 2.7650458e-01 1.2007015e+00 +1328 2.664 2.7411100e-01 1.1928896e+00 +1329 2.666 2.7173299e-01 1.1851241e+00 +1330 2.668 2.6937047e-01 1.1774046e+00 +1331 2.67 2.6702334e-01 1.1697309e+00 +1332 2.672 2.6469152e-01 1.1621027e+00 +1333 2.674 2.6237490e-01 1.1545198e+00 +1334 2.676 2.6007341e-01 1.1469820e+00 +1335 2.678 2.5778694e-01 1.1394889e+00 +1336 2.68 2.5551542e-01 1.1320403e+00 +1337 2.682 2.5325875e-01 1.1246360e+00 +1338 2.684 2.5101685e-01 1.1172757e+00 +1339 2.686 2.4878962e-01 1.1099591e+00 +1340 2.688 2.4657698e-01 1.1026861e+00 +1341 2.69 2.4437885e-01 1.0954563e+00 +1342 2.692 2.4219513e-01 1.0882694e+00 +1343 2.694 2.4002574e-01 1.0811254e+00 +1344 2.696 2.3787060e-01 1.0740239e+00 +1345 2.698 2.3572962e-01 1.0669646e+00 +1346 2.7 2.3360271e-01 1.0599474e+00 +1347 2.702 2.3148980e-01 1.0529720e+00 +1348 2.704 2.2939080e-01 1.0460381e+00 +1349 2.706 2.2730562e-01 1.0391456e+00 +1350 2.708 2.2523419e-01 1.0322941e+00 +1351 2.71 2.2317642e-01 1.0254834e+00 +1352 2.712 2.2113223e-01 1.0187134e+00 +1353 2.714 2.1910154e-01 1.0119837e+00 +1354 2.716 2.1708427e-01 1.0052942e+00 +1355 2.718 2.1508033e-01 9.9864465e-01 +1356 2.72 2.1308966e-01 9.9203475e-01 +1357 2.722 2.1111217e-01 9.8546431e-01 +1358 2.724 2.0914778e-01 9.7893310e-01 +1359 2.726 2.0719641e-01 9.7244091e-01 +1360 2.728 2.0525799e-01 9.6598750e-01 +1361 2.73 2.0333243e-01 9.5957266e-01 +1362 2.732 2.0141967e-01 9.5319616e-01 +1363 2.734 1.9951962e-01 9.4685778e-01 +1364 2.736 1.9763221e-01 9.4055731e-01 +1365 2.738 1.9575737e-01 9.3429453e-01 +1366 2.74 1.9389501e-01 9.2806923e-01 +1367 2.742 1.9204507e-01 9.2188118e-01 +1368 2.744 1.9020746e-01 9.1573018e-01 +1369 2.746 1.8838212e-01 9.0961601e-01 +1370 2.748 1.8656897e-01 9.0353846e-01 +1371 2.75 1.8476794e-01 8.9749732e-01 +1372 2.752 1.8297896e-01 8.9149239e-01 +1373 2.754 1.8120195e-01 8.8552345e-01 +1374 2.756 1.7943684e-01 8.7959030e-01 +1375 2.758 1.7768357e-01 8.7369273e-01 +1376 2.76 1.7594205e-01 8.6783055e-01 +1377 2.762 1.7421222e-01 8.6200354e-01 +1378 2.764 1.7249401e-01 8.5621150e-01 +1379 2.766 1.7078735e-01 8.5045424e-01 +1380 2.768 1.6909217e-01 8.4473155e-01 +1381 2.77 1.6740840e-01 8.3904324e-01 +1382 2.772 1.6573597e-01 8.3338911e-01 +1383 2.774 1.6407482e-01 8.2776897e-01 +1384 2.776 1.6242488e-01 8.2218261e-01 +1385 2.778 1.6078607e-01 8.1662984e-01 +1386 2.78 1.5915833e-01 8.1111048e-01 +1387 2.782 1.5754161e-01 8.0562432e-01 +1388 2.784 1.5593582e-01 8.0017118e-01 +1389 2.786 1.5434090e-01 7.9475087e-01 +1390 2.788 1.5275679e-01 7.8936321e-01 +1391 2.79 1.5118342e-01 7.8400799e-01 +1392 2.792 1.4962074e-01 7.7868504e-01 +1393 2.794 1.4806866e-01 7.7339417e-01 +1394 2.796 1.4652714e-01 7.6813520e-01 +1395 2.798 1.4499610e-01 7.6290794e-01 +1396 2.8 1.4347549e-01 7.5771221e-01 +1397 2.802 1.4196523e-01 7.5254784e-01 +1398 2.804 1.4046527e-01 7.4741463e-01 +1399 2.806 1.3897555e-01 7.4231241e-01 +1400 2.808 1.3749600e-01 7.3724100e-01 +1401 2.81 1.3602657e-01 7.3220023e-01 +1402 2.812 1.3456718e-01 7.2718992e-01 +1403 2.814 1.3311779e-01 7.2220989e-01 +1404 2.816 1.3167832e-01 7.1725997e-01 +1405 2.818 1.3024873e-01 7.1233998e-01 +1406 2.82 1.2882894e-01 7.0744976e-01 +1407 2.822 1.2741891e-01 7.0258913e-01 +1408 2.824 1.2601857e-01 6.9775792e-01 +1409 2.826 1.2462786e-01 6.9295597e-01 +1410 2.828 1.2324672e-01 6.8818310e-01 +1411 2.83 1.2187511e-01 6.8343914e-01 +1412 2.832 1.2051295e-01 6.7872394e-01 +1413 2.834 1.1916019e-01 6.7403732e-01 +1414 2.836 1.1781678e-01 6.6937911e-01 +1415 2.838 1.1648266e-01 6.6474917e-01 +1416 2.84 1.1515776e-01 6.6014732e-01 +1417 2.842 1.1384205e-01 6.5557340e-01 +1418 2.844 1.1253545e-01 6.5102725e-01 +1419 2.846 1.1123792e-01 6.4650871e-01 +1420 2.848 1.0994940e-01 6.4201762e-01 +1421 2.85 1.0866983e-01 6.3755382e-01 +1422 2.852 1.0739917e-01 6.3311716e-01 +1423 2.854 1.0613735e-01 6.2870748e-01 +1424 2.856 1.0488432e-01 6.2432462e-01 +1425 2.858 1.0364003e-01 6.1996843e-01 +1426 2.86 1.0240443e-01 6.1563875e-01 +1427 2.862 1.0117746e-01 6.1133544e-01 +1428 2.864 9.9959067e-02 6.0705834e-01 +1429 2.866 9.8749206e-02 6.0280729e-01 +1430 2.868 9.7547821e-02 5.9858215e-01 +1431 2.87 9.6354860e-02 5.9438277e-01 +1432 2.872 9.5170273e-02 5.9020900e-01 +1433 2.874 9.3994007e-02 5.8606069e-01 +1434 2.876 9.2826013e-02 5.8193769e-01 +1435 2.878 9.1666240e-02 5.7783986e-01 +1436 2.88 9.0514637e-02 5.7376706e-01 +1437 2.882 8.9371155e-02 5.6971913e-01 +1438 2.884 8.8235744e-02 5.6569594e-01 +1439 2.886 8.7108355e-02 5.6169734e-01 +1440 2.888 8.5988938e-02 5.5772319e-01 +1441 2.89 8.4877446e-02 5.5377335e-01 +1442 2.892 8.3773829e-02 5.4984767e-01 +1443 2.894 8.2678039e-02 5.4594602e-01 +1444 2.896 8.1590029e-02 5.4206826e-01 +1445 2.898 8.0509750e-02 5.3821425e-01 +1446 2.9 7.9437156e-02 5.3438386e-01 +1447 2.902 7.8372199e-02 5.3057694e-01 +1448 2.904 7.7314833e-02 5.2679336e-01 +1449 2.906 7.6265010e-02 5.2303299e-01 +1450 2.908 7.5222686e-02 5.1929568e-01 +1451 2.91 7.4187812e-02 5.1558132e-01 +1452 2.912 7.3160345e-02 5.1188976e-01 +1453 2.914 7.2140238e-02 5.0822087e-01 +1454 2.916 7.1127447e-02 5.0457452e-01 +1455 2.918 7.0121925e-02 5.0095059e-01 +1456 2.92 6.9123629e-02 4.9734893e-01 +1457 2.922 6.8132515e-02 4.9376943e-01 +1458 2.924 6.7148537e-02 4.9021195e-01 +1459 2.926 6.6171652e-02 4.8667637e-01 +1460 2.928 6.5201817e-02 4.8316255e-01 +1461 2.93 6.4238988e-02 4.7967038e-01 +1462 2.932 6.3283121e-02 4.7619973e-01 +1463 2.934 6.2334174e-02 4.7275046e-01 +1464 2.936 6.1392105e-02 4.6932247e-01 +1465 2.938 6.0456870e-02 4.6591562e-01 +1466 2.94 5.9528429e-02 4.6252979e-01 +1467 2.942 5.8606737e-02 4.5916486e-01 +1468 2.944 5.7691755e-02 4.5582071e-01 +1469 2.946 5.6783441e-02 4.5249722e-01 +1470 2.948 5.5881753e-02 4.4919427e-01 +1471 2.95 5.4986650e-02 4.4591173e-01 +1472 2.952 5.4098092e-02 4.4264950e-01 +1473 2.954 5.3216039e-02 4.3940745e-01 +1474 2.956 5.2340449e-02 4.3618546e-01 +1475 2.958 5.1471283e-02 4.3298343e-01 +1476 2.96 5.0608502e-02 4.2980122e-01 +1477 2.962 4.9752065e-02 4.2663873e-01 +1478 2.964 4.8901934e-02 4.2349585e-01 +1479 2.966 4.8058069e-02 4.2037245e-01 +1480 2.968 4.7220431e-02 4.1726843e-01 +1481 2.97 4.6388982e-02 4.1418367e-01 +1482 2.972 4.5563684e-02 4.1111807e-01 +1483 2.974 4.4744498e-02 4.0807150e-01 +1484 2.976 4.3931385e-02 4.0504386e-01 +1485 2.978 4.3124310e-02 4.0203504e-01 +1486 2.98 4.2323233e-02 3.9904492e-01 +1487 2.982 4.1528117e-02 3.9607341e-01 +1488 2.984 4.0738927e-02 3.9312039e-01 +1489 2.986 3.9955624e-02 3.9018575e-01 +1490 2.988 3.9178172e-02 3.8726939e-01 +1491 2.99 3.8406534e-02 3.8437120e-01 +1492 2.992 3.7640675e-02 3.8149107e-01 +1493 2.994 3.6880558e-02 3.7862891e-01 +1494 2.996 3.6126147e-02 3.7578459e-01 +1495 2.998 3.5377408e-02 3.7295803e-01 +1496 3.0 3.4634303e-02 3.7014911e-01 +1497 3.002 3.3896799e-02 3.6735774e-01 +1498 3.004 3.3164861e-02 3.6458381e-01 +1499 3.006 3.2438453e-02 3.6182722e-01 +1500 3.008 3.1717540e-02 3.5908787e-01 +1501 3.01 3.1002090e-02 3.5636566e-01 +1502 3.012 3.0292066e-02 3.5366048e-01 +1503 3.014 2.9587436e-02 3.5097225e-01 +1504 3.016 2.8888166e-02 3.4830085e-01 +1505 3.018 2.8194222e-02 3.4564619e-01 +1506 3.02 2.7505570e-02 3.4300818e-01 +1507 3.022 2.6822178e-02 3.4038672e-01 +1508 3.024 2.6144012e-02 3.3778170e-01 +1509 3.026 2.5471040e-02 3.3519304e-01 +1510 3.028 2.4803229e-02 3.3262063e-01 +1511 3.03 2.4140547e-02 3.3006439e-01 +1512 3.032 2.3482961e-02 3.2752422e-01 +1513 3.034 2.2830440e-02 3.2500002e-01 +1514 3.036 2.2182950e-02 3.2249170e-01 +1515 3.038 2.1540462e-02 3.1999917e-01 +1516 3.04 2.0902943e-02 3.1752234e-01 +1517 3.042 2.0270362e-02 3.1506111e-01 +1518 3.044 1.9642689e-02 3.1261539e-01 +1519 3.046 1.9019891e-02 3.1018509e-01 +1520 3.048 1.8401938e-02 3.0777013e-01 +1521 3.05 1.7788800e-02 3.0537041e-01 +1522 3.052 1.7180446e-02 3.0298584e-01 +1523 3.054 1.6576847e-02 3.0061633e-01 +1524 3.056 1.5977971e-02 2.9826180e-01 +1525 3.058 1.5383789e-02 2.9592215e-01 +1526 3.06 1.4794272e-02 2.9359731e-01 +1527 3.062 1.4209390e-02 2.9128718e-01 +1528 3.064 1.3629114e-02 2.8899168e-01 +1529 3.066 1.3053414e-02 2.8671072e-01 +1530 3.068 1.2482261e-02 2.8444421e-01 +1531 3.07 1.1915628e-02 2.8219208e-01 +1532 3.072 1.1353484e-02 2.7995423e-01 +1533 3.074 1.0795801e-02 2.7773059e-01 +1534 3.076 1.0242552e-02 2.7552106e-01 +1535 3.078 9.6937076e-03 2.7332558e-01 +1536 3.08 9.1492403e-03 2.7114404e-01 +1537 3.082 8.6091221e-03 2.6897638e-01 +1538 3.084 8.0733255e-03 2.6682251e-01 +1539 3.086 7.5418230e-03 2.6468235e-01 +1540 3.088 7.0145870e-03 2.6255582e-01 +1541 3.09 6.4915906e-03 2.6044284e-01 +1542 3.092 5.9728067e-03 2.5834333e-01 +1543 3.094 5.4582084e-03 2.5625721e-01 +1544 3.096 4.9477690e-03 2.5418440e-01 +1545 3.098 4.4414619e-03 2.5212482e-01 +1546 3.1 3.9392609e-03 2.5007840e-01 +1547 3.102 3.4411396e-03 2.4804506e-01 +1548 3.104 2.9470720e-03 2.4602472e-01 +1549 3.106 2.4570321e-03 2.4401730e-01 +1550 3.108 1.9709942e-03 2.4202273e-01 +1551 3.11 1.4889327e-03 2.4004093e-01 +1552 3.112 1.0108221e-03 2.3807183e-01 +1553 3.114 5.3663697e-04 2.3611535e-01 +1554 3.116 6.6352272e-05 2.3417142e-01 +1555 3.118 -4.0005705e-04 2.3223997e-01 +1556 3.12 -8.6261587e-04 2.3032091e-01 +1557 3.122 -1.3213489e-03 2.2841419e-01 +1558 3.124 -1.7762808e-03 2.2651971e-01 +1559 3.126 -2.2274359e-03 2.2463742e-01 +1560 3.128 -2.6748386e-03 2.2276724e-01 +1561 3.13 -3.1185129e-03 2.2090910e-01 +1562 3.132 -3.5584829e-03 2.1906293e-01 +1563 3.134 -3.9947726e-03 2.1722865e-01 +1564 3.136 -4.4274054e-03 2.1540621e-01 +1565 3.138 -4.8564052e-03 2.1359551e-01 +1566 3.14 -5.2817953e-03 2.1179651e-01 +1567 3.142 -5.7035990e-03 2.1000912e-01 +1568 3.144 -6.1218395e-03 2.0823329e-01 +1569 3.146 -6.5365398e-03 2.0646893e-01 +1570 3.148 -6.9477228e-03 2.0471599e-01 +1571 3.15 -7.3554113e-03 2.0297440e-01 +1572 3.152 -7.7596280e-03 2.0124408e-01 +1573 3.154 -8.1603952e-03 1.9952498e-01 +1574 3.156 -8.5577353e-03 1.9781702e-01 +1575 3.158 -8.9516706e-03 1.9612015e-01 +1576 3.16 -9.3422233e-03 1.9443428e-01 +1577 3.162 -9.7294151e-03 1.9275937e-01 +1578 3.164 -1.0113268e-02 1.9109534e-01 +1579 3.166 -1.0493804e-02 1.8944213e-01 +1580 3.168 -1.0871044e-02 1.8779968e-01 +1581 3.17 -1.1245010e-02 1.8616791e-01 +1582 3.172 -1.1615722e-02 1.8454678e-01 +1583 3.174 -1.1983204e-02 1.8293621e-01 +1584 3.176 -1.2347474e-02 1.8133614e-01 +1585 3.178 -1.2708555e-02 1.7974652e-01 +1586 3.18 -1.3066467e-02 1.7816727e-01 +1587 3.182 -1.3421231e-02 1.7659834e-01 +1588 3.184 -1.3772867e-02 1.7503966e-01 +1589 3.186 -1.4121397e-02 1.7349118e-01 +1590 3.188 -1.4466839e-02 1.7195284e-01 +1591 3.19 -1.4809215e-02 1.7042456e-01 +1592 3.192 -1.5148544e-02 1.6890630e-01 +1593 3.194 -1.5484847e-02 1.6739800e-01 +1594 3.196 -1.5818142e-02 1.6589959e-01 +1595 3.198 -1.6148451e-02 1.6441102e-01 +1596 3.2 -1.6475793e-02 1.6293222e-01 +1597 3.202 -1.6800187e-02 1.6146314e-01 +1598 3.204 -1.7121652e-02 1.6000373e-01 +1599 3.206 -1.7440208e-02 1.5855392e-01 +1600 3.208 -1.7755874e-02 1.5711366e-01 +1601 3.21 -1.8068669e-02 1.5568288e-01 +1602 3.212 -1.8378612e-02 1.5426154e-01 +1603 3.214 -1.8685722e-02 1.5284958e-01 +1604 3.216 -1.8990016e-02 1.5144694e-01 +1605 3.218 -1.9291515e-02 1.5005357e-01 +1606 3.22 -1.9590237e-02 1.4866940e-01 +1607 3.222 -1.9886199e-02 1.4729440e-01 +1608 3.224 -2.0179421e-02 1.4592849e-01 +1609 3.226 -2.0469919e-02 1.4457163e-01 +1610 3.228 -2.0757713e-02 1.4322376e-01 +1611 3.23 -2.1042820e-02 1.4188483e-01 +1612 3.232 -2.1325258e-02 1.4055479e-01 +1613 3.234 -2.1605045e-02 1.3923358e-01 +1614 3.236 -2.1882199e-02 1.3792115e-01 +1615 3.238 -2.2156736e-02 1.3661745e-01 +1616 3.24 -2.2428674e-02 1.3532242e-01 +1617 3.242 -2.2698031e-02 1.3403602e-01 +1618 3.244 -2.2964824e-02 1.3275818e-01 +1619 3.246 -2.3229070e-02 1.3148887e-01 +1620 3.248 -2.3490785e-02 1.3022803e-01 +1621 3.25 -2.3749987e-02 1.2897560e-01 +1622 3.252 -2.4006693e-02 1.2773155e-01 +1623 3.254 -2.4260919e-02 1.2649581e-01 +1624 3.256 -2.4512682e-02 1.2526834e-01 +1625 3.258 -2.4761998e-02 1.2404909e-01 +1626 3.26 -2.5008884e-02 1.2283801e-01 +1627 3.262 -2.5253355e-02 1.2163505e-01 +1628 3.264 -2.5495429e-02 1.2044016e-01 +1629 3.266 -2.5735121e-02 1.1925329e-01 +1630 3.268 -2.5972448e-02 1.1807440e-01 +1631 3.27 -2.6207424e-02 1.1690344e-01 +1632 3.272 -2.6440067e-02 1.1574036e-01 +1633 3.274 -2.6670391e-02 1.1458511e-01 +1634 3.276 -2.6898412e-02 1.1343764e-01 +1635 3.278 -2.7124147e-02 1.1229792e-01 +1636 3.28 -2.7347609e-02 1.1116588e-01 +1637 3.282 -2.7568815e-02 1.1004149e-01 +1638 3.284 -2.7787780e-02 1.0892470e-01 +1639 3.286 -2.8004519e-02 1.0781547e-01 +1640 3.288 -2.8219047e-02 1.0671374e-01 +1641 3.29 -2.8431379e-02 1.0561948e-01 +1642 3.292 -2.8641530e-02 1.0453264e-01 +1643 3.294 -2.8849514e-02 1.0345317e-01 +1644 3.296 -2.9055347e-02 1.0238103e-01 +1645 3.298 -2.9259043e-02 1.0131617e-01 +1646 3.3 -2.9460617e-02 1.0025856e-01 +1647 3.302 -2.9660082e-02 9.9208143e-02 +1648 3.304 -2.9857454e-02 9.8164882e-02 +1649 3.306 -3.0052747e-02 9.7128731e-02 +1650 3.308 -3.0245974e-02 9.6099649e-02 +1651 3.31 -3.0437150e-02 9.5077593e-02 +1652 3.312 -3.0626289e-02 9.4062519e-02 +1653 3.314 -3.0813405e-02 9.3054387e-02 +1654 3.316 -3.0998511e-02 9.2053153e-02 +1655 3.318 -3.1181622e-02 9.1058778e-02 +1656 3.32 -3.1362751e-02 9.0071218e-02 +1657 3.322 -3.1541911e-02 8.9090432e-02 +1658 3.324 -3.1719117e-02 8.8116381e-02 +1659 3.326 -3.1894381e-02 8.7149022e-02 +1660 3.328 -3.2067717e-02 8.6188316e-02 +1661 3.33 -3.2239139e-02 8.5234222e-02 +1662 3.332 -3.2408659e-02 8.4286701e-02 +1663 3.334 -3.2576290e-02 8.3345711e-02 +1664 3.336 -3.2742046e-02 8.2411215e-02 +1665 3.338 -3.2905939e-02 8.1483172e-02 +1666 3.34 -3.3067983e-02 8.0561543e-02 +1667 3.342 -3.3228190e-02 7.9646289e-02 +1668 3.344 -3.3386572e-02 7.8737372e-02 +1669 3.346 -3.3543143e-02 7.7834754e-02 +1670 3.348 -3.3697915e-02 7.6938396e-02 +1671 3.35 -3.3850901e-02 7.6048259e-02 +1672 3.352 -3.4002113e-02 7.5164307e-02 +1673 3.354 -3.4151562e-02 7.4286501e-02 +1674 3.356 -3.4299263e-02 7.3414805e-02 +1675 3.358 -3.4445226e-02 7.2549181e-02 +1676 3.36 -3.4589463e-02 7.1689592e-02 +1677 3.362 -3.4731988e-02 7.0836001e-02 +1678 3.364 -3.4872811e-02 6.9988373e-02 +1679 3.366 -3.5011945e-02 6.9146670e-02 +1680 3.368 -3.5149402e-02 6.8310857e-02 +1681 3.37 -3.5285193e-02 6.7480897e-02 +1682 3.372 -3.5419329e-02 6.6656756e-02 +1683 3.374 -3.5551824e-02 6.5838397e-02 +1684 3.376 -3.5682687e-02 6.5025786e-02 +1685 3.378 -3.5811931e-02 6.4218886e-02 +1686 3.38 -3.5939566e-02 6.3417664e-02 +1687 3.382 -3.6065605e-02 6.2622085e-02 +1688 3.384 -3.6190058e-02 6.1832115e-02 +1689 3.386 -3.6312937e-02 6.1047718e-02 +1690 3.388 -3.6434253e-02 6.0268861e-02 +1691 3.39 -3.6554016e-02 5.9495510e-02 +1692 3.392 -3.6672239e-02 5.8727632e-02 +1693 3.394 -3.6788931e-02 5.7965193e-02 +1694 3.396 -3.6904103e-02 5.7208160e-02 +1695 3.398 -3.7017767e-02 5.6456499e-02 +1696 3.4 -3.7129933e-02 5.5710178e-02 +1697 3.402 -3.7240611e-02 5.4969164e-02 +1698 3.404 -3.7349813e-02 5.4233425e-02 +1699 3.406 -3.7457548e-02 5.3502928e-02 +1700 3.408 -3.7563828e-02 5.2777641e-02 +1701 3.41 -3.7668662e-02 5.2057532e-02 +1702 3.412 -3.7772061e-02 5.1342569e-02 +1703 3.414 -3.7874036e-02 5.0632721e-02 +1704 3.416 -3.7974596e-02 4.9927957e-02 +1705 3.418 -3.8073751e-02 4.9228245e-02 +1706 3.42 -3.8171512e-02 4.8533554e-02 +1707 3.422 -3.8267889e-02 4.7843853e-02 +1708 3.424 -3.8362891e-02 4.7159112e-02 +1709 3.426 -3.8456528e-02 4.6479299e-02 +1710 3.428 -3.8548811e-02 4.5804386e-02 +1711 3.43 -3.8639749e-02 4.5134341e-02 +1712 3.432 -3.8729352e-02 4.4469135e-02 +1713 3.434 -3.8817629e-02 4.3808738e-02 +1714 3.436 -3.8904590e-02 4.3153120e-02 +1715 3.438 -3.8990245e-02 4.2502251e-02 +1716 3.44 -3.9074602e-02 4.1856103e-02 +1717 3.442 -3.9157672e-02 4.1214647e-02 +1718 3.444 -3.9239464e-02 4.0577853e-02 +1719 3.446 -3.9319987e-02 3.9945692e-02 +1720 3.448 -3.9399250e-02 3.9318137e-02 +1721 3.45 -3.9477262e-02 3.8695158e-02 +1722 3.452 -3.9554033e-02 3.8076727e-02 +1723 3.454 -3.9629572e-02 3.7462817e-02 +1724 3.456 -3.9703888e-02 3.6853399e-02 +1725 3.458 -3.9776989e-02 3.6248445e-02 +1726 3.46 -3.9848884e-02 3.5647928e-02 +1727 3.462 -3.9919583e-02 3.5051820e-02 +1728 3.464 -3.9989094e-02 3.4460095e-02 +1729 3.466 -4.0057427e-02 3.3872724e-02 +1730 3.468 -4.0124588e-02 3.3289681e-02 +1731 3.47 -4.0190588e-02 3.2710940e-02 +1732 3.472 -4.0255435e-02 3.2136472e-02 +1733 3.474 -4.0319137e-02 3.1566253e-02 +1734 3.476 -4.0381703e-02 3.1000255e-02 +1735 3.478 -4.0443141e-02 3.0438452e-02 +1736 3.48 -4.0503459e-02 2.9880818e-02 +1737 3.482 -4.0562667e-02 2.9327328e-02 +1738 3.484 -4.0620771e-02 2.8777955e-02 +1739 3.486 -4.0677781e-02 2.8232674e-02 +1740 3.488 -4.0733705e-02 2.7691460e-02 +1741 3.49 -4.0788550e-02 2.7154287e-02 +1742 3.492 -4.0842325e-02 2.6621129e-02 +1743 3.494 -4.0895037e-02 2.6091963e-02 +1744 3.496 -4.0946695e-02 2.5566763e-02 +1745 3.498 -4.0997307e-02 2.5045504e-02 +1746 3.5 -4.1046880e-02 2.4528162e-02 +1747 3.502 -4.1095422e-02 2.4014712e-02 +1748 3.504 -4.1142941e-02 2.3505130e-02 +1749 3.506 -4.1189445e-02 2.2999392e-02 +1750 3.508 -4.1234941e-02 2.2497474e-02 +1751 3.51 -4.1279437e-02 2.1999351e-02 +1752 3.512 -4.1322941e-02 2.1505001e-02 +1753 3.514 -4.1365460e-02 2.1014400e-02 +1754 3.516 -4.1407001e-02 2.0527524e-02 +1755 3.518 -4.1447573e-02 2.0044350e-02 +1756 3.52 -4.1487181e-02 1.9564854e-02 +1757 3.522 -4.1525834e-02 1.9089014e-02 +1758 3.524 -4.1563540e-02 1.8616806e-02 +1759 3.526 -4.1600304e-02 1.8148209e-02 +1760 3.528 -4.1636135e-02 1.7683199e-02 +1761 3.53 -4.1671039e-02 1.7221753e-02 +1762 3.532 -4.1705024e-02 1.6763850e-02 +1763 3.534 -4.1738097e-02 1.6309467e-02 +1764 3.536 -4.1770264e-02 1.5858581e-02 +1765 3.538 -4.1801534e-02 1.5411172e-02 +1766 3.54 -4.1831911e-02 1.4967217e-02 +1767 3.542 -4.1861405e-02 1.4526694e-02 +1768 3.544 -4.1890020e-02 1.4089582e-02 +1769 3.546 -4.1917765e-02 1.3655859e-02 +1770 3.548 -4.1944646e-02 1.3225504e-02 +1771 3.55 -4.1970670e-02 1.2798496e-02 +1772 3.552 -4.1995842e-02 1.2374813e-02 +1773 3.554 -4.2020171e-02 1.1954435e-02 +1774 3.556 -4.2043662e-02 1.1537340e-02 +1775 3.558 -4.2066323e-02 1.1123509e-02 +1776 3.56 -4.2088158e-02 1.0712919e-02 +1777 3.562 -4.2109176e-02 1.0305552e-02 +1778 3.564 -4.2129383e-02 9.9013857e-03 +1779 3.566 -4.2148784e-02 9.5004007e-03 +1780 3.568 -4.2167386e-02 9.1025768e-03 +1781 3.57 -4.2185196e-02 8.7078940e-03 +1782 3.572 -4.2202220e-02 8.3163322e-03 +1783 3.574 -4.2218464e-02 7.9278717e-03 +1784 3.576 -4.2233934e-02 7.5424928e-03 +1785 3.578 -4.2248636e-02 7.1601760e-03 +1786 3.58 -4.2262576e-02 6.7809019e-03 +1787 3.582 -4.2275761e-02 6.4046510e-03 +1788 3.584 -4.2288197e-02 6.0314042e-03 +1789 3.586 -4.2299889e-02 5.6611425e-03 +1790 3.588 -4.2310844e-02 5.2938466e-03 +1791 3.59 -4.2321066e-02 4.9294979e-03 +1792 3.592 -4.2330564e-02 4.5680776e-03 +1793 3.594 -4.2339341e-02 4.2095669e-03 +1794 3.596 -4.2347404e-02 3.8539473e-03 +1795 3.598 -4.2354758e-02 3.5012005e-03 +1796 3.6 -4.2361410e-02 3.1513080e-03 +1797 3.602 -4.2367365e-02 2.8042516e-03 +1798 3.604 -4.2372629e-02 2.4600133e-03 +1799 3.606 -4.2377207e-02 2.1185750e-03 +1800 3.608 -4.2381105e-02 1.7799188e-03 +1801 3.61 -4.2384329e-02 1.4440269e-03 +1802 3.612 -4.2386883e-02 1.1108816e-03 +1803 3.614 -4.2388774e-02 7.8046536e-04 +1804 3.616 -4.2390007e-02 4.5276065e-04 +1805 3.618 -4.2390587e-02 1.2775011e-04 +1806 3.62 -4.2390520e-02 -1.9458356e-04 +1807 3.622 -4.2389811e-02 -5.1425751e-04 +1808 3.624 -4.2388465e-02 -8.3128885e-04 +1809 3.626 -4.2386487e-02 -1.1456945e-03 +1810 3.628 -4.2383884e-02 -1.4574914e-03 +1811 3.63 -4.2380659e-02 -1.7666963e-03 +1812 3.632 -4.2376818e-02 -2.0733259e-03 +1813 3.634 -4.2372367e-02 -2.3773968e-03 +1814 3.636 -4.2367311e-02 -2.6789254e-03 +1815 3.638 -4.2361653e-02 -2.9779281e-03 +1816 3.64 -4.2355401e-02 -3.2744212e-03 +1817 3.642 -4.2348557e-02 -3.5684209e-03 +1818 3.644 -4.2341129e-02 -3.8599433e-03 +1819 3.646 -4.2333119e-02 -4.1490044e-03 +1820 3.648 -4.2324534e-02 -4.4356201e-03 +1821 3.65 -4.2315378e-02 -4.7198062e-03 +1822 3.652 -4.2305657e-02 -5.0015785e-03 +1823 3.654 -4.2295374e-02 -5.2809525e-03 +1824 3.656 -4.2284534e-02 -5.5579438e-03 +1825 3.658 -4.2273143e-02 -5.8325678e-03 +1826 3.66 -4.2261206e-02 -6.1048399e-03 +1827 3.662 -4.2248726e-02 -6.3747753e-03 +1828 3.664 -4.2235708e-02 -6.6423893e-03 +1829 3.666 -4.2222158e-02 -6.9076968e-03 +1830 3.668 -4.2208079e-02 -7.1707129e-03 +1831 3.67 -4.2193476e-02 -7.4314525e-03 +1832 3.672 -4.2178354e-02 -7.6899303e-03 +1833 3.674 -4.2162718e-02 -7.9461612e-03 +1834 3.676 -4.2146571e-02 -8.2001597e-03 +1835 3.678 -4.2129919e-02 -8.4519404e-03 +1836 3.68 -4.2112765e-02 -8.7015177e-03 +1837 3.682 -4.2095114e-02 -8.9489061e-03 +1838 3.684 -4.2076971e-02 -9.1941198e-03 +1839 3.686 -4.2058339e-02 -9.4371730e-03 +1840 3.688 -4.2039224e-02 -9.6780799e-03 +1841 3.69 -4.2019628e-02 -9.9168545e-03 +1842 3.692 -4.1999558e-02 -1.0153511e-02 +1843 3.694 -4.1979016e-02 -1.0388063e-02 +1844 3.696 -4.1958007e-02 -1.0620524e-02 +1845 3.698 -4.1936535e-02 -1.0850908e-02 +1846 3.7 -4.1914604e-02 -1.1079229e-02 +1847 3.702 -4.1892219e-02 -1.1305499e-02 +1848 3.704 -4.1869384e-02 -1.1529734e-02 +1849 3.706 -4.1846102e-02 -1.1751946e-02 +1850 3.708 -4.1822377e-02 -1.1972148e-02 +1851 3.71 -4.1798215e-02 -1.2190353e-02 +1852 3.712 -4.1773617e-02 -1.2406576e-02 +1853 3.714 -4.1748590e-02 -1.2620828e-02 +1854 3.716 -4.1723135e-02 -1.2833123e-02 +1855 3.718 -4.1697258e-02 -1.3043473e-02 +1856 3.72 -4.1670963e-02 -1.3251893e-02 +1857 3.722 -4.1644252e-02 -1.3458393e-02 +1858 3.724 -4.1617130e-02 -1.3662987e-02 +1859 3.726 -4.1589601e-02 -1.3865688e-02 +1860 3.728 -4.1561669e-02 -1.4066509e-02 +1861 3.73 -4.1533337e-02 -1.4265460e-02 +1862 3.732 -4.1504608e-02 -1.4462556e-02 +1863 3.734 -4.1475488e-02 -1.4657808e-02 +1864 3.736 -4.1445978e-02 -1.4851229e-02 +1865 3.738 -4.1416084e-02 -1.5042830e-02 +1866 3.74 -4.1385808e-02 -1.5232624e-02 +1867 3.742 -4.1355155e-02 -1.5420622e-02 +1868 3.744 -4.1324127e-02 -1.5606838e-02 +1869 3.746 -4.1292728e-02 -1.5791282e-02 +1870 3.748 -4.1260963e-02 -1.5973967e-02 +1871 3.75 -4.1228834e-02 -1.6154903e-02 +1872 3.752 -4.1196344e-02 -1.6334104e-02 +1873 3.754 -4.1163498e-02 -1.6511580e-02 +1874 3.756 -4.1130299e-02 -1.6687342e-02 +1875 3.758 -4.1096750e-02 -1.6861404e-02 +1876 3.76 -4.1062855e-02 -1.7033775e-02 +1877 3.762 -4.1028616e-02 -1.7204467e-02 +1878 3.764 -4.0994038e-02 -1.7373491e-02 +1879 3.766 -4.0959123e-02 -1.7540859e-02 +1880 3.768 -4.0923876e-02 -1.7706582e-02 +1881 3.77 -4.0888298e-02 -1.7870670e-02 +1882 3.772 -4.0852394e-02 -1.8033135e-02 +1883 3.774 -4.0816167e-02 -1.8193987e-02 +1884 3.776 -4.0779619e-02 -1.8353238e-02 +1885 3.778 -4.0742755e-02 -1.8510899e-02 +1886 3.78 -4.0705577e-02 -1.8666979e-02 +1887 3.782 -4.0668088e-02 -1.8821490e-02 +1888 3.784 -4.0630292e-02 -1.8974442e-02 +1889 3.786 -4.0592191e-02 -1.9125845e-02 +1890 3.788 -4.0553789e-02 -1.9275711e-02 +1891 3.79 -4.0515089e-02 -1.9424050e-02 +1892 3.792 -4.0476094e-02 -1.9570871e-02 +1893 3.794 -4.0436807e-02 -1.9716186e-02 +1894 3.796 -4.0397230e-02 -1.9860004e-02 +1895 3.798 -4.0357368e-02 -2.0002336e-02 +1896 3.8 -4.0317222e-02 -2.0143191e-02 +1897 3.802 -4.0276796e-02 -2.0282581e-02 +1898 3.804 -4.0236093e-02 -2.0420513e-02 +1899 3.806 -4.0195115e-02 -2.0557000e-02 +1900 3.808 -4.0153866e-02 -2.0692050e-02 +1901 3.81 -4.0112348e-02 -2.0825673e-02 +1902 3.812 -4.0070564e-02 -2.0957879e-02 +1903 3.814 -4.0028517e-02 -2.1088678e-02 +1904 3.816 -3.9986210e-02 -2.1218079e-02 +1905 3.818 -3.9943646e-02 -2.1346092e-02 +1906 3.82 -3.9900827e-02 -2.1472726e-02 +1907 3.822 -3.9857756e-02 -2.1597991e-02 +1908 3.824 -3.9814436e-02 -2.1721896e-02 +1909 3.826 -3.9770869e-02 -2.1844451e-02 +1910 3.828 -3.9727059e-02 -2.1965665e-02 +1911 3.83 -3.9683007e-02 -2.2085546e-02 +1912 3.832 -3.9638717e-02 -2.2204105e-02 +1913 3.834 -3.9594192e-02 -2.2321349e-02 +1914 3.836 -3.9549433e-02 -2.2437290e-02 +1915 3.838 -3.9504443e-02 -2.2551934e-02 +1916 3.84 -3.9459226e-02 -2.2665292e-02 +1917 3.842 -3.9413783e-02 -2.2777372e-02 +1918 3.844 -3.9368117e-02 -2.2888183e-02 +1919 3.846 -3.9322231e-02 -2.2997733e-02 +1920 3.848 -3.9276127e-02 -2.3106032e-02 +1921 3.85 -3.9229808e-02 -2.3213088e-02 +1922 3.852 -3.9183276e-02 -2.3318910e-02 +1923 3.854 -3.9136533e-02 -2.3423507e-02 +1924 3.856 -3.9089583e-02 -2.3526886e-02 +1925 3.858 -3.9042426e-02 -2.3629056e-02 +1926 3.86 -3.8995067e-02 -2.3730027e-02 +1927 3.862 -3.8947507e-02 -2.3829805e-02 +1928 3.864 -3.8899749e-02 -2.3928400e-02 +1929 3.866 -3.8851794e-02 -2.4025819e-02 +1930 3.868 -3.8803646e-02 -2.4122071e-02 +1931 3.87 -3.8755307e-02 -2.4217165e-02 +1932 3.872 -3.8706778e-02 -2.4311107e-02 +1933 3.874 -3.8658063e-02 -2.4403907e-02 +1934 3.876 -3.8609163e-02 -2.4495572e-02 +1935 3.878 -3.8560082e-02 -2.4586110e-02 +1936 3.88 -3.8510820e-02 -2.4675529e-02 +1937 3.882 -3.8461380e-02 -2.4763837e-02 +1938 3.884 -3.8411765e-02 -2.4851042e-02 +1939 3.886 -3.8361977e-02 -2.4937151e-02 +1940 3.888 -3.8312017e-02 -2.5022173e-02 +1941 3.89 -3.8261889e-02 -2.5106115e-02 +1942 3.892 -3.8211594e-02 -2.5188984e-02 +1943 3.894 -3.8161134e-02 -2.5270789e-02 +1944 3.896 -3.8110511e-02 -2.5351536e-02 +1945 3.898 -3.8059728e-02 -2.5431233e-02 +1946 3.9 -3.8008787e-02 -2.5509888e-02 +1947 3.902 -3.7957689e-02 -2.5587508e-02 +1948 3.904 -3.7906437e-02 -2.5664101e-02 +1949 3.906 -3.7855034e-02 -2.5739673e-02 +1950 3.908 -3.7803479e-02 -2.5814232e-02 +1951 3.91 -3.7751777e-02 -2.5887786e-02 +1952 3.912 -3.7699929e-02 -2.5960340e-02 +1953 3.914 -3.7647937e-02 -2.6031903e-02 +1954 3.916 -3.7595802e-02 -2.6102482e-02 +1955 3.918 -3.7543527e-02 -2.6172084e-02 +1956 3.92 -3.7491114e-02 -2.6240715e-02 +1957 3.922 -3.7438565e-02 -2.6308382e-02 +1958 3.924 -3.7385881e-02 -2.6375093e-02 +1959 3.926 -3.7333065e-02 -2.6440855e-02 +1960 3.928 -3.7280119e-02 -2.6505673e-02 +1961 3.93 -3.7227043e-02 -2.6569556e-02 +1962 3.932 -3.7173841e-02 -2.6632510e-02 +1963 3.934 -3.7120514e-02 -2.6694540e-02 +1964 3.936 -3.7067063e-02 -2.6755655e-02 +1965 3.938 -3.7013492e-02 -2.6815861e-02 +1966 3.94 -3.6959801e-02 -2.6875164e-02 +1967 3.942 -3.6905992e-02 -2.6933571e-02 +1968 3.944 -3.6852067e-02 -2.6991088e-02 +1969 3.946 -3.6798028e-02 -2.7047722e-02 +1970 3.948 -3.6743877e-02 -2.7103479e-02 +1971 3.95 -3.6689615e-02 -2.7158366e-02 +1972 3.952 -3.6635244e-02 -2.7212389e-02 +1973 3.954 -3.6580766e-02 -2.7265554e-02 +1974 3.956 -3.6526182e-02 -2.7317868e-02 +1975 3.958 -3.6471495e-02 -2.7369336e-02 +1976 3.96 -3.6416705e-02 -2.7419965e-02 +1977 3.962 -3.6361815e-02 -2.7469761e-02 +1978 3.964 -3.6306827e-02 -2.7518731e-02 +1979 3.966 -3.6251741e-02 -2.7566880e-02 +1980 3.968 -3.6196560e-02 -2.7614214e-02 +1981 3.97 -3.6141285e-02 -2.7660739e-02 +1982 3.972 -3.6085917e-02 -2.7706462e-02 +1983 3.974 -3.6030459e-02 -2.7751388e-02 +1984 3.976 -3.5974912e-02 -2.7795523e-02 +1985 3.978 -3.5919278e-02 -2.7838872e-02 +1986 3.98 -3.5863557e-02 -2.7881443e-02 +1987 3.982 -3.5807753e-02 -2.7923240e-02 +1988 3.984 -3.5751865e-02 -2.7964269e-02 +1989 3.986 -3.5695896e-02 -2.8004537e-02 +1990 3.988 -3.5639847e-02 -2.8044047e-02 +1991 3.99 -3.5583720e-02 -2.8082808e-02 +1992 3.992 -3.5527517e-02 -2.8120823e-02 +1993 3.994 -3.5471238e-02 -2.8158098e-02 +1994 3.996 -3.5414885e-02 -2.8194639e-02 +1995 3.998 -3.5358460e-02 -2.8230452e-02 +1996 4.0 -3.5301963e-02 -2.8265542e-02 +1997 4.002 -3.5245398e-02 -2.8299914e-02 +1998 4.004 -3.5188764e-02 -2.8333574e-02 +1999 4.006 -3.5132064e-02 -2.8366527e-02 +2000 4.008 -3.5075299e-02 -2.8398778e-02 +2001 4.01 -3.5018469e-02 -2.8430333e-02 +2002 4.012 -3.4961578e-02 -2.8461197e-02 +2003 4.014 -3.4904625e-02 -2.8491376e-02 +2004 4.016 -3.4847613e-02 -2.8520873e-02 +2005 4.018 -3.4790542e-02 -2.8549696e-02 +2006 4.02 -3.4733414e-02 -2.8577848e-02 +2007 4.022 -3.4676231e-02 -2.8605334e-02 +2008 4.024 -3.4618993e-02 -2.8632161e-02 +2009 4.026 -3.4561703e-02 -2.8658332e-02 +2010 4.028 -3.4504361e-02 -2.8683854e-02 +2011 4.03 -3.4446968e-02 -2.8708730e-02 +2012 4.032 -3.4389526e-02 -2.8732966e-02 +2013 4.034 -3.4332036e-02 -2.8756567e-02 +2014 4.036 -3.4274500e-02 -2.8779537e-02 +2015 4.038 -3.4216919e-02 -2.8801882e-02 +2016 4.04 -3.4159293e-02 -2.8823606e-02 +2017 4.042 -3.4101625e-02 -2.8844714e-02 +2018 4.044 -3.4043915e-02 -2.8865211e-02 +2019 4.046 -3.3986164e-02 -2.8885101e-02 +2020 4.048 -3.3928375e-02 -2.8904390e-02 +2021 4.05 -3.3870547e-02 -2.8923082e-02 +2022 4.052 -3.3812683e-02 -2.8941181e-02 +2023 4.054 -3.3754783e-02 -2.8958692e-02 +2024 4.056 -3.3696848e-02 -2.8975620e-02 +2025 4.058 -3.3638881e-02 -2.8991969e-02 +2026 4.06 -3.3580881e-02 -2.9007744e-02 +2027 4.062 -3.3522850e-02 -2.9022949e-02 +2028 4.064 -3.3464789e-02 -2.9037589e-02 +2029 4.066 -3.3406700e-02 -2.9051669e-02 +2030 4.068 -3.3348583e-02 -2.9065191e-02 +2031 4.07 -3.3290440e-02 -2.9078162e-02 +2032 4.072 -3.3232271e-02 -2.9090585e-02 +2033 4.074 -3.3174078e-02 -2.9102465e-02 +2034 4.076 -3.3115861e-02 -2.9113806e-02 +2035 4.078 -3.3057623e-02 -2.9124612e-02 +2036 4.08 -3.2999363e-02 -2.9134887e-02 +2037 4.082 -3.2941084e-02 -2.9144637e-02 +2038 4.084 -3.2882785e-02 -2.9153864e-02 +2039 4.086 -3.2824468e-02 -2.9162573e-02 +2040 4.088 -3.2766135e-02 -2.9170768e-02 +2041 4.09 -3.2707786e-02 -2.9178453e-02 +2042 4.092 -3.2649422e-02 -2.9185633e-02 +2043 4.094 -3.2591044e-02 -2.9192312e-02 +2044 4.096 -3.2532653e-02 -2.9198492e-02 +2045 4.098 -3.2474250e-02 -2.9204180e-02 +2046 4.1 -3.2415836e-02 -2.9209377e-02 +2047 4.102 -3.2357413e-02 -2.9214090e-02 +2048 4.104 -3.2298980e-02 -2.9218320e-02 +2049 4.106 -3.2240540e-02 -2.9222073e-02 +2050 4.108 -3.2182092e-02 -2.9225352e-02 +2051 4.11 -3.2123639e-02 -2.9228161e-02 +2052 4.112 -3.2065180e-02 -2.9230503e-02 +2053 4.114 -3.2006717e-02 -2.9232383e-02 +2054 4.116 -3.1948251e-02 -2.9233805e-02 +2055 4.118 -3.1889782e-02 -2.9234772e-02 +2056 4.12 -3.1831312e-02 -2.9235288e-02 +2057 4.122 -3.1772841e-02 -2.9235356e-02 +2058 4.124 -3.1714371e-02 -2.9234981e-02 +2059 4.126 -3.1655902e-02 -2.9234165e-02 +2060 4.128 -3.1597434e-02 -2.9232913e-02 +2061 4.13 -3.1538970e-02 -2.9231229e-02 +2062 4.132 -3.1480510e-02 -2.9229115e-02 +2063 4.134 -3.1422054e-02 -2.9226576e-02 +2064 4.136 -3.1363604e-02 -2.9223614e-02 +2065 4.138 -3.1305160e-02 -2.9220234e-02 +2066 4.14 -3.1246723e-02 -2.9216439e-02 +2067 4.142 -3.1188294e-02 -2.9212232e-02 +2068 4.144 -3.1129874e-02 -2.9207617e-02 +2069 4.146 -3.1071464e-02 -2.9202598e-02 +2070 4.148 -3.1013064e-02 -2.9197177e-02 +2071 4.15 -3.0954676e-02 -2.9191359e-02 +2072 4.152 -3.0896299e-02 -2.9185145e-02 +2073 4.154 -3.0837935e-02 -2.9178541e-02 +2074 4.156 -3.0779585e-02 -2.9171549e-02 +2075 4.158 -3.0721249e-02 -2.9164172e-02 +2076 4.16 -3.0662929e-02 -2.9156414e-02 +2077 4.162 -3.0604624e-02 -2.9148278e-02 +2078 4.164 -3.0546336e-02 -2.9139767e-02 +2079 4.166 -3.0488065e-02 -2.9130885e-02 +2080 4.168 -3.0429813e-02 -2.9121634e-02 +2081 4.17 -3.0371579e-02 -2.9112018e-02 +2082 4.172 -3.0313365e-02 -2.9102040e-02 +2083 4.174 -3.0255171e-02 -2.9091704e-02 +2084 4.176 -3.0196998e-02 -2.9081011e-02 +2085 4.178 -3.0138847e-02 -2.9069966e-02 +2086 4.18 -3.0080719e-02 -2.9058571e-02 +2087 4.182 -3.0022613e-02 -2.9046830e-02 +2088 4.184 -2.9964532e-02 -2.9034745e-02 +2089 4.186 -2.9906474e-02 -2.9022319e-02 +2090 4.188 -2.9848442e-02 -2.9009556e-02 +2091 4.19 -2.9790436e-02 -2.8996459e-02 +2092 4.192 -2.9732457e-02 -2.8983030e-02 +2093 4.194 -2.9674505e-02 -2.8969272e-02 +2094 4.196 -2.9616580e-02 -2.8955189e-02 +2095 4.198 -2.9558684e-02 -2.8940783e-02 +2096 4.2 -2.9500817e-02 -2.8926057e-02 +2097 4.202 -2.9442980e-02 -2.8911014e-02 +2098 4.204 -2.9385173e-02 -2.8895656e-02 +2099 4.206 -2.9327398e-02 -2.8879987e-02 +2100 4.208 -2.9269653e-02 -2.8864010e-02 +2101 4.21 -2.9211942e-02 -2.8847727e-02 +2102 4.212 -2.9154263e-02 -2.8831140e-02 +2103 4.214 -2.9096617e-02 -2.8814254e-02 +2104 4.216 -2.9039006e-02 -2.8797069e-02 +2105 4.218 -2.8981429e-02 -2.8779590e-02 +2106 4.22 -2.8923888e-02 -2.8761819e-02 +2107 4.222 -2.8866382e-02 -2.8743758e-02 +2108 4.224 -2.8808913e-02 -2.8725411e-02 +2109 4.226 -2.8751481e-02 -2.8706779e-02 +2110 4.228 -2.8694086e-02 -2.8687865e-02 +2111 4.23 -2.8636729e-02 -2.8668673e-02 +2112 4.232 -2.8579412e-02 -2.8649204e-02 +2113 4.234 -2.8522133e-02 -2.8629462e-02 +2114 4.236 -2.8464894e-02 -2.8609448e-02 +2115 4.238 -2.8407695e-02 -2.8589166e-02 +2116 4.24 -2.8350537e-02 -2.8568617e-02 +2117 4.242 -2.8293421e-02 -2.8547805e-02 +2118 4.244 -2.8236346e-02 -2.8526731e-02 +2119 4.246 -2.8179314e-02 -2.8505399e-02 +2120 4.248 -2.8122325e-02 -2.8483811e-02 +2121 4.25 -2.8065379e-02 -2.8461968e-02 +2122 4.252 -2.8008477e-02 -2.8439875e-02 +2123 4.254 -2.7951620e-02 -2.8417532e-02 +2124 4.256 -2.7894807e-02 -2.8394943e-02 +2125 4.258 -2.7838040e-02 -2.8372109e-02 +2126 4.26 -2.7781319e-02 -2.8349034e-02 +2127 4.262 -2.7724644e-02 -2.8325719e-02 +2128 4.264 -2.7668016e-02 -2.8302167e-02 +2129 4.266 -2.7611436e-02 -2.8278380e-02 +2130 4.268 -2.7554903e-02 -2.8254361e-02 +2131 4.27 -2.7498418e-02 -2.8230111e-02 +2132 4.272 -2.7441983e-02 -2.8205633e-02 +2133 4.274 -2.7385596e-02 -2.8180929e-02 +2134 4.276 -2.7329259e-02 -2.8156002e-02 +2135 4.278 -2.7272972e-02 -2.8130853e-02 +2136 4.28 -2.7216736e-02 -2.8105486e-02 +2137 4.282 -2.7160550e-02 -2.8079901e-02 +2138 4.284 -2.7104416e-02 -2.8054102e-02 +2139 4.286 -2.7048334e-02 -2.8028090e-02 +2140 4.288 -2.6992304e-02 -2.8001867e-02 +2141 4.29 -2.6936327e-02 -2.7975437e-02 +2142 4.292 -2.6880402e-02 -2.7948800e-02 +2143 4.294 -2.6824532e-02 -2.7921959e-02 +2144 4.296 -2.6768715e-02 -2.7894916e-02 +2145 4.298 -2.6712952e-02 -2.7867673e-02 +2146 4.3 -2.6657244e-02 -2.7840232e-02 +2147 4.302 -2.6601591e-02 -2.7812595e-02 +2148 4.304 -2.6545994e-02 -2.7784764e-02 +2149 4.306 -2.6490452e-02 -2.7756742e-02 +2150 4.308 -2.6434967e-02 -2.7728530e-02 +2151 4.31 -2.6379538e-02 -2.7700130e-02 +2152 4.312 -2.6324167e-02 -2.7671545e-02 +2153 4.314 -2.6268852e-02 -2.7642775e-02 +2154 4.316 -2.6213596e-02 -2.7613824e-02 +2155 4.318 -2.6158397e-02 -2.7584693e-02 +2156 4.32 -2.6103257e-02 -2.7555383e-02 +2157 4.322 -2.6048176e-02 -2.7525898e-02 +2158 4.324 -2.5993154e-02 -2.7496238e-02 +2159 4.326 -2.5938191e-02 -2.7466406e-02 +2160 4.328 -2.5883288e-02 -2.7436404e-02 +2161 4.33 -2.5828445e-02 -2.7406233e-02 +2162 4.332 -2.5773663e-02 -2.7375895e-02 +2163 4.334 -2.5718942e-02 -2.7345392e-02 +2164 4.336 -2.5664282e-02 -2.7314727e-02 +2165 4.338 -2.5609683e-02 -2.7283900e-02 +2166 4.34 -2.5555146e-02 -2.7252913e-02 +2167 4.342 -2.5500672e-02 -2.7221769e-02 +2168 4.344 -2.5446259e-02 -2.7190469e-02 +2169 4.346 -2.5391910e-02 -2.7159014e-02 +2170 4.348 -2.5337623e-02 -2.7127408e-02 +2171 4.35 -2.5283400e-02 -2.7095650e-02 +2172 4.352 -2.5229241e-02 -2.7063744e-02 +2173 4.354 -2.5175145e-02 -2.7031690e-02 +2174 4.356 -2.5121114e-02 -2.6999491e-02 +2175 4.358 -2.5067148e-02 -2.6967148e-02 +2176 4.36 -2.5013246e-02 -2.6934662e-02 +2177 4.362 -2.4959409e-02 -2.6902037e-02 +2178 4.364 -2.4905638e-02 -2.6869272e-02 +2179 4.366 -2.4851932e-02 -2.6836370e-02 +2180 4.368 -2.4798292e-02 -2.6803333e-02 +2181 4.37 -2.4744719e-02 -2.6770161e-02 +2182 4.372 -2.4691212e-02 -2.6736857e-02 +2183 4.374 -2.4637771e-02 -2.6703423e-02 +2184 4.376 -2.4584398e-02 -2.6669859e-02 +2185 4.378 -2.4531092e-02 -2.6636167e-02 +2186 4.38 -2.4477854e-02 -2.6602350e-02 +2187 4.382 -2.4424683e-02 -2.6568408e-02 +2188 4.384 -2.4371580e-02 -2.6534343e-02 +2189 4.386 -2.4318545e-02 -2.6500156e-02 +2190 4.388 -2.4265579e-02 -2.6465850e-02 +2191 4.39 -2.4212682e-02 -2.6431425e-02 +2192 4.392 -2.4159854e-02 -2.6396883e-02 +2193 4.394 -2.4107095e-02 -2.6362226e-02 +2194 4.396 -2.4054405e-02 -2.6327455e-02 +2195 4.398 -2.4001785e-02 -2.6292572e-02 +2196 4.4 -2.3949235e-02 -2.6257577e-02 +2197 4.402 -2.3896755e-02 -2.6222473e-02 +2198 4.404 -2.3844345e-02 -2.6187261e-02 +2199 4.406 -2.3792006e-02 -2.6151941e-02 +2200 4.408 -2.3739737e-02 -2.6116517e-02 +2201 4.41 -2.3687540e-02 -2.6080989e-02 +2202 4.412 -2.3635413e-02 -2.6045358e-02 +2203 4.414 -2.3583358e-02 -2.6009626e-02 +2204 4.416 -2.3531375e-02 -2.5973795e-02 +2205 4.418 -2.3479463e-02 -2.5937865e-02 +2206 4.42 -2.3427624e-02 -2.5901838e-02 +2207 4.422 -2.3375856e-02 -2.5865715e-02 +2208 4.424 -2.3324161e-02 -2.5829498e-02 +2209 4.426 -2.3272538e-02 -2.5793188e-02 +2210 4.428 -2.3220988e-02 -2.5756786e-02 +2211 4.43 -2.3169511e-02 -2.5720294e-02 +2212 4.432 -2.3118107e-02 -2.5683713e-02 +2213 4.434 -2.3066776e-02 -2.5647044e-02 +2214 4.436 -2.3015519e-02 -2.5610288e-02 +2215 4.438 -2.2964335e-02 -2.5573447e-02 +2216 4.44 -2.2913225e-02 -2.5536523e-02 +2217 4.442 -2.2862189e-02 -2.5499515e-02 +2218 4.444 -2.2811227e-02 -2.5462426e-02 +2219 4.446 -2.2760339e-02 -2.5425257e-02 +2220 4.448 -2.2709526e-02 -2.5388008e-02 +2221 4.45 -2.2658787e-02 -2.5350682e-02 +2222 4.452 -2.2608123e-02 -2.5313279e-02 +2223 4.454 -2.2557534e-02 -2.5275801e-02 +2224 4.456 -2.2507020e-02 -2.5238248e-02 +2225 4.458 -2.2456581e-02 -2.5200623e-02 +2226 4.46 -2.2406218e-02 -2.5162926e-02 +2227 4.462 -2.2355930e-02 -2.5125157e-02 +2228 4.464 -2.2305717e-02 -2.5087320e-02 +2229 4.466 -2.2255581e-02 -2.5049414e-02 +2230 4.468 -2.2205520e-02 -2.5011440e-02 +2231 4.47 -2.2155535e-02 -2.4973401e-02 +2232 4.472 -2.2105626e-02 -2.4935296e-02 +2233 4.474 -2.2055794e-02 -2.4897128e-02 +2234 4.476 -2.2006038e-02 -2.4858897e-02 +2235 4.478 -2.1956358e-02 -2.4820604e-02 +2236 4.48 -2.1906755e-02 -2.4782250e-02 +2237 4.482 -2.1857229e-02 -2.4743837e-02 +2238 4.484 -2.1807780e-02 -2.4705366e-02 +2239 4.486 -2.1758408e-02 -2.4666837e-02 +2240 4.488 -2.1709113e-02 -2.4628252e-02 +2241 4.49 -2.1659895e-02 -2.4589611e-02 +2242 4.492 -2.1610754e-02 -2.4550916e-02 +2243 4.494 -2.1561691e-02 -2.4512168e-02 +2244 4.496 -2.1512706e-02 -2.4473368e-02 +2245 4.498 -2.1463798e-02 -2.4434517e-02 +2246 4.5 -2.1414968e-02 -2.4395615e-02 +2247 4.502 -2.1366215e-02 -2.4356664e-02 +2248 4.504 -2.1317541e-02 -2.4317665e-02 +2249 4.506 -2.1268945e-02 -2.4278619e-02 +2250 4.508 -2.1220426e-02 -2.4239527e-02 +2251 4.51 -2.1171987e-02 -2.4200390e-02 +2252 4.512 -2.1123625e-02 -2.4161208e-02 +2253 4.514 -2.1075342e-02 -2.4121983e-02 +2254 4.516 -2.1027137e-02 -2.4082716e-02 +2255 4.518 -2.0979011e-02 -2.4043407e-02 +2256 4.52 -2.0930963e-02 -2.4004058e-02 +2257 4.522 -2.0882995e-02 -2.3964669e-02 +2258 4.524 -2.0835105e-02 -2.3925242e-02 +2259 4.526 -2.0787294e-02 -2.3885777e-02 +2260 4.528 -2.0739562e-02 -2.3846275e-02 +2261 4.53 -2.0691909e-02 -2.3806737e-02 +2262 4.532 -2.0644335e-02 -2.3767164e-02 +2263 4.534 -2.0596840e-02 -2.3727558e-02 +2264 4.536 -2.0549425e-02 -2.3687918e-02 +2265 4.538 -2.0502088e-02 -2.3648245e-02 +2266 4.54 -2.0454832e-02 -2.3608541e-02 +2267 4.542 -2.0407654e-02 -2.3568807e-02 +2268 4.544 -2.0360556e-02 -2.3529043e-02 +2269 4.546 -2.0313538e-02 -2.3489250e-02 +2270 4.548 -2.0266599e-02 -2.3449429e-02 +2271 4.55 -2.0219740e-02 -2.3409580e-02 +2272 4.552 -2.0172961e-02 -2.3369705e-02 +2273 4.554 -2.0126262e-02 -2.3329805e-02 +2274 4.556 -2.0079642e-02 -2.3289880e-02 +2275 4.558 -2.0033102e-02 -2.3249930e-02 +2276 4.56 -1.9986642e-02 -2.3209958e-02 +2277 4.562 -1.9940262e-02 -2.3169964e-02 +2278 4.564 -1.9893962e-02 -2.3129947e-02 +2279 4.566 -1.9847743e-02 -2.3089910e-02 +2280 4.568 -1.9801603e-02 -2.3049853e-02 +2281 4.57 -1.9755543e-02 -2.3009777e-02 +2282 4.572 -1.9709564e-02 -2.2969682e-02 +2283 4.574 -1.9663664e-02 -2.2929570e-02 +2284 4.576 -1.9617845e-02 -2.2889440e-02 +2285 4.578 -1.9572107e-02 -2.2849295e-02 +2286 4.58 -1.9526448e-02 -2.2809134e-02 +2287 4.582 -1.9480870e-02 -2.2768958e-02 +2288 4.584 -1.9435372e-02 -2.2728768e-02 +2289 4.586 -1.9389955e-02 -2.2688565e-02 +2290 4.588 -1.9344618e-02 -2.2648349e-02 +2291 4.59 -1.9299362e-02 -2.2608122e-02 +2292 4.592 -1.9254186e-02 -2.2567883e-02 +2293 4.594 -1.9209090e-02 -2.2527634e-02 +2294 4.596 -1.9164075e-02 -2.2487376e-02 +2295 4.598 -1.9119141e-02 -2.2447108e-02 +2296 4.6 -1.9074287e-02 -2.2406832e-02 +2297 4.602 -1.9029513e-02 -2.2366548e-02 +2298 4.604 -1.8984821e-02 -2.2326257e-02 +2299 4.606 -1.8940208e-02 -2.2285960e-02 +2300 4.608 -1.8895677e-02 -2.2245657e-02 +2301 4.61 -1.8851226e-02 -2.2205349e-02 +2302 4.612 -1.8806855e-02 -2.2165037e-02 +2303 4.614 -1.8762566e-02 -2.2124721e-02 +2304 4.616 -1.8718356e-02 -2.2084402e-02 +2305 4.618 -1.8674228e-02 -2.2044080e-02 +2306 4.62 -1.8630180e-02 -2.2003757e-02 +2307 4.622 -1.8586213e-02 -2.1963432e-02 +2308 4.624 -1.8542326e-02 -2.1923107e-02 +2309 4.626 -1.8498520e-02 -2.1882782e-02 +2310 4.628 -1.8454795e-02 -2.1842458e-02 +2311 4.63 -1.8411151e-02 -2.1802135e-02 +2312 4.632 -1.8367587e-02 -2.1761813e-02 +2313 4.634 -1.8324103e-02 -2.1721495e-02 +2314 4.636 -1.8280701e-02 -2.1681179e-02 +2315 4.638 -1.8237379e-02 -2.1640867e-02 +2316 4.64 -1.8194137e-02 -2.1600559e-02 +2317 4.642 -1.8150976e-02 -2.1560256e-02 +2318 4.644 -1.8107896e-02 -2.1519958e-02 +2319 4.646 -1.8064897e-02 -2.1479667e-02 +2320 4.648 -1.8021978e-02 -2.1439381e-02 +2321 4.65 -1.7979139e-02 -2.1399103e-02 +2322 4.652 -1.7936381e-02 -2.1358833e-02 +2323 4.654 -1.7893704e-02 -2.1318570e-02 +2324 4.656 -1.7851107e-02 -2.1278317e-02 +2325 4.658 -1.7808590e-02 -2.1238072e-02 +2326 4.66 -1.7766155e-02 -2.1197838e-02 +2327 4.662 -1.7723799e-02 -2.1157613e-02 +2328 4.664 -1.7681524e-02 -2.1117400e-02 +2329 4.666 -1.7639329e-02 -2.1077197e-02 +2330 4.668 -1.7597215e-02 -2.1037007e-02 +2331 4.67 -1.7555181e-02 -2.0996829e-02 +2332 4.672 -1.7513228e-02 -2.0956664e-02 +2333 4.674 -1.7471355e-02 -2.0916512e-02 +2334 4.676 -1.7429562e-02 -2.0876374e-02 +2335 4.678 -1.7387849e-02 -2.0836251e-02 +2336 4.68 -1.7346217e-02 -2.0796142e-02 +2337 4.682 -1.7304665e-02 -2.0756049e-02 +2338 4.684 -1.7263193e-02 -2.0715972e-02 +2339 4.686 -1.7221801e-02 -2.0675911e-02 +2340 4.688 -1.7180489e-02 -2.0635866e-02 +2341 4.69 -1.7139257e-02 -2.0595839e-02 +2342 4.692 -1.7098106e-02 -2.0555830e-02 +2343 4.694 -1.7057034e-02 -2.0515839e-02 +2344 4.696 -1.7016042e-02 -2.0475866e-02 +2345 4.698 -1.6975131e-02 -2.0435913e-02 +2346 4.7 -1.6934299e-02 -2.0395979e-02 +2347 4.702 -1.6893547e-02 -2.0356065e-02 +2348 4.704 -1.6852874e-02 -2.0316171e-02 +2349 4.706 -1.6812282e-02 -2.0276299e-02 +2350 4.708 -1.6771769e-02 -2.0236447e-02 +2351 4.71 -1.6731336e-02 -2.0196617e-02 +2352 4.712 -1.6690983e-02 -2.0156810e-02 +2353 4.714 -1.6650709e-02 -2.0117025e-02 +2354 4.716 -1.6610515e-02 -2.0077263e-02 +2355 4.718 -1.6570400e-02 -2.0037524e-02 +2356 4.72 -1.6530364e-02 -1.9997809e-02 +2357 4.722 -1.6490409e-02 -1.9958119e-02 +2358 4.724 -1.6450532e-02 -1.9918453e-02 +2359 4.726 -1.6410735e-02 -1.9878812e-02 +2360 4.728 -1.6371017e-02 -1.9839196e-02 +2361 4.73 -1.6331378e-02 -1.9799606e-02 +2362 4.732 -1.6291818e-02 -1.9760043e-02 +2363 4.734 -1.6252338e-02 -1.9720506e-02 +2364 4.736 -1.6212936e-02 -1.9680996e-02 +2365 4.738 -1.6173614e-02 -1.9641513e-02 +2366 4.74 -1.6134370e-02 -1.9602058e-02 +2367 4.742 -1.6095205e-02 -1.9562631e-02 +2368 4.744 -1.6056120e-02 -1.9523232e-02 +2369 4.746 -1.6017112e-02 -1.9483862e-02 +2370 4.748 -1.5978184e-02 -1.9444522e-02 +2371 4.75 -1.5939334e-02 -1.9405211e-02 +2372 4.752 -1.5900563e-02 -1.9365929e-02 +2373 4.754 -1.5861871e-02 -1.9326678e-02 +2374 4.756 -1.5823257e-02 -1.9287458e-02 +2375 4.758 -1.5784721e-02 -1.9248268e-02 +2376 4.76 -1.5746263e-02 -1.9209110e-02 +2377 4.762 -1.5707884e-02 -1.9169983e-02 +2378 4.764 -1.5669583e-02 -1.9130888e-02 +2379 4.766 -1.5631361e-02 -1.9091825e-02 +2380 4.768 -1.5593216e-02 -1.9052795e-02 +2381 4.77 -1.5555150e-02 -1.9013798e-02 +2382 4.772 -1.5517161e-02 -1.8974834e-02 +2383 4.774 -1.5479250e-02 -1.8935903e-02 +2384 4.776 -1.5441417e-02 -1.8897007e-02 +2385 4.778 -1.5403662e-02 -1.8858144e-02 +2386 4.78 -1.5365985e-02 -1.8819316e-02 +2387 4.782 -1.5328385e-02 -1.8780523e-02 +2388 4.784 -1.5290863e-02 -1.8741765e-02 +2389 4.786 -1.5253418e-02 -1.8703042e-02 +2390 4.788 -1.5216050e-02 -1.8664355e-02 +2391 4.79 -1.5178760e-02 -1.8625704e-02 +2392 4.792 -1.5141548e-02 -1.8587089e-02 +2393 4.794 -1.5104412e-02 -1.8548510e-02 +2394 4.796 -1.5067353e-02 -1.8509968e-02 +2395 4.798 -1.5030372e-02 -1.8471464e-02 +2396 4.8 -1.4993468e-02 -1.8432997e-02 +2397 4.802 -1.4956640e-02 -1.8394567e-02 +2398 4.804 -1.4919889e-02 -1.8356175e-02 +2399 4.806 -1.4883215e-02 -1.8317822e-02 +2400 4.808 -1.4846618e-02 -1.8279507e-02 +2401 4.81 -1.4810097e-02 -1.8241230e-02 +2402 4.812 -1.4773653e-02 -1.8202993e-02 +2403 4.814 -1.4737285e-02 -1.8164795e-02 +2404 4.816 -1.4700994e-02 -1.8126636e-02 +2405 4.818 -1.4664779e-02 -1.8088517e-02 +2406 4.82 -1.4628640e-02 -1.8050439e-02 +2407 4.822 -1.4592577e-02 -1.8012400e-02 +2408 4.824 -1.4556590e-02 -1.7974402e-02 +2409 4.826 -1.4520679e-02 -1.7936444e-02 +2410 4.828 -1.4484844e-02 -1.7898528e-02 +2411 4.83 -1.4449085e-02 -1.7860653e-02 +2412 4.832 -1.4413402e-02 -1.7822819e-02 +2413 4.834 -1.4377794e-02 -1.7785027e-02 +2414 4.836 -1.4342262e-02 -1.7747276e-02 +2415 4.838 -1.4306805e-02 -1.7709568e-02 +2416 4.84 -1.4271423e-02 -1.7671903e-02 +2417 4.842 -1.4236117e-02 -1.7634279e-02 +2418 4.844 -1.4200886e-02 -1.7596699e-02 +2419 4.846 -1.4165730e-02 -1.7559162e-02 +2420 4.848 -1.4130649e-02 -1.7521667e-02 +2421 4.85 -1.4095644e-02 -1.7484217e-02 +2422 4.852 -1.4060713e-02 -1.7446810e-02 +2423 4.854 -1.4025856e-02 -1.7409446e-02 +2424 4.856 -1.3991075e-02 -1.7372127e-02 +2425 4.858 -1.3956368e-02 -1.7334852e-02 +2426 4.86 -1.3921735e-02 -1.7297622e-02 +2427 4.862 -1.3887177e-02 -1.7260436e-02 +2428 4.864 -1.3852694e-02 -1.7223295e-02 +2429 4.866 -1.3818284e-02 -1.7186199e-02 +2430 4.868 -1.3783949e-02 -1.7149148e-02 +2431 4.87 -1.3749687e-02 -1.7112143e-02 +2432 4.872 -1.3715500e-02 -1.7075184e-02 +2433 4.874 -1.3681387e-02 -1.7038270e-02 +2434 4.876 -1.3647347e-02 -1.7001402e-02 +2435 4.878 -1.3613381e-02 -1.6964580e-02 +2436 4.88 -1.3579489e-02 -1.6927805e-02 +2437 4.882 -1.3545670e-02 -1.6891076e-02 +2438 4.884 -1.3511924e-02 -1.6854394e-02 +2439 4.886 -1.3478252e-02 -1.6817759e-02 +2440 4.888 -1.3444653e-02 -1.6781170e-02 +2441 4.89 -1.3411127e-02 -1.6744629e-02 +2442 4.892 -1.3377675e-02 -1.6708136e-02 +2443 4.894 -1.3344295e-02 -1.6671689e-02 +2444 4.896 -1.3310988e-02 -1.6635291e-02 +2445 4.898 -1.3277754e-02 -1.6598940e-02 +2446 4.9 -1.3244592e-02 -1.6562638e-02 +2447 4.902 -1.3211503e-02 -1.6526383e-02 +2448 4.904 -1.3178487e-02 -1.6490177e-02 +2449 4.906 -1.3145542e-02 -1.6454019e-02 +2450 4.908 -1.3112670e-02 -1.6417910e-02 +2451 4.91 -1.3079871e-02 -1.6381850e-02 +2452 4.912 -1.3047143e-02 -1.6345838e-02 +2453 4.914 -1.3014487e-02 -1.6309876e-02 +2454 4.916 -1.2981903e-02 -1.6273962e-02 +2455 4.918 -1.2949391e-02 -1.6238098e-02 +2456 4.92 -1.2916951e-02 -1.6202284e-02 +2457 4.922 -1.2884582e-02 -1.6166519e-02 +2458 4.924 -1.2852285e-02 -1.6130804e-02 +2459 4.926 -1.2820059e-02 -1.6095138e-02 +2460 4.928 -1.2787904e-02 -1.6059523e-02 +2461 4.93 -1.2755821e-02 -1.6023958e-02 +2462 4.932 -1.2723808e-02 -1.5988443e-02 +2463 4.934 -1.2691867e-02 -1.5952978e-02 +2464 4.936 -1.2659997e-02 -1.5917564e-02 +2465 4.938 -1.2628197e-02 -1.5882201e-02 +2466 4.94 -1.2596468e-02 -1.5846888e-02 +2467 4.942 -1.2564809e-02 -1.5811626e-02 +2468 4.944 -1.2533221e-02 -1.5776415e-02 +2469 4.946 -1.2501703e-02 -1.5741255e-02 +2470 4.948 -1.2470256e-02 -1.5706146e-02 +2471 4.95 -1.2438879e-02 -1.5671089e-02 +2472 4.952 -1.2407572e-02 -1.5636083e-02 +2473 4.954 -1.2376334e-02 -1.5601128e-02 +2474 4.956 -1.2345167e-02 -1.5566225e-02 +2475 4.958 -1.2314070e-02 -1.5531374e-02 +2476 4.96 -1.2283042e-02 -1.5496575e-02 +2477 4.962 -1.2252083e-02 -1.5461827e-02 +2478 4.964 -1.2221194e-02 -1.5427132e-02 +2479 4.966 -1.2190375e-02 -1.5392488e-02 +2480 4.968 -1.2159624e-02 -1.5357897e-02 +2481 4.97 -1.2128943e-02 -1.5323358e-02 +2482 4.972 -1.2098331e-02 -1.5288872e-02 +2483 4.974 -1.2067788e-02 -1.5254438e-02 +2484 4.976 -1.2037313e-02 -1.5220057e-02 +2485 4.978 -1.2006907e-02 -1.5185728e-02 +2486 4.98 -1.1976570e-02 -1.5151452e-02 +2487 4.982 -1.1946301e-02 -1.5117229e-02 +2488 4.984 -1.1916101e-02 -1.5083059e-02 +2489 4.986 -1.1885969e-02 -1.5048942e-02 +2490 4.988 -1.1855905e-02 -1.5014878e-02 +2491 4.99 -1.1825910e-02 -1.4980867e-02 +2492 4.992 -1.1795982e-02 -1.4946909e-02 +2493 4.994 -1.1766122e-02 -1.4913005e-02 +2494 4.996 -1.1736330e-02 -1.4879154e-02 +2495 4.998 -1.1706605e-02 -1.4845356e-02 +2496 5.0 -1.1676948e-02 -1.4811612e-02 +2497 5.002 -1.1647359e-02 -1.4777922e-02 +2498 5.004 -1.1617837e-02 -1.4744285e-02 +2499 5.006 -1.1588382e-02 -1.4710702e-02 +2500 5.008 -1.1558994e-02 -1.4677173e-02 +2501 5.01 -1.1529673e-02 -1.4643698e-02 +2502 5.012 -1.1500419e-02 -1.4610276e-02 +2503 5.014 -1.1471232e-02 -1.4576909e-02 +2504 5.016 -1.1442111e-02 -1.4543596e-02 +2505 5.018 -1.1413057e-02 -1.4510337e-02 +2506 5.02 -1.1384070e-02 -1.4477132e-02 +2507 5.022 -1.1355149e-02 -1.4443981e-02 +2508 5.024 -1.1326294e-02 -1.4410885e-02 +2509 5.026 -1.1297505e-02 -1.4377842e-02 +2510 5.028 -1.1268782e-02 -1.4344855e-02 +2511 5.03 -1.1240126e-02 -1.4311921e-02 +2512 5.032 -1.1211535e-02 -1.4279043e-02 +2513 5.034 -1.1183010e-02 -1.4246218e-02 +2514 5.036 -1.1154550e-02 -1.4213449e-02 +2515 5.038 -1.1126156e-02 -1.4180734e-02 +2516 5.04 -1.1097827e-02 -1.4148074e-02 +2517 5.042 -1.1069563e-02 -1.4115468e-02 +2518 5.044 -1.1041365e-02 -1.4082917e-02 +2519 5.046 -1.1013232e-02 -1.4050421e-02 +2520 5.048 -1.0985163e-02 -1.4017980e-02 +2521 5.05 -1.0957160e-02 -1.3985594e-02 +2522 5.052 -1.0929221e-02 -1.3953263e-02 +2523 5.054 -1.0901347e-02 -1.3920986e-02 +2524 5.056 -1.0873537e-02 -1.3888765e-02 +2525 5.058 -1.0845792e-02 -1.3856599e-02 +2526 5.06 -1.0818110e-02 -1.3824487e-02 +2527 5.062 -1.0790494e-02 -1.3792431e-02 +2528 5.064 -1.0762941e-02 -1.3760430e-02 +2529 5.066 -1.0735452e-02 -1.3728485e-02 +2530 5.068 -1.0708027e-02 -1.3696594e-02 +2531 5.07 -1.0680665e-02 -1.3664759e-02 +2532 5.072 -1.0653368e-02 -1.3632979e-02 +2533 5.074 -1.0626133e-02 -1.3601254e-02 +2534 5.076 -1.0598963e-02 -1.3569584e-02 +2535 5.078 -1.0571855e-02 -1.3537970e-02 +2536 5.08 -1.0544811e-02 -1.3506411e-02 +2537 5.082 -1.0517829e-02 -1.3474908e-02 +2538 5.084 -1.0490911e-02 -1.3443460e-02 +2539 5.086 -1.0464055e-02 -1.3412067e-02 +2540 5.088 -1.0437263e-02 -1.3380730e-02 +2541 5.09 -1.0410533e-02 -1.3349449e-02 +2542 5.092 -1.0383865e-02 -1.3318222e-02 +2543 5.094 -1.0357260e-02 -1.3287052e-02 +2544 5.096 -1.0330717e-02 -1.3255936e-02 +2545 5.098 -1.0304236e-02 -1.3224877e-02 +2546 5.1 -1.0277817e-02 -1.3193873e-02 +2547 5.102 -1.0251460e-02 -1.3162924e-02 +2548 5.104 -1.0225165e-02 -1.3132031e-02 +2549 5.106 -1.0198932e-02 -1.3101193e-02 +2550 5.108 -1.0172761e-02 -1.3070411e-02 +2551 5.11 -1.0146650e-02 -1.3039685e-02 +2552 5.112 -1.0120602e-02 -1.3009014e-02 +2553 5.114 -1.0094614e-02 -1.2978399e-02 +2554 5.116 -1.0068688e-02 -1.2947840e-02 +2555 5.118 -1.0042823e-02 -1.2917336e-02 +2556 5.12 -1.0017019e-02 -1.2886887e-02 +2557 5.122 -9.9912753e-03 -1.2856495e-02 +2558 5.124 -9.9655927e-03 -1.2826158e-02 +2559 5.126 -9.9399707e-03 -1.2795876e-02 +2560 5.128 -9.9144092e-03 -1.2765650e-02 +2561 5.13 -9.8889080e-03 -1.2735480e-02 +2562 5.132 -9.8634672e-03 -1.2705365e-02 +2563 5.134 -9.8380865e-03 -1.2675306e-02 +2564 5.136 -9.8127659e-03 -1.2645303e-02 +2565 5.138 -9.7875053e-03 -1.2615355e-02 +2566 5.14 -9.7623045e-03 -1.2585463e-02 +2567 5.142 -9.7371634e-03 -1.2555627e-02 +2568 5.144 -9.7120819e-03 -1.2525846e-02 +2569 5.146 -9.6870600e-03 -1.2496120e-02 +2570 5.148 -9.6620974e-03 -1.2466451e-02 +2571 5.15 -9.6371941e-03 -1.2436836e-02 +2572 5.152 -9.6123500e-03 -1.2407278e-02 +2573 5.154 -9.5875650e-03 -1.2377775e-02 +2574 5.156 -9.5628389e-03 -1.2348327e-02 +2575 5.158 -9.5381717e-03 -1.2318935e-02 +2576 5.16 -9.5135631e-03 -1.2289599e-02 +2577 5.162 -9.4890132e-03 -1.2260318e-02 +2578 5.164 -9.4645218e-03 -1.2231092e-02 +2579 5.166 -9.4400888e-03 -1.2201922e-02 +2580 5.168 -9.4157141e-03 -1.2172808e-02 +2581 5.17 -9.3913975e-03 -1.2143748e-02 +2582 5.172 -9.3671391e-03 -1.2114745e-02 +2583 5.174 -9.3429385e-03 -1.2085796e-02 +2584 5.176 -9.3187958e-03 -1.2056904e-02 +2585 5.178 -9.2947109e-03 -1.2028066e-02 +2586 5.18 -9.2706835e-03 -1.1999284e-02 +2587 5.182 -9.2467137e-03 -1.1970557e-02 +2588 5.184 -9.2228013e-03 -1.1941886e-02 +2589 5.186 -9.1989461e-03 -1.1913270e-02 +2590 5.188 -9.1751482e-03 -1.1884709e-02 +2591 5.19 -9.1514073e-03 -1.1856203e-02 +2592 5.192 -9.1277233e-03 -1.1827753e-02 +2593 5.194 -9.1040962e-03 -1.1799357e-02 +2594 5.196 -9.0805258e-03 -1.1771017e-02 +2595 5.198 -9.0570121e-03 -1.1742732e-02 +2596 5.2 -9.0335549e-03 -1.1714503e-02 +2597 5.202 -9.0101541e-03 -1.1686328e-02 +2598 5.204 -8.9868095e-03 -1.1658209e-02 +2599 5.206 -8.9635212e-03 -1.1630144e-02 +2600 5.208 -8.9402889e-03 -1.1602134e-02 +2601 5.21 -8.9171126e-03 -1.1574180e-02 +2602 5.212 -8.8939922e-03 -1.1546280e-02 +2603 5.214 -8.8709275e-03 -1.1518436e-02 +2604 5.216 -8.8479184e-03 -1.1490646e-02 +2605 5.218 -8.8249648e-03 -1.1462911e-02 +2606 5.22 -8.8020667e-03 -1.1435231e-02 +2607 5.222 -8.7792239e-03 -1.1407606e-02 +2608 5.224 -8.7564362e-03 -1.1380036e-02 +2609 5.226 -8.7337037e-03 -1.1352520e-02 +2610 5.228 -8.7110261e-03 -1.1325059e-02 +2611 5.23 -8.6884034e-03 -1.1297653e-02 +2612 5.232 -8.6658355e-03 -1.1270301e-02 +2613 5.234 -8.6433222e-03 -1.1243004e-02 +2614 5.236 -8.6208634e-03 -1.1215761e-02 +2615 5.238 -8.5984591e-03 -1.1188573e-02 +2616 5.24 -8.5761091e-03 -1.1161440e-02 +2617 5.242 -8.5538133e-03 -1.1134361e-02 +2618 5.244 -8.5315716e-03 -1.1107336e-02 +2619 5.246 -8.5093839e-03 -1.1080366e-02 +2620 5.248 -8.4872501e-03 -1.1053450e-02 +2621 5.25 -8.4651701e-03 -1.1026588e-02 +2622 5.252 -8.4431437e-03 -1.0999781e-02 +2623 5.254 -8.4211709e-03 -1.0973027e-02 +2624 5.256 -8.3992516e-03 -1.0946328e-02 +2625 5.258 -8.3773856e-03 -1.0919684e-02 +2626 5.26 -8.3555728e-03 -1.0893093e-02 +2627 5.262 -8.3338132e-03 -1.0866556e-02 +2628 5.264 -8.3121066e-03 -1.0840073e-02 +2629 5.266 -8.2904528e-03 -1.0813644e-02 +2630 5.268 -8.2688519e-03 -1.0787270e-02 +2631 5.27 -8.2473037e-03 -1.0760949e-02 +2632 5.272 -8.2258081e-03 -1.0734681e-02 +2633 5.274 -8.2043650e-03 -1.0708468e-02 +2634 5.276 -8.1829742e-03 -1.0682308e-02 +2635 5.278 -8.1616357e-03 -1.0656202e-02 +2636 5.28 -8.1403494e-03 -1.0630150e-02 +2637 5.282 -8.1191151e-03 -1.0604151e-02 +2638 5.284 -8.0979327e-03 -1.0578206e-02 +2639 5.286 -8.0768022e-03 -1.0552314e-02 +2640 5.288 -8.0557234e-03 -1.0526476e-02 +2641 5.29 -8.0346963e-03 -1.0500691e-02 +2642 5.292 -8.0137206e-03 -1.0474960e-02 +2643 5.294 -7.9927964e-03 -1.0449281e-02 +2644 5.296 -7.9719235e-03 -1.0423656e-02 +2645 5.298 -7.9511017e-03 -1.0398085e-02 +2646 5.3 -7.9303311e-03 -1.0372566e-02 +2647 5.302 -7.9096114e-03 -1.0347101e-02 +2648 5.304 -7.8889427e-03 -1.0321688e-02 +2649 5.306 -7.8683246e-03 -1.0296329e-02 +2650 5.308 -7.8477573e-03 -1.0271022e-02 +2651 5.31 -7.8272405e-03 -1.0245768e-02 +2652 5.312 -7.8067742e-03 -1.0220568e-02 +2653 5.314 -7.7863582e-03 -1.0195420e-02 +2654 5.316 -7.7659925e-03 -1.0170324e-02 +2655 5.318 -7.7456769e-03 -1.0145282e-02 +2656 5.32 -7.7254113e-03 -1.0120292e-02 +2657 5.322 -7.7051957e-03 -1.0095354e-02 +2658 5.324 -7.6850299e-03 -1.0070469e-02 +2659 5.326 -7.6649138e-03 -1.0045637e-02 +2660 5.328 -7.6448473e-03 -1.0020857e-02 +2661 5.33 -7.6248303e-03 -9.9961290e-03 +2662 5.332 -7.6048627e-03 -9.9714535e-03 +2663 5.334 -7.5849445e-03 -9.9468303e-03 +2664 5.336 -7.5650754e-03 -9.9222592e-03 +2665 5.338 -7.5452554e-03 -9.8977403e-03 +2666 5.34 -7.5254844e-03 -9.8732734e-03 +2667 5.342 -7.5057623e-03 -9.8488586e-03 +2668 5.344 -7.4860889e-03 -9.8244956e-03 +2669 5.346 -7.4664642e-03 -9.8001846e-03 +2670 5.348 -7.4468881e-03 -9.7759253e-03 +2671 5.35 -7.4273605e-03 -9.7517178e-03 +2672 5.352 -7.4078812e-03 -9.7275621e-03 +2673 5.354 -7.3884502e-03 -9.7034579e-03 +2674 5.356 -7.3690674e-03 -9.6794054e-03 +2675 5.358 -7.3497326e-03 -9.6554043e-03 +2676 5.36 -7.3304457e-03 -9.6314548e-03 +2677 5.362 -7.3112067e-03 -9.6075566e-03 +2678 5.364 -7.2920155e-03 -9.5837098e-03 +2679 5.366 -7.2728718e-03 -9.5599142e-03 +2680 5.368 -7.2537758e-03 -9.5361699e-03 +2681 5.37 -7.2347271e-03 -9.5124767e-03 +2682 5.372 -7.2157258e-03 -9.4888346e-03 +2683 5.374 -7.1967718e-03 -9.4652435e-03 +2684 5.376 -7.1778648e-03 -9.4417034e-03 +2685 5.378 -7.1590049e-03 -9.4182142e-03 +2686 5.38 -7.1401919e-03 -9.3947759e-03 +2687 5.382 -7.1214258e-03 -9.3713883e-03 +2688 5.384 -7.1027063e-03 -9.3480514e-03 +2689 5.386 -7.0840335e-03 -9.3247651e-03 +2690 5.388 -7.0654072e-03 -9.3015295e-03 +2691 5.39 -7.0468274e-03 -9.2783443e-03 +2692 5.392 -7.0282938e-03 -9.2552097e-03 +2693 5.394 -7.0098065e-03 -9.2321254e-03 +2694 5.396 -6.9913653e-03 -9.2090914e-03 +2695 5.398 -6.9729701e-03 -9.1861076e-03 +2696 5.4 -6.9546208e-03 -9.1631741e-03 +2697 5.402 -6.9363174e-03 -9.1402907e-03 +2698 5.404 -6.9180596e-03 -9.1174573e-03 +2699 5.406 -6.8998475e-03 -9.0946740e-03 +2700 5.408 -6.8816809e-03 -9.0719405e-03 +2701 5.41 -6.8635597e-03 -9.0492570e-03 +2702 5.412 -6.8454838e-03 -9.0266232e-03 +2703 5.414 -6.8274532e-03 -9.0040391e-03 +2704 5.416 -6.8094677e-03 -8.9815047e-03 +2705 5.418 -6.7915271e-03 -8.9590199e-03 +2706 5.42 -6.7736315e-03 -8.9365846e-03 +2707 5.422 -6.7557808e-03 -8.9141987e-03 +2708 5.424 -6.7379747e-03 -8.8918622e-03 +2709 5.426 -6.7202133e-03 -8.8695751e-03 +2710 5.428 -6.7024964e-03 -8.8473372e-03 +2711 5.43 -6.6848239e-03 -8.8251484e-03 +2712 5.432 -6.6671958e-03 -8.8030088e-03 +2713 5.434 -6.6496118e-03 -8.7809182e-03 +2714 5.436 -6.6320721e-03 -8.7588766e-03 +2715 5.438 -6.6145763e-03 -8.7368839e-03 +2716 5.44 -6.5971245e-03 -8.7149400e-03 +2717 5.442 -6.5797165e-03 -8.6930449e-03 +2718 5.444 -6.5623523e-03 -8.6711985e-03 +2719 5.446 -6.5450317e-03 -8.6494007e-03 +2720 5.448 -6.5277546e-03 -8.6276514e-03 +2721 5.45 -6.5105210e-03 -8.6059506e-03 +2722 5.452 -6.4933308e-03 -8.5842982e-03 +2723 5.454 -6.4761838e-03 -8.5626942e-03 +2724 5.456 -6.4590800e-03 -8.5411385e-03 +2725 5.458 -6.4420192e-03 -8.5196309e-03 +2726 5.46 -6.4250014e-03 -8.4981714e-03 +2727 5.462 -6.4080265e-03 -8.4767601e-03 +2728 5.464 -6.3910944e-03 -8.4553967e-03 +2729 5.466 -6.3742049e-03 -8.4340812e-03 +2730 5.468 -6.3573580e-03 -8.4128135e-03 +2731 5.47 -6.3405536e-03 -8.3915936e-03 +2732 5.472 -6.3237916e-03 -8.3704214e-03 +2733 5.474 -6.3070719e-03 -8.3492969e-03 +2734 5.476 -6.2903944e-03 -8.3282198e-03 +2735 5.478 -6.2737590e-03 -8.3071903e-03 +2736 5.48 -6.2571656e-03 -8.2862082e-03 +2737 5.482 -6.2406141e-03 -8.2652734e-03 +2738 5.484 -6.2241045e-03 -8.2443858e-03 +2739 5.486 -6.2076365e-03 -8.2235455e-03 +2740 5.488 -6.1912103e-03 -8.2027522e-03 +2741 5.49 -6.1748255e-03 -8.1820060e-03 +2742 5.492 -6.1584822e-03 -8.1613068e-03 +2743 5.494 -6.1421802e-03 -8.1406545e-03 +2744 5.496 -6.1259195e-03 -8.1200490e-03 +2745 5.498 -6.1097000e-03 -8.0994902e-03 +2746 5.5 -6.0935216e-03 -8.0789781e-03 +2747 5.502 -6.0773841e-03 -8.0585126e-03 +2748 5.504 -6.0612875e-03 -8.0380937e-03 +2749 5.506 -6.0452317e-03 -8.0177211e-03 +2750 5.508 -6.0292166e-03 -7.9973950e-03 +2751 5.51 -6.0132421e-03 -7.9771152e-03 +2752 5.512 -5.9973081e-03 -7.9568816e-03 +2753 5.514 -5.9814145e-03 -7.9366941e-03 +2754 5.516 -5.9655613e-03 -7.9165528e-03 +2755 5.518 -5.9497483e-03 -7.8964574e-03 +2756 5.52 -5.9339754e-03 -7.8764080e-03 +2757 5.522 -5.9182426e-03 -7.8564044e-03 +2758 5.524 -5.9025498e-03 -7.8364466e-03 +2759 5.526 -5.8868968e-03 -7.8165345e-03 +2760 5.528 -5.8712836e-03 -7.7966681e-03 +2761 5.53 -5.8557101e-03 -7.7768472e-03 +2762 5.532 -5.8401762e-03 -7.7570718e-03 +2763 5.534 -5.8246818e-03 -7.7373418e-03 +2764 5.536 -5.8092268e-03 -7.7176572e-03 +2765 5.538 -5.7938111e-03 -7.6980177e-03 +2766 5.54 -5.7784347e-03 -7.6784235e-03 +2767 5.542 -5.7630974e-03 -7.6588744e-03 +2768 5.544 -5.7477991e-03 -7.6393703e-03 +2769 5.546 -5.7325399e-03 -7.6199112e-03 +2770 5.548 -5.7173195e-03 -7.6004969e-03 +2771 5.55 -5.7021378e-03 -7.5811275e-03 +2772 5.552 -5.6869949e-03 -7.5618028e-03 +2773 5.554 -5.6718906e-03 -7.5425227e-03 +2774 5.556 -5.6568248e-03 -7.5232872e-03 +2775 5.558 -5.6417974e-03 -7.5040962e-03 +2776 5.56 -5.6268084e-03 -7.4849497e-03 +2777 5.562 -5.6118576e-03 -7.4658475e-03 +2778 5.564 -5.5969450e-03 -7.4467895e-03 +2779 5.566 -5.5820704e-03 -7.4277758e-03 +2780 5.568 -5.5672338e-03 -7.4088062e-03 +2781 5.57 -5.5524352e-03 -7.3898806e-03 +2782 5.572 -5.5376743e-03 -7.3709990e-03 +2783 5.574 -5.5229511e-03 -7.3521613e-03 +2784 5.576 -5.5082656e-03 -7.3333674e-03 +2785 5.578 -5.4936176e-03 -7.3146172e-03 +2786 5.58 -5.4790071e-03 -7.2959107e-03 +2787 5.582 -5.4644340e-03 -7.2772478e-03 +2788 5.584 -5.4498981e-03 -7.2586285e-03 +2789 5.586 -5.4353994e-03 -7.2400525e-03 +2790 5.588 -5.4209379e-03 -7.2215199e-03 +2791 5.59 -5.4065133e-03 -7.2030306e-03 +2792 5.592 -5.3921257e-03 -7.1845845e-03 +2793 5.594 -5.3777749e-03 -7.1661815e-03 +2794 5.596 -5.3634609e-03 -7.1478216e-03 +2795 5.598 -5.3491836e-03 -7.1295046e-03 +2796 5.6 -5.3349429e-03 -7.1112306e-03 +2797 5.602 -5.3207387e-03 -7.0929994e-03 +2798 5.604 -5.3065709e-03 -7.0748109e-03 +2799 5.606 -5.2924394e-03 -7.0566651e-03 +2800 5.608 -5.2783442e-03 -7.0385619e-03 +2801 5.61 -5.2642851e-03 -7.0205012e-03 +2802 5.612 -5.2502622e-03 -7.0024829e-03 +2803 5.614 -5.2362752e-03 -6.9845070e-03 +2804 5.616 -5.2223241e-03 -6.9665734e-03 +2805 5.618 -5.2084088e-03 -6.9486820e-03 +2806 5.62 -5.1945293e-03 -6.9308327e-03 +2807 5.622 -5.1806855e-03 -6.9130255e-03 +2808 5.624 -5.1668772e-03 -6.8952603e-03 +2809 5.626 -5.1531044e-03 -6.8775370e-03 +2810 5.628 -5.1393670e-03 -6.8598555e-03 +2811 5.63 -5.1256650e-03 -6.8422157e-03 +2812 5.632 -5.1119981e-03 -6.8246176e-03 +2813 5.634 -5.0983665e-03 -6.8070612e-03 +2814 5.636 -5.0847699e-03 -6.7895462e-03 +2815 5.638 -5.0712083e-03 -6.7720727e-03 +2816 5.64 -5.0576816e-03 -6.7546405e-03 +2817 5.642 -5.0441897e-03 -6.7372497e-03 +2818 5.644 -5.0307325e-03 -6.7199000e-03 +2819 5.646 -5.0173100e-03 -6.7025915e-03 +2820 5.648 -5.0039221e-03 -6.6853241e-03 +2821 5.65 -4.9905687e-03 -6.6680976e-03 +2822 5.652 -4.9772497e-03 -6.6509120e-03 +2823 5.654 -4.9639650e-03 -6.6337673e-03 +2824 5.656 -4.9507146e-03 -6.6166633e-03 +2825 5.658 -4.9374984e-03 -6.5996000e-03 +2826 5.66 -4.9243162e-03 -6.5825773e-03 +2827 5.662 -4.9111680e-03 -6.5655951e-03 +2828 5.664 -4.8980538e-03 -6.5486534e-03 +2829 5.666 -4.8849734e-03 -6.5317520e-03 +2830 5.668 -4.8719267e-03 -6.5148909e-03 +2831 5.67 -4.8589138e-03 -6.4980701e-03 +2832 5.672 -4.8459344e-03 -6.4812893e-03 +2833 5.674 -4.8329886e-03 -6.4645487e-03 +2834 5.676 -4.8200762e-03 -6.4478480e-03 +2835 5.678 -4.8071972e-03 -6.4311873e-03 +2836 5.68 -4.7943514e-03 -6.4145663e-03 +2837 5.682 -4.7815389e-03 -6.3979852e-03 +2838 5.684 -4.7687595e-03 -6.3814437e-03 +2839 5.686 -4.7560131e-03 -6.3649418e-03 +2840 5.688 -4.7432997e-03 -6.3484795e-03 +2841 5.69 -4.7306192e-03 -6.3320566e-03 +2842 5.692 -4.7179714e-03 -6.3156730e-03 +2843 5.694 -4.7053564e-03 -6.2993288e-03 +2844 5.696 -4.6927741e-03 -6.2830238e-03 +2845 5.698 -4.6802243e-03 -6.2667580e-03 +2846 5.7 -4.6677070e-03 -6.2505312e-03 +2847 5.702 -4.6552222e-03 -6.2343434e-03 +2848 5.704 -4.6427696e-03 -6.2181946e-03 +2849 5.706 -4.6303494e-03 -6.2020846e-03 +2850 5.708 -4.6179613e-03 -6.1860133e-03 +2851 5.71 -4.6056053e-03 -6.1699808e-03 +2852 5.712 -4.5932813e-03 -6.1539868e-03 +2853 5.714 -4.5809893e-03 -6.1380314e-03 +2854 5.716 -4.5687292e-03 -6.1221145e-03 +2855 5.718 -4.5565008e-03 -6.1062359e-03 +2856 5.72 -4.5443042e-03 -6.0903957e-03 +2857 5.722 -4.5321392e-03 -6.0745937e-03 +2858 5.724 -4.5200058e-03 -6.0588299e-03 +2859 5.726 -4.5079039e-03 -6.0431041e-03 +2860 5.728 -4.4958334e-03 -6.0274164e-03 +2861 5.73 -4.4837942e-03 -6.0117666e-03 +2862 5.732 -4.4717863e-03 -5.9961547e-03 +2863 5.734 -4.4598095e-03 -5.9805805e-03 +2864 5.736 -4.4478639e-03 -5.9650440e-03 +2865 5.738 -4.4359493e-03 -5.9495452e-03 +2866 5.74 -4.4240657e-03 -5.9340840e-03 +2867 5.742 -4.4122130e-03 -5.9186602e-03 +2868 5.744 -4.4003910e-03 -5.9032738e-03 +2869 5.746 -4.3885999e-03 -5.8879248e-03 +2870 5.748 -4.3768393e-03 -5.8726130e-03 +2871 5.75 -4.3651094e-03 -5.8573384e-03 +2872 5.752 -4.3534099e-03 -5.8421010e-03 +2873 5.754 -4.3417409e-03 -5.8269005e-03 +2874 5.756 -4.3301023e-03 -5.8117370e-03 +2875 5.758 -4.3184940e-03 -5.7966104e-03 +2876 5.76 -4.3069159e-03 -5.7815206e-03 +2877 5.762 -4.2953679e-03 -5.7664675e-03 +2878 5.764 -4.2838500e-03 -5.7514511e-03 +2879 5.766 -4.2723620e-03 -5.7364713e-03 +2880 5.768 -4.2609040e-03 -5.7215280e-03 +2881 5.77 -4.2494759e-03 -5.7066211e-03 +2882 5.772 -4.2380775e-03 -5.6917506e-03 +2883 5.774 -4.2267089e-03 -5.6769164e-03 +2884 5.776 -4.2153698e-03 -5.6621184e-03 +2885 5.778 -4.2040604e-03 -5.6473565e-03 +2886 5.78 -4.1927804e-03 -5.6326307e-03 +2887 5.782 -4.1815298e-03 -5.6179409e-03 +2888 5.784 -4.1703086e-03 -5.6032870e-03 +2889 5.786 -4.1591167e-03 -5.5886689e-03 +2890 5.788 -4.1479539e-03 -5.5740866e-03 +2891 5.79 -4.1368203e-03 -5.5595401e-03 +2892 5.792 -4.1257157e-03 -5.5450291e-03 +2893 5.794 -4.1146402e-03 -5.5305537e-03 +2894 5.796 -4.1035935e-03 -5.5161137e-03 +2895 5.798 -4.0925757e-03 -5.5017092e-03 +2896 5.8 -4.0815866e-03 -5.4873400e-03 +2897 5.802 -4.0706263e-03 -5.4730060e-03 +2898 5.804 -4.0596946e-03 -5.4587072e-03 +2899 5.806 -4.0487914e-03 -5.4444435e-03 +2900 5.808 -4.0379168e-03 -5.4302149e-03 +2901 5.81 -4.0270706e-03 -5.4160212e-03 +2902 5.812 -4.0162527e-03 -5.4018624e-03 +2903 5.814 -4.0054631e-03 -5.3877385e-03 +2904 5.816 -3.9947017e-03 -5.3736492e-03 +2905 5.818 -3.9839685e-03 -5.3595947e-03 +2906 5.82 -3.9732633e-03 -5.3455747e-03 +2907 5.822 -3.9625861e-03 -5.3315893e-03 +2908 5.824 -3.9519369e-03 -5.3176383e-03 +2909 5.826 -3.9413156e-03 -5.3037217e-03 +2910 5.828 -3.9307220e-03 -5.2898394e-03 +2911 5.83 -3.9201562e-03 -5.2759913e-03 +2912 5.832 -3.9096180e-03 -5.2621774e-03 +2913 5.834 -3.8991075e-03 -5.2483976e-03 +2914 5.836 -3.8886244e-03 -5.2346518e-03 +2915 5.838 -3.8781688e-03 -5.2209399e-03 +2916 5.84 -3.8677406e-03 -5.2072620e-03 +2917 5.842 -3.8573398e-03 -5.1936178e-03 +2918 5.844 -3.8469661e-03 -5.1800074e-03 +2919 5.846 -3.8366197e-03 -5.1664306e-03 +2920 5.848 -3.8263004e-03 -5.1528874e-03 +2921 5.85 -3.8160081e-03 -5.1393777e-03 +2922 5.852 -3.8057429e-03 -5.1259015e-03 +2923 5.854 -3.7955045e-03 -5.1124586e-03 +2924 5.856 -3.7852930e-03 -5.0990491e-03 +2925 5.858 -3.7751083e-03 -5.0856727e-03 +2926 5.86 -3.7649503e-03 -5.0723296e-03 +2927 5.862 -3.7548189e-03 -5.0590195e-03 +2928 5.864 -3.7447142e-03 -5.0457424e-03 +2929 5.866 -3.7346359e-03 -5.0324983e-03 +2930 5.868 -3.7245842e-03 -5.0192871e-03 +2931 5.87 -3.7145588e-03 -5.0061086e-03 +2932 5.872 -3.7045597e-03 -4.9929629e-03 +2933 5.874 -3.6945869e-03 -4.9798499e-03 +2934 5.876 -3.6846403e-03 -4.9667694e-03 +2935 5.878 -3.6747198e-03 -4.9537215e-03 +2936 5.88 -3.6648254e-03 -4.9407060e-03 +2937 5.882 -3.6549570e-03 -4.9277229e-03 +2938 5.884 -3.6451145e-03 -4.9147722e-03 +2939 5.886 -3.6352978e-03 -4.9018536e-03 +2940 5.888 -3.6255070e-03 -4.8889673e-03 +2941 5.89 -3.6157420e-03 -4.8761130e-03 +2942 5.892 -3.6060026e-03 -4.8632908e-03 +2943 5.894 -3.5962888e-03 -4.8505005e-03 +2944 5.896 -3.5866005e-03 -4.8377422e-03 +2945 5.898 -3.5769378e-03 -4.8250156e-03 +2946 5.9 -3.5673005e-03 -4.8123208e-03 +2947 5.902 -3.5576885e-03 -4.7996577e-03 +2948 5.904 -3.5481018e-03 -4.7870263e-03 +2949 5.906 -3.5385404e-03 -4.7744263e-03 +2950 5.908 -3.5290041e-03 -4.7618579e-03 +2951 5.91 -3.5194929e-03 -4.7493208e-03 +2952 5.912 -3.5100068e-03 -4.7368151e-03 +2953 5.914 -3.5005456e-03 -4.7243407e-03 +2954 5.916 -3.4911094e-03 -4.7118974e-03 +2955 5.918 -3.4816980e-03 -4.6994853e-03 +2956 5.92 -3.4723114e-03 -4.6871043e-03 +2957 5.922 -3.4629496e-03 -4.6747542e-03 +2958 5.924 -3.4536124e-03 -4.6624351e-03 +2959 5.926 -3.4442998e-03 -4.6501469e-03 +2960 5.928 -3.4350118e-03 -4.6378894e-03 +2961 5.93 -3.4257482e-03 -4.6256627e-03 +2962 5.932 -3.4165091e-03 -4.6134666e-03 +2963 5.934 -3.4072943e-03 -4.6013012e-03 +2964 5.936 -3.3981039e-03 -4.5891662e-03 +2965 5.938 -3.3889377e-03 -4.5770617e-03 +2966 5.94 -3.3797956e-03 -4.5649876e-03 +2967 5.942 -3.3706777e-03 -4.5529438e-03 +2968 5.944 -3.3615838e-03 -4.5409302e-03 +2969 5.946 -3.3525139e-03 -4.5289468e-03 +2970 5.948 -3.3434680e-03 -4.5169936e-03 +2971 5.95 -3.3344460e-03 -4.5050704e-03 +2972 5.952 -3.3254477e-03 -4.4931772e-03 +2973 5.954 -3.3164732e-03 -4.4813139e-03 +2974 5.956 -3.3075224e-03 -4.4694804e-03 +2975 5.958 -3.2985953e-03 -4.4576768e-03 +2976 5.96 -3.2896917e-03 -4.4459028e-03 +2977 5.962 -3.2808117e-03 -4.4341585e-03 +2978 5.964 -3.2719551e-03 -4.4224438e-03 +2979 5.966 -3.2631219e-03 -4.4107586e-03 +2980 5.968 -3.2543120e-03 -4.3991029e-03 +2981 5.97 -3.2455254e-03 -4.3874765e-03 +2982 5.972 -3.2367621e-03 -4.3758795e-03 +2983 5.974 -3.2280219e-03 -4.3643117e-03 +2984 5.976 -3.2193048e-03 -4.3527731e-03 +2985 5.978 -3.2106108e-03 -4.3412636e-03 +2986 5.98 -3.2019397e-03 -4.3297832e-03 +2987 5.982 -3.1932916e-03 -4.3183318e-03 +2988 5.984 -3.1846664e-03 -4.3069092e-03 +2989 5.986 -3.1760640e-03 -4.2955156e-03 +2990 5.988 -3.1674843e-03 -4.2841508e-03 +2991 5.99 -3.1589273e-03 -4.2728146e-03 +2992 5.992 -3.1503930e-03 -4.2615072e-03 +2993 5.994 -3.1418813e-03 -4.2502283e-03 +2994 5.996 -3.1333921e-03 -4.2389780e-03 +2995 5.998 -3.1249254e-03 -4.2277562e-03 +2996 6.0 -3.1164811e-03 -4.2165627e-03 +2997 6.002 -3.1080591e-03 -4.2053976e-03 +2998 6.004 -3.0996594e-03 -4.1942608e-03 +2999 6.006 -3.0912820e-03 -4.1831522e-03 +3000 6.008 -3.0829268e-03 -4.1720717e-03 +3001 6.01 -3.0745937e-03 -4.1610194e-03 +3002 6.012 -3.0662827e-03 -4.1499950e-03 +3003 6.014 -3.0579937e-03 -4.1389986e-03 +3004 6.016 -3.0497267e-03 -4.1280301e-03 +3005 6.018 -3.0414816e-03 -4.1170894e-03 +3006 6.02 -3.0332583e-03 -4.1061765e-03 +3007 6.022 -3.0250569e-03 -4.0952913e-03 +3008 6.024 -3.0168771e-03 -4.0844338e-03 +3009 6.026 -3.0087191e-03 -4.0736038e-03 +3010 6.028 -3.0005827e-03 -4.0628013e-03 +3011 6.03 -2.9924679e-03 -4.0520263e-03 +3012 6.032 -2.9843746e-03 -4.0412786e-03 +3013 6.034 -2.9763028e-03 -4.0305583e-03 +3014 6.036 -2.9682523e-03 -4.0198653e-03 +3015 6.038 -2.9602233e-03 -4.0091994e-03 +3016 6.04 -2.9522155e-03 -3.9985607e-03 +3017 6.042 -2.9442290e-03 -3.9879491e-03 +3018 6.044 -2.9362637e-03 -3.9773645e-03 +3019 6.046 -2.9283195e-03 -3.9668068e-03 +3020 6.048 -2.9203965e-03 -3.9562760e-03 +3021 6.05 -2.9124944e-03 -3.9457720e-03 +3022 6.052 -2.9046134e-03 -3.9352948e-03 +3023 6.054 -2.8967532e-03 -3.9248443e-03 +3024 6.056 -2.8889140e-03 -3.9144205e-03 +3025 6.058 -2.8810955e-03 -3.9040232e-03 +3026 6.06 -2.8732979e-03 -3.8936524e-03 +3027 6.062 -2.8655209e-03 -3.8833081e-03 +3028 6.064 -2.8577646e-03 -3.8729902e-03 +3029 6.066 -2.8500289e-03 -3.8626986e-03 +3030 6.068 -2.8423138e-03 -3.8524333e-03 +3031 6.07 -2.8346192e-03 -3.8421942e-03 +3032 6.072 -2.8269450e-03 -3.8319813e-03 +3033 6.074 -2.8192912e-03 -3.8217944e-03 +3034 6.076 -2.8116578e-03 -3.8116336e-03 +3035 6.078 -2.8040447e-03 -3.8014988e-03 +3036 6.08 -2.7964518e-03 -3.7913898e-03 +3037 6.082 -2.7888791e-03 -3.7813067e-03 +3038 6.084 -2.7813265e-03 -3.7712494e-03 +3039 6.086 -2.7737941e-03 -3.7612178e-03 +3040 6.088 -2.7662817e-03 -3.7512119e-03 +3041 6.09 -2.7587892e-03 -3.7412316e-03 +3042 6.092 -2.7513167e-03 -3.7312769e-03 +3043 6.094 -2.7438641e-03 -3.7213476e-03 +3044 6.096 -2.7364313e-03 -3.7114438e-03 +3045 6.098 -2.7290183e-03 -3.7015653e-03 +3046 6.1 -2.7216250e-03 -3.6917121e-03 +3047 6.102 -2.7142514e-03 -3.6818842e-03 +3048 6.104 -2.7068975e-03 -3.6720815e-03 +3049 6.106 -2.6995631e-03 -3.6623039e-03 +3050 6.108 -2.6922482e-03 -3.6525514e-03 +3051 6.11 -2.6849529e-03 -3.6428239e-03 +3052 6.112 -2.6776769e-03 -3.6331214e-03 +3053 6.114 -2.6704204e-03 -3.6234437e-03 +3054 6.116 -2.6631831e-03 -3.6137909e-03 +3055 6.118 -2.6559652e-03 -3.6041629e-03 +3056 6.12 -2.6487665e-03 -3.5945596e-03 +3057 6.122 -2.6415869e-03 -3.5849810e-03 +3058 6.124 -2.6344265e-03 -3.5754269e-03 +3059 6.126 -2.6272852e-03 -3.5658975e-03 +3060 6.128 -2.6201629e-03 -3.5563925e-03 +3061 6.13 -2.6130596e-03 -3.5469119e-03 +3062 6.132 -2.6059753e-03 -3.5374557e-03 +3063 6.134 -2.5989098e-03 -3.5280239e-03 +3064 6.136 -2.5918631e-03 -3.5186163e-03 +3065 6.138 -2.5848353e-03 -3.5092329e-03 +3066 6.14 -2.5778262e-03 -3.4998736e-03 +3067 6.142 -2.5708358e-03 -3.4905384e-03 +3068 6.144 -2.5638640e-03 -3.4812273e-03 +3069 6.146 -2.5569109e-03 -3.4719401e-03 +3070 6.148 -2.5499763e-03 -3.4626769e-03 +3071 6.15 -2.5430601e-03 -3.4534375e-03 +3072 6.152 -2.5361625e-03 -3.4442219e-03 +3073 6.154 -2.5292832e-03 -3.4350301e-03 +3074 6.156 -2.5224224e-03 -3.4258619e-03 +3075 6.158 -2.5155798e-03 -3.4167174e-03 +3076 6.16 -2.5087555e-03 -3.4075965e-03 +3077 6.162 -2.5019494e-03 -3.3984991e-03 +3078 6.164 -2.4951615e-03 -3.3894251e-03 +3079 6.166 -2.4883917e-03 -3.3803746e-03 +3080 6.168 -2.4816399e-03 -3.3713474e-03 +3081 6.17 -2.4749063e-03 -3.3623436e-03 +3082 6.172 -2.4681906e-03 -3.3533629e-03 +3083 6.174 -2.4614928e-03 -3.3444055e-03 +3084 6.176 -2.4548129e-03 -3.3354712e-03 +3085 6.178 -2.4481509e-03 -3.3265599e-03 +3086 6.18 -2.4415067e-03 -3.3176717e-03 +3087 6.182 -2.4348802e-03 -3.3088065e-03 +3088 6.184 -2.4282714e-03 -3.2999641e-03 +3089 6.186 -2.4216803e-03 -3.2911447e-03 +3090 6.188 -2.4151068e-03 -3.2823480e-03 +3091 6.19 -2.4085509e-03 -3.2735741e-03 +3092 6.192 -2.4020125e-03 -3.2648228e-03 +3093 6.194 -2.3954916e-03 -3.2560943e-03 +3094 6.196 -2.3889881e-03 -3.2473883e-03 +3095 6.198 -2.3825020e-03 -3.2387048e-03 +3096 6.2 -2.3760333e-03 -3.2300438e-03 +3097 6.202 -2.3695818e-03 -3.2214052e-03 +3098 6.204 -2.3631477e-03 -3.2127890e-03 +3099 6.206 -2.3567307e-03 -3.2041951e-03 +3100 6.208 -2.3503309e-03 -3.1956235e-03 +3101 6.21 -2.3439482e-03 -3.1870741e-03 +3102 6.212 -2.3375825e-03 -3.1785468e-03 +3103 6.214 -2.3312340e-03 -3.1700416e-03 +3104 6.216 -2.3249024e-03 -3.1615585e-03 +3105 6.218 -2.3185877e-03 -3.1530974e-03 +3106 6.22 -2.3122900e-03 -3.1446582e-03 +3107 6.222 -2.3060091e-03 -3.1362410e-03 +3108 6.224 -2.2997450e-03 -3.1278455e-03 +3109 6.226 -2.2934977e-03 -3.1194718e-03 +3110 6.228 -2.2872671e-03 -3.1111199e-03 +3111 6.23 -2.2810532e-03 -3.1027896e-03 +3112 6.232 -2.2748559e-03 -3.0944810e-03 +3113 6.234 -2.2686752e-03 -3.0861940e-03 +3114 6.236 -2.2625111e-03 -3.0779284e-03 +3115 6.238 -2.2563635e-03 -3.0696843e-03 +3116 6.24 -2.2502324e-03 -3.0614617e-03 +3117 6.242 -2.2441176e-03 -3.0532604e-03 +3118 6.244 -2.2380193e-03 -3.0450804e-03 +3119 6.246 -2.2319373e-03 -3.0369217e-03 +3120 6.248 -2.2258716e-03 -3.0287842e-03 +3121 6.25 -2.2198222e-03 -3.0206679e-03 +3122 6.252 -2.2137889e-03 -3.0125727e-03 +3123 6.254 -2.2077719e-03 -3.0044985e-03 +3124 6.256 -2.2017709e-03 -2.9964453e-03 +3125 6.258 -2.1957861e-03 -2.9884131e-03 +3126 6.26 -2.1898172e-03 -2.9804018e-03 +3127 6.262 -2.1838644e-03 -2.9724113e-03 +3128 6.264 -2.1779276e-03 -2.9644417e-03 +3129 6.266 -2.1720067e-03 -2.9564928e-03 +3130 6.268 -2.1661016e-03 -2.9485646e-03 +3131 6.27 -2.1602124e-03 -2.9406570e-03 +3132 6.272 -2.1543390e-03 -2.9327701e-03 +3133 6.274 -2.1484813e-03 -2.9249036e-03 +3134 6.276 -2.1426393e-03 -2.9170577e-03 +3135 6.278 -2.1368130e-03 -2.9092323e-03 +3136 6.28 -2.1310024e-03 -2.9014272e-03 +3137 6.282 -2.1252073e-03 -2.8936425e-03 +3138 6.284 -2.1194278e-03 -2.8858781e-03 +3139 6.286 -2.1136638e-03 -2.8781339e-03 +3140 6.288 -2.1079153e-03 -2.8704100e-03 +3141 6.29 -2.1021821e-03 -2.8627062e-03 +3142 6.292 -2.0964644e-03 -2.8550225e-03 +3143 6.294 -2.0907620e-03 -2.8473588e-03 +3144 6.296 -2.0850750e-03 -2.8397152e-03 +3145 6.298 -2.0794032e-03 -2.8320915e-03 +3146 6.3 -2.0737466e-03 -2.8244877e-03 +3147 6.302 -2.0681052e-03 -2.8169038e-03 +3148 6.304 -2.0624790e-03 -2.8093396e-03 +3149 6.306 -2.0568678e-03 -2.8017953e-03 +3150 6.308 -2.0512718e-03 -2.7942706e-03 +3151 6.31 -2.0456907e-03 -2.7867656e-03 +3152 6.312 -2.0401247e-03 -2.7792803e-03 +3153 6.314 -2.0345736e-03 -2.7718144e-03 +3154 6.316 -2.0290374e-03 -2.7643682e-03 +3155 6.318 -2.0235161e-03 -2.7569413e-03 +3156 6.32 -2.0180096e-03 -2.7495339e-03 +3157 6.322 -2.0125180e-03 -2.7421459e-03 +3158 6.324 -2.0070410e-03 -2.7347772e-03 +3159 6.326 -2.0015788e-03 -2.7274278e-03 +3160 6.328 -1.9961313e-03 -2.7200976e-03 +3161 6.33 -1.9906984e-03 -2.7127866e-03 +3162 6.332 -1.9852802e-03 -2.7054947e-03 +3163 6.334 -1.9798765e-03 -2.6982220e-03 +3164 6.336 -1.9744873e-03 -2.6909682e-03 +3165 6.338 -1.9691126e-03 -2.6837335e-03 +3166 6.34 -1.9637523e-03 -2.6765177e-03 +3167 6.342 -1.9584065e-03 -2.6693208e-03 +3168 6.344 -1.9530750e-03 -2.6621428e-03 +3169 6.346 -1.9477579e-03 -2.6549836e-03 +3170 6.348 -1.9424551e-03 -2.6478431e-03 +3171 6.35 -1.9371665e-03 -2.6407214e-03 +3172 6.352 -1.9318922e-03 -2.6336183e-03 +3173 6.354 -1.9266320e-03 -2.6265338e-03 +3174 6.356 -1.9213860e-03 -2.6194680e-03 +3175 6.358 -1.9161541e-03 -2.6124206e-03 +3176 6.36 -1.9109363e-03 -2.6053918e-03 +3177 6.362 -1.9057326e-03 -2.5983813e-03 +3178 6.364 -1.9005428e-03 -2.5913893e-03 +3179 6.366 -1.8953670e-03 -2.5844156e-03 +3180 6.368 -1.8902051e-03 -2.5774603e-03 +3181 6.37 -1.8850571e-03 -2.5705232e-03 +3182 6.372 -1.8799230e-03 -2.5636042e-03 +3183 6.374 -1.8748027e-03 -2.5567035e-03 +3184 6.376 -1.8696962e-03 -2.5498209e-03 +3185 6.378 -1.8646034e-03 -2.5429563e-03 +3186 6.38 -1.8595244e-03 -2.5361098e-03 +3187 6.382 -1.8544590e-03 -2.5292813e-03 +3188 6.384 -1.8494072e-03 -2.5224707e-03 +3189 6.386 -1.8443691e-03 -2.5156781e-03 +3190 6.388 -1.8393445e-03 -2.5089032e-03 +3191 6.39 -1.8343334e-03 -2.5021462e-03 +3192 6.392 -1.8293359e-03 -2.4954069e-03 +3193 6.394 -1.8243518e-03 -2.4886854e-03 +3194 6.396 -1.8193811e-03 -2.4819815e-03 +3195 6.398 -1.8144239e-03 -2.4752953e-03 +3196 6.4 -1.8094799e-03 -2.4686267e-03 +3197 6.402 -1.8045494e-03 -2.4619756e-03 +3198 6.404 -1.7996320e-03 -2.4553420e-03 +3199 6.406 -1.7947280e-03 -2.4487258e-03 +3200 6.408 -1.7898371e-03 -2.4421271e-03 +3201 6.41 -1.7849595e-03 -2.4355457e-03 +3202 6.412 -1.7800949e-03 -2.4289817e-03 +3203 6.414 -1.7752435e-03 -2.4224349e-03 +3204 6.416 -1.7704052e-03 -2.4159054e-03 +3205 6.418 -1.7655799e-03 -2.4093931e-03 +3206 6.42 -1.7607676e-03 -2.4028979e-03 +3207 6.422 -1.7559683e-03 -2.3964199e-03 +3208 6.424 -1.7511819e-03 -2.3899589e-03 +3209 6.426 -1.7464084e-03 -2.3835149e-03 +3210 6.428 -1.7416478e-03 -2.3770879e-03 +3211 6.43 -1.7369001e-03 -2.3706779e-03 +3212 6.432 -1.7321651e-03 -2.3642847e-03 +3213 6.434 -1.7274429e-03 -2.3579085e-03 +3214 6.436 -1.7227335e-03 -2.3515490e-03 +3215 6.438 -1.7180367e-03 -2.3452063e-03 +3216 6.44 -1.7133526e-03 -2.3388803e-03 +3217 6.442 -1.7086812e-03 -2.3325710e-03 +3218 6.444 -1.7040223e-03 -2.3262783e-03 +3219 6.446 -1.6993761e-03 -2.3200023e-03 +3220 6.448 -1.6947423e-03 -2.3137428e-03 +3221 6.45 -1.6901211e-03 -2.3074998e-03 +3222 6.452 -1.6855123e-03 -2.3012733e-03 +3223 6.454 -1.6809160e-03 -2.2950633e-03 +3224 6.456 -1.6763320e-03 -2.2888696e-03 +3225 6.458 -1.6717605e-03 -2.2826923e-03 +3226 6.46 -1.6672013e-03 -2.2765313e-03 +3227 6.462 -1.6626543e-03 -2.2703866e-03 +3228 6.464 -1.6581197e-03 -2.2642581e-03 +3229 6.466 -1.6535973e-03 -2.2581458e-03 +3230 6.468 -1.6490871e-03 -2.2520497e-03 +3231 6.47 -1.6445891e-03 -2.2459696e-03 +3232 6.472 -1.6401032e-03 -2.2399056e-03 +3233 6.474 -1.6356295e-03 -2.2338577e-03 +3234 6.476 -1.6311678e-03 -2.2278257e-03 +3235 6.478 -1.6267181e-03 -2.2218097e-03 +3236 6.48 -1.6222805e-03 -2.2158096e-03 +3237 6.482 -1.6178549e-03 -2.2098253e-03 +3238 6.484 -1.6134412e-03 -2.2038569e-03 +3239 6.486 -1.6090395e-03 -2.1979043e-03 +3240 6.488 -1.6046496e-03 -2.1919674e-03 +3241 6.49 -1.6002716e-03 -2.1860462e-03 +3242 6.492 -1.5959054e-03 -2.1801407e-03 +3243 6.494 -1.5915510e-03 -2.1742508e-03 +3244 6.496 -1.5872084e-03 -2.1683765e-03 +3245 6.498 -1.5828775e-03 -2.1625177e-03 +3246 6.5 -1.5785583e-03 -2.1566745e-03 +3247 6.502 -1.5742508e-03 -2.1508467e-03 +3248 6.504 -1.5699549e-03 -2.1450344e-03 +3249 6.506 -1.5656706e-03 -2.1392374e-03 +3250 6.508 -1.5613979e-03 -2.1334558e-03 +3251 6.51 -1.5571368e-03 -2.1276895e-03 +3252 6.512 -1.5528872e-03 -2.1219385e-03 +3253 6.514 -1.5486490e-03 -2.1162027e-03 +3254 6.516 -1.5444223e-03 -2.1104821e-03 +3255 6.518 -1.5402071e-03 -2.1047767e-03 +3256 6.52 -1.5360032e-03 -2.0990864e-03 +3257 6.522 -1.5318107e-03 -2.0934112e-03 +3258 6.524 -1.5276296e-03 -2.0877510e-03 +3259 6.526 -1.5234597e-03 -2.0821058e-03 +3260 6.528 -1.5193011e-03 -2.0764756e-03 +3261 6.53 -1.5151538e-03 -2.0708603e-03 +3262 6.532 -1.5110177e-03 -2.0652599e-03 +3263 6.534 -1.5068928e-03 -2.0596744e-03 +3264 6.536 -1.5027790e-03 -2.0541037e-03 +3265 6.538 -1.4986763e-03 -2.0485477e-03 +3266 6.54 -1.4945848e-03 -2.0430065e-03 +3267 6.542 -1.4905043e-03 -2.0374800e-03 +3268 6.544 -1.4864349e-03 -2.0319682e-03 +3269 6.546 -1.4823764e-03 -2.0264710e-03 +3270 6.548 -1.4783290e-03 -2.0209884e-03 +3271 6.55 -1.4742925e-03 -2.0155203e-03 +3272 6.552 -1.4702669e-03 -2.0100668e-03 +3273 6.554 -1.4662522e-03 -2.0046277e-03 +3274 6.556 -1.4622484e-03 -1.9992031e-03 +3275 6.558 -1.4582554e-03 -1.9937928e-03 +3276 6.56 -1.4542732e-03 -1.9883970e-03 +3277 6.562 -1.4503018e-03 -1.9830155e-03 +3278 6.564 -1.4463411e-03 -1.9776483e-03 +3279 6.566 -1.4423912e-03 -1.9722953e-03 +3280 6.568 -1.4384519e-03 -1.9669566e-03 +3281 6.57 -1.4345233e-03 -1.9616320e-03 +3282 6.572 -1.4306054e-03 -1.9563216e-03 +3283 6.574 -1.4266980e-03 -1.9510253e-03 +3284 6.576 -1.4228013e-03 -1.9457431e-03 +3285 6.578 -1.4189150e-03 -1.9404750e-03 +3286 6.58 -1.4150394e-03 -1.9352208e-03 +3287 6.582 -1.4111742e-03 -1.9299806e-03 +3288 6.584 -1.4073194e-03 -1.9247544e-03 +3289 6.586 -1.4034751e-03 -1.9195420e-03 +3290 6.588 -1.3996412e-03 -1.9143435e-03 +3291 6.59 -1.3958177e-03 -1.9091589e-03 +3292 6.592 -1.3920046e-03 -1.9039880e-03 +3293 6.594 -1.3882018e-03 -1.8988309e-03 +3294 6.596 -1.3844093e-03 -1.8936875e-03 +3295 6.598 -1.3806270e-03 -1.8885578e-03 +3296 6.6 -1.3768550e-03 -1.8834418e-03 +3297 6.602 -1.3730932e-03 -1.8783393e-03 +3298 6.604 -1.3693417e-03 -1.8732505e-03 +3299 6.606 -1.3656002e-03 -1.8681752e-03 +3300 6.608 -1.3618689e-03 -1.8631134e-03 +3301 6.61 -1.3581478e-03 -1.8580651e-03 +3302 6.612 -1.3544367e-03 -1.8530302e-03 +3303 6.614 -1.3507356e-03 -1.8480088e-03 +3304 6.616 -1.3470446e-03 -1.8430007e-03 +3305 6.618 -1.3433636e-03 -1.8380059e-03 +3306 6.62 -1.3396926e-03 -1.8330245e-03 +3307 6.622 -1.3360315e-03 -1.8280563e-03 +3308 6.624 -1.3323804e-03 -1.8231014e-03 +3309 6.626 -1.3287391e-03 -1.8181597e-03 +3310 6.628 -1.3251077e-03 -1.8132312e-03 +3311 6.63 -1.3214862e-03 -1.8083157e-03 +3312 6.632 -1.3178744e-03 -1.8034134e-03 +3313 6.634 -1.3142725e-03 -1.7985242e-03 +3314 6.636 -1.3106803e-03 -1.7936480e-03 +3315 6.638 -1.3070979e-03 -1.7887848e-03 +3316 6.64 -1.3035252e-03 -1.7839345e-03 +3317 6.642 -1.2999622e-03 -1.7790972e-03 +3318 6.644 -1.2964088e-03 -1.7742728e-03 +3319 6.646 -1.2928651e-03 -1.7694613e-03 +3320 6.648 -1.2893309e-03 -1.7646626e-03 +3321 6.65 -1.2858064e-03 -1.7598767e-03 +3322 6.652 -1.2822914e-03 -1.7551036e-03 +3323 6.654 -1.2787860e-03 -1.7503432e-03 +3324 6.656 -1.2752900e-03 -1.7455955e-03 +3325 6.658 -1.2718036e-03 -1.7408605e-03 +3326 6.66 -1.2683266e-03 -1.7361381e-03 +3327 6.662 -1.2648590e-03 -1.7314283e-03 +3328 6.664 -1.2614009e-03 -1.7267311e-03 +3329 6.666 -1.2579521e-03 -1.7220465e-03 +3330 6.668 -1.2545127e-03 -1.7173743e-03 +3331 6.67 -1.2510826e-03 -1.7127146e-03 +3332 6.672 -1.2476618e-03 -1.7080674e-03 +3333 6.674 -1.2442503e-03 -1.7034326e-03 +3334 6.676 -1.2408481e-03 -1.6988102e-03 +3335 6.678 -1.2374551e-03 -1.6942001e-03 +3336 6.68 -1.2340713e-03 -1.6896023e-03 +3337 6.682 -1.2306966e-03 -1.6850168e-03 +3338 6.684 -1.2273312e-03 -1.6804436e-03 +3339 6.686 -1.2239749e-03 -1.6758825e-03 +3340 6.688 -1.2206277e-03 -1.6713337e-03 +3341 6.69 -1.2172895e-03 -1.6667970e-03 +3342 6.692 -1.2139605e-03 -1.6622725e-03 +3343 6.694 -1.2106404e-03 -1.6577600e-03 +3344 6.696 -1.2073294e-03 -1.6532596e-03 +3345 6.698 -1.2040274e-03 -1.6487713e-03 +3346 6.7 -1.2007343e-03 -1.6442949e-03 +3347 6.702 -1.1974502e-03 -1.6398305e-03 +3348 6.704 -1.1941750e-03 -1.6353781e-03 +3349 6.706 -1.1909087e-03 -1.6309376e-03 +3350 6.708 -1.1876512e-03 -1.6265089e-03 +3351 6.71 -1.1844026e-03 -1.6220921e-03 +3352 6.712 -1.1811629e-03 -1.6176871e-03 +3353 6.714 -1.1779319e-03 -1.6132939e-03 +3354 6.716 -1.1747097e-03 -1.6089124e-03 +3355 6.718 -1.1714962e-03 -1.6045427e-03 +3356 6.72 -1.1682915e-03 -1.6001846e-03 +3357 6.722 -1.1650955e-03 -1.5958383e-03 +3358 6.724 -1.1619081e-03 -1.5915035e-03 +3359 6.726 -1.1587294e-03 -1.5871804e-03 +3360 6.728 -1.1555594e-03 -1.5828688e-03 +3361 6.73 -1.1523980e-03 -1.5785688e-03 +3362 6.732 -1.1492451e-03 -1.5742803e-03 +3363 6.734 -1.1461008e-03 -1.5700032e-03 +3364 6.736 -1.1429651e-03 -1.5657376e-03 +3365 6.738 -1.1398379e-03 -1.5614835e-03 +3366 6.74 -1.1367192e-03 -1.5572407e-03 +3367 6.742 -1.1336089e-03 -1.5530093e-03 +3368 6.744 -1.1305071e-03 -1.5487893e-03 +3369 6.746 -1.1274137e-03 -1.5445805e-03 +3370 6.748 -1.1243288e-03 -1.5403830e-03 +3371 6.75 -1.1212522e-03 -1.5361968e-03 +3372 6.752 -1.1181840e-03 -1.5320218e-03 +3373 6.754 -1.1151241e-03 -1.5278580e-03 +3374 6.756 -1.1120725e-03 -1.5237053e-03 +3375 6.758 -1.1090293e-03 -1.5195638e-03 +3376 6.76 -1.1059943e-03 -1.5154333e-03 +3377 6.762 -1.1029675e-03 -1.5113140e-03 +3378 6.764 -1.0999490e-03 -1.5072056e-03 +3379 6.766 -1.0969387e-03 -1.5031083e-03 +3380 6.768 -1.0939366e-03 -1.4990220e-03 +3381 6.77 -1.0909426e-03 -1.4949466e-03 +3382 6.772 -1.0879568e-03 -1.4908822e-03 +3383 6.774 -1.0849791e-03 -1.4868287e-03 +3384 6.776 -1.0820095e-03 -1.4827860e-03 +3385 6.778 -1.0790479e-03 -1.4787542e-03 +3386 6.78 -1.0760944e-03 -1.4747332e-03 +3387 6.782 -1.0731490e-03 -1.4707230e-03 +3388 6.784 -1.0702115e-03 -1.4667235e-03 +3389 6.786 -1.0672821e-03 -1.4627348e-03 +3390 6.788 -1.0643606e-03 -1.4587568e-03 +3391 6.79 -1.0614471e-03 -1.4547894e-03 +3392 6.792 -1.0585414e-03 -1.4508327e-03 +3393 6.794 -1.0556437e-03 -1.4468866e-03 +3394 6.796 -1.0527539e-03 -1.4429511e-03 +3395 6.798 -1.0498719e-03 -1.4390262e-03 +3396 6.8 -1.0469978e-03 -1.4351118e-03 +3397 6.802 -1.0441314e-03 -1.4312079e-03 +3398 6.804 -1.0412729e-03 -1.4273145e-03 +3399 6.806 -1.0384222e-03 -1.4234316e-03 +3400 6.808 -1.0355792e-03 -1.4195591e-03 +3401 6.81 -1.0327439e-03 -1.4156970e-03 +3402 6.812 -1.0299164e-03 -1.4118452e-03 +3403 6.814 -1.0270966e-03 -1.4080038e-03 +3404 6.816 -1.0242844e-03 -1.4041727e-03 +3405 6.818 -1.0214799e-03 -1.4003519e-03 +3406 6.82 -1.0186830e-03 -1.3965414e-03 +3407 6.822 -1.0158937e-03 -1.3927411e-03 +3408 6.824 -1.0131120e-03 -1.3889510e-03 +3409 6.826 -1.0103379e-03 -1.3851711e-03 +3410 6.828 -1.0075713e-03 -1.3814014e-03 +3411 6.83 -1.0048123e-03 -1.3776418e-03 +3412 6.832 -1.0020607e-03 -1.3738923e-03 +3413 6.834 -9.9931668e-04 -1.3701529e-03 +3414 6.836 -9.9658011e-04 -1.3664235e-03 +3415 6.838 -9.9385098e-04 -1.3627042e-03 +3416 6.84 -9.9112928e-04 -1.3589948e-03 +3417 6.842 -9.8841499e-04 -1.3552954e-03 +3418 6.844 -9.8570809e-04 -1.3516060e-03 +3419 6.846 -9.8300856e-04 -1.3479265e-03 +3420 6.848 -9.8031638e-04 -1.3442569e-03 +3421 6.85 -9.7763153e-04 -1.3405972e-03 +3422 6.852 -9.7495399e-04 -1.3369473e-03 +3423 6.854 -9.7228373e-04 -1.3333072e-03 +3424 6.856 -9.6962075e-04 -1.3296769e-03 +3425 6.858 -9.6696502e-04 -1.3260563e-03 +3426 6.86 -9.6431652e-04 -1.3224456e-03 +3427 6.862 -9.6167523e-04 -1.3188445e-03 +3428 6.864 -9.5904114e-04 -1.3152531e-03 +3429 6.866 -9.5641421e-04 -1.3116714e-03 +3430 6.868 -9.5379444e-04 -1.3080993e-03 +3431 6.87 -9.5118181e-04 -1.3045368e-03 +3432 6.872 -9.4857629e-04 -1.3009840e-03 +3433 6.874 -9.4597787e-04 -1.2974406e-03 +3434 6.876 -9.4338652e-04 -1.2939069e-03 +3435 6.878 -9.4080223e-04 -1.2903826e-03 +3436 6.88 -9.3822498e-04 -1.2868678e-03 +3437 6.882 -9.3565476e-04 -1.2833625e-03 +3438 6.884 -9.3309153e-04 -1.2798666e-03 +3439 6.886 -9.3053528e-04 -1.2763801e-03 +3440 6.888 -9.2798600e-04 -1.2729031e-03 +3441 6.89 -9.2544366e-04 -1.2694354e-03 +3442 6.892 -9.2290825e-04 -1.2659770e-03 +3443 6.894 -9.2037975e-04 -1.2625279e-03 +3444 6.896 -9.1785814e-04 -1.2590881e-03 +3445 6.898 -9.1534339e-04 -1.2556576e-03 +3446 6.9 -9.1283550e-04 -1.2522364e-03 +3447 6.902 -9.1033444e-04 -1.2488243e-03 +3448 6.904 -9.0784020e-04 -1.2454215e-03 +3449 6.906 -9.0535275e-04 -1.2420278e-03 +3450 6.908 -9.0287208e-04 -1.2386432e-03 +3451 6.91 -9.0039817e-04 -1.2352678e-03 +3452 6.912 -8.9793100e-04 -1.2319015e-03 +3453 6.914 -8.9547056e-04 -1.2285442e-03 +3454 6.916 -8.9301682e-04 -1.2251960e-03 +3455 6.918 -8.9056977e-04 -1.2218568e-03 +3456 6.92 -8.8812938e-04 -1.2185266e-03 +3457 6.922 -8.8569565e-04 -1.2152054e-03 +3458 6.924 -8.8326856e-04 -1.2118932e-03 +3459 6.926 -8.8084808e-04 -1.2085899e-03 +3460 6.928 -8.7843419e-04 -1.2052954e-03 +3461 6.93 -8.7602689e-04 -1.2020099e-03 +3462 6.932 -8.7362615e-04 -1.1987332e-03 +3463 6.934 -8.7123195e-04 -1.1954654e-03 +3464 6.936 -8.6884428e-04 -1.1922064e-03 +3465 6.938 -8.6646312e-04 -1.1889561e-03 +3466 6.94 -8.6408845e-04 -1.1857147e-03 +3467 6.942 -8.6172025e-04 -1.1824819e-03 +3468 6.944 -8.5935851e-04 -1.1792579e-03 +3469 6.946 -8.5700322e-04 -1.1760426e-03 +3470 6.948 -8.5465434e-04 -1.1728360e-03 +3471 6.95 -8.5231187e-04 -1.1696380e-03 +3472 6.952 -8.4997578e-04 -1.1664486e-03 +3473 6.954 -8.4764607e-04 -1.1632679e-03 +3474 6.956 -8.4532270e-04 -1.1600957e-03 +3475 6.958 -8.4300568e-04 -1.1569321e-03 +3476 6.96 -8.4069497e-04 -1.1537770e-03 +3477 6.962 -8.3839056e-04 -1.1506305e-03 +3478 6.964 -8.3609244e-04 -1.1474924e-03 +3479 6.966 -8.3380059e-04 -1.1443628e-03 +3480 6.968 -8.3151498e-04 -1.1412417e-03 +3481 6.97 -8.2923562e-04 -1.1381290e-03 +3482 6.972 -8.2696246e-04 -1.1350247e-03 +3483 6.974 -8.2469551e-04 -1.1319287e-03 +3484 6.976 -8.2243474e-04 -1.1288412e-03 +3485 6.978 -8.2018014e-04 -1.1257619e-03 +3486 6.98 -8.1793169e-04 -1.1226910e-03 +3487 6.982 -8.1568937e-04 -1.1196284e-03 +3488 6.984 -8.1345317e-04 -1.1165740e-03 +3489 6.986 -8.1122307e-04 -1.1135279e-03 +3490 6.988 -8.0899905e-04 -1.1104900e-03 +3491 6.99 -8.0678110e-04 -1.1074603e-03 +3492 6.992 -8.0456921e-04 -1.1044388e-03 +3493 6.994 -8.0236334e-04 -1.1014255e-03 +3494 6.996 -8.0016350e-04 -1.0984203e-03 +3495 6.998 -7.9796966e-04 -1.0954232e-03 +3496 7.0 -7.9578180e-04 -1.0924343e-03 +3497 7.002 -7.9359991e-04 -1.0894534e-03 +3498 7.004 -7.9142398e-04 -1.0864805e-03 +3499 7.006 -7.8925399e-04 -1.0835157e-03 +3500 7.008 -7.8708991e-04 -1.0805589e-03 +3501 7.01 -7.8493175e-04 -1.0776101e-03 +3502 7.012 -7.8277947e-04 -1.0746693e-03 +3503 7.014 -7.8063306e-04 -1.0717364e-03 +3504 7.016 -7.7849252e-04 -1.0688114e-03 +3505 7.018 -7.7635781e-04 -1.0658944e-03 +3506 7.02 -7.7422893e-04 -1.0629852e-03 +3507 7.022 -7.7210587e-04 -1.0600839e-03 +3508 7.024 -7.6998859e-04 -1.0571904e-03 +3509 7.026 -7.6787710e-04 -1.0543048e-03 +3510 7.028 -7.6577137e-04 -1.0514270e-03 +3511 7.03 -7.6367139e-04 -1.0485569e-03 +3512 7.032 -7.6157714e-04 -1.0456946e-03 +3513 7.034 -7.5948860e-04 -1.0428401e-03 +3514 7.036 -7.5740577e-04 -1.0399932e-03 +3515 7.038 -7.5532862e-04 -1.0371541e-03 +3516 7.04 -7.5325715e-04 -1.0343226e-03 +3517 7.042 -7.5119133e-04 -1.0314988e-03 +3518 7.044 -7.4913115e-04 -1.0286827e-03 +3519 7.046 -7.4707659e-04 -1.0258741e-03 +3520 7.048 -7.4502765e-04 -1.0230732e-03 +3521 7.05 -7.4298430e-04 -1.0202798e-03 +3522 7.052 -7.4094652e-04 -1.0174940e-03 +3523 7.054 -7.3891431e-04 -1.0147158e-03 +3524 7.056 -7.3688765e-04 -1.0119450e-03 +3525 7.058 -7.3486653e-04 -1.0091818e-03 +3526 7.06 -7.3285092e-04 -1.0064260e-03 +3527 7.062 -7.3084082e-04 -1.0036777e-03 +3528 7.064 -7.2883621e-04 -1.0009368e-03 +3529 7.066 -7.2683707e-04 -9.9820331e-04 +3530 7.068 -7.2484339e-04 -9.9547725e-04 +3531 7.07 -7.2285515e-04 -9.9275856e-04 +3532 7.072 -7.2087235e-04 -9.9004724e-04 +3533 7.074 -7.1889496e-04 -9.8734325e-04 +3534 7.076 -7.1692297e-04 -9.8464659e-04 +3535 7.078 -7.1495637e-04 -9.8195722e-04 +3536 7.08 -7.1299514e-04 -9.7927513e-04 +3537 7.082 -7.1103926e-04 -9.7660031e-04 +3538 7.084 -7.0908873e-04 -9.7393273e-04 +3539 7.086 -7.0714353e-04 -9.7127238e-04 +3540 7.088 -7.0520364e-04 -9.6861922e-04 +3541 7.09 -7.0326905e-04 -9.6597325e-04 +3542 7.092 -7.0133974e-04 -9.6333445e-04 +3543 7.094 -6.9941570e-04 -9.6070280e-04 +3544 7.096 -6.9749692e-04 -9.5807827e-04 +3545 7.098 -6.9558339e-04 -9.5546085e-04 +3546 7.1 -6.9367508e-04 -9.5285052e-04 +3547 7.102 -6.9177198e-04 -9.5024727e-04 +3548 7.104 -6.8987408e-04 -9.4765106e-04 +3549 7.106 -6.8798137e-04 -9.4506189e-04 +3550 7.108 -6.8609383e-04 -9.4247973e-04 +3551 7.11 -6.8421145e-04 -9.3990457e-04 +3552 7.112 -6.8233421e-04 -9.3733639e-04 +3553 7.114 -6.8046210e-04 -9.3477516e-04 +3554 7.116 -6.7859510e-04 -9.3222088e-04 +3555 7.118 -6.7673321e-04 -9.2967352e-04 +3556 7.12 -6.7487640e-04 -9.2713306e-04 +3557 7.122 -6.7302467e-04 -9.2459948e-04 +3558 7.124 -6.7117800e-04 -9.2207278e-04 +3559 7.126 -6.6933638e-04 -9.1955292e-04 +3560 7.128 -6.6749978e-04 -9.1703989e-04 +3561 7.13 -6.6566821e-04 -9.1453367e-04 +3562 7.132 -6.6384165e-04 -9.1203425e-04 +3563 7.134 -6.6202007e-04 -9.0954160e-04 +3564 7.136 -6.6020347e-04 -9.0705571e-04 +3565 7.138 -6.5839184e-04 -9.0457656e-04 +3566 7.14 -6.5658516e-04 -9.0210413e-04 +3567 7.142 -6.5478342e-04 -8.9963841e-04 +3568 7.144 -6.5298661e-04 -8.9717937e-04 +3569 7.146 -6.5119470e-04 -8.9472700e-04 +3570 7.148 -6.4940769e-04 -8.9228128e-04 +3571 7.15 -6.4762557e-04 -8.8984219e-04 +3572 7.152 -6.4584832e-04 -8.8740971e-04 +3573 7.154 -6.4407593e-04 -8.8498384e-04 +3574 7.156 -6.4230838e-04 -8.8256454e-04 +3575 7.158 -6.4054567e-04 -8.8015180e-04 +3576 7.16 -6.3878777e-04 -8.7774561e-04 +3577 7.162 -6.3703468e-04 -8.7534595e-04 +3578 7.164 -6.3528638e-04 -8.7295279e-04 +3579 7.166 -6.3354286e-04 -8.7056613e-04 +3580 7.168 -6.3180411e-04 -8.6818595e-04 +3581 7.17 -6.3007011e-04 -8.6581222e-04 +3582 7.172 -6.2834086e-04 -8.6344493e-04 +3583 7.174 -6.2661633e-04 -8.6108406e-04 +3584 7.176 -6.2489652e-04 -8.5872960e-04 +3585 7.178 -6.2318141e-04 -8.5638153e-04 +3586 7.18 -6.2147099e-04 -8.5403983e-04 +3587 7.182 -6.1976524e-04 -8.5170448e-04 +3588 7.184 -6.1806417e-04 -8.4937548e-04 +3589 7.186 -6.1636774e-04 -8.4705279e-04 +3590 7.188 -6.1467595e-04 -8.4473641e-04 +3591 7.19 -6.1298879e-04 -8.4242631e-04 +3592 7.192 -6.1130624e-04 -8.4012249e-04 +3593 7.194 -6.0962829e-04 -8.3782492e-04 +3594 7.196 -6.0795494e-04 -8.3553358e-04 +3595 7.198 -6.0628616e-04 -8.3324847e-04 +3596 7.2 -6.0462194e-04 -8.3096956e-04 +3597 7.202 -6.0296227e-04 -8.2869684e-04 +3598 7.204 -6.0130715e-04 -8.2643028e-04 +3599 7.206 -5.9965655e-04 -8.2416988e-04 +3600 7.208 -5.9801046e-04 -8.2191562e-04 +3601 7.21 -5.9636888e-04 -8.1966748e-04 +3602 7.212 -5.9473179e-04 -8.1742544e-04 +3603 7.214 -5.9309918e-04 -8.1518950e-04 +3604 7.216 -5.9147103e-04 -8.1295962e-04 +3605 7.218 -5.8984733e-04 -8.1073580e-04 +3606 7.22 -5.8822808e-04 -8.0851802e-04 +3607 7.222 -5.8661326e-04 -8.0630626e-04 +3608 7.224 -5.8500285e-04 -8.0410051e-04 +3609 7.226 -5.8339685e-04 -8.0190076e-04 +3610 7.228 -5.8179524e-04 -7.9970697e-04 +3611 7.23 -5.8019802e-04 -7.9751915e-04 +3612 7.232 -5.7860516e-04 -7.9533727e-04 +3613 7.234 -5.7701667e-04 -7.9316132e-04 +3614 7.236 -5.7543251e-04 -7.9099127e-04 +3615 7.238 -5.7385270e-04 -7.8882713e-04 +3616 7.24 -5.7227720e-04 -7.8666886e-04 +3617 7.242 -5.7070602e-04 -7.8451646e-04 +3618 7.244 -5.6913913e-04 -7.8236991e-04 +3619 7.246 -5.6757653e-04 -7.8022919e-04 +3620 7.248 -5.6601821e-04 -7.7809428e-04 +3621 7.25 -5.6446415e-04 -7.7596518e-04 +3622 7.252 -5.6291435e-04 -7.7384186e-04 +3623 7.254 -5.6136878e-04 -7.7172432e-04 +3624 7.256 -5.5982745e-04 -7.6961253e-04 +3625 7.258 -5.5829033e-04 -7.6750648e-04 +3626 7.26 -5.5675742e-04 -7.6540615e-04 +3627 7.262 -5.5522870e-04 -7.6331153e-04 +3628 7.264 -5.5370417e-04 -7.6122261e-04 +3629 7.266 -5.5218381e-04 -7.5913936e-04 +3630 7.268 -5.5066761e-04 -7.5706178e-04 +3631 7.27 -5.4915555e-04 -7.5498984e-04 +3632 7.272 -5.4764764e-04 -7.5292354e-04 +3633 7.274 -5.4614386e-04 -7.5086286e-04 +3634 7.276 -5.4464419e-04 -7.4880777e-04 +3635 7.278 -5.4314862e-04 -7.4675828e-04 +3636 7.28 -5.4165715e-04 -7.4471436e-04 +3637 7.282 -5.4016976e-04 -7.4267599e-04 +3638 7.284 -5.3868644e-04 -7.4064317e-04 +3639 7.286 -5.3720718e-04 -7.3861588e-04 +3640 7.288 -5.3573198e-04 -7.3659410e-04 +3641 7.29 -5.3426080e-04 -7.3457782e-04 +3642 7.292 -5.3279366e-04 -7.3256702e-04 +3643 7.294 -5.3133053e-04 -7.3056169e-04 +3644 7.296 -5.2987141e-04 -7.2856181e-04 +3645 7.298 -5.2841628e-04 -7.2656738e-04 +3646 7.3 -5.2696514e-04 -7.2457836e-04 +3647 7.302 -5.2551796e-04 -7.2259476e-04 +3648 7.304 -5.2407475e-04 -7.2061656e-04 +3649 7.306 -5.2263549e-04 -7.1864373e-04 +3650 7.308 -5.2120018e-04 -7.1667628e-04 +3651 7.31 -5.1976879e-04 -7.1471417e-04 +3652 7.312 -5.1834132e-04 -7.1275740e-04 +3653 7.314 -5.1691775e-04 -7.1080596e-04 +3654 7.316 -5.1549809e-04 -7.0885983e-04 +3655 7.318 -5.1408231e-04 -7.0691899e-04 +3656 7.32 -5.1267041e-04 -7.0498343e-04 +3657 7.322 -5.1126237e-04 -7.0305314e-04 +3658 7.324 -5.0985819e-04 -7.0112810e-04 +3659 7.326 -5.0845786e-04 -6.9920830e-04 +3660 7.328 -5.0706136e-04 -6.9729373e-04 +3661 7.33 -5.0566868e-04 -6.9538436e-04 +3662 7.332 -5.0427982e-04 -6.9348019e-04 +3663 7.334 -5.0289475e-04 -6.9158121e-04 +3664 7.336 -5.0151349e-04 -6.8968739e-04 +3665 7.338 -5.0013600e-04 -6.8779872e-04 +3666 7.34 -4.9876229e-04 -6.8591520e-04 +3667 7.342 -4.9739234e-04 -6.8403681e-04 +3668 7.344 -4.9602614e-04 -6.8216352e-04 +3669 7.346 -4.9466368e-04 -6.8029534e-04 +3670 7.348 -4.9330495e-04 -6.7843224e-04 +3671 7.35 -4.9194995e-04 -6.7657422e-04 +3672 7.352 -4.9059865e-04 -6.7472125e-04 +3673 7.354 -4.8925106e-04 -6.7287333e-04 +3674 7.356 -4.8790716e-04 -6.7103044e-04 +3675 7.358 -4.8656693e-04 -6.6919256e-04 +3676 7.36 -4.8523038e-04 -6.6735969e-04 +3677 7.362 -4.8389749e-04 -6.6553182e-04 +3678 7.364 -4.8256825e-04 -6.6370891e-04 +3679 7.366 -4.8124265e-04 -6.6189098e-04 +3680 7.368 -4.7992068e-04 -6.6007799e-04 +3681 7.37 -4.7860234e-04 -6.5826994e-04 +3682 7.372 -4.7728760e-04 -6.5646681e-04 +3683 7.374 -4.7597647e-04 -6.5466860e-04 +3684 7.376 -4.7466892e-04 -6.5287528e-04 +3685 7.378 -4.7336496e-04 -6.5108685e-04 +3686 7.38 -4.7206457e-04 -6.4930328e-04 +3687 7.382 -4.7076775e-04 -6.4752458e-04 +3688 7.384 -4.6947447e-04 -6.4575072e-04 +3689 7.386 -4.6818474e-04 -6.4398169e-04 +3690 7.388 -4.6689854e-04 -6.4221748e-04 +3691 7.39 -4.6561587e-04 -6.4045808e-04 +3692 7.392 -4.6433671e-04 -6.3870347e-04 +3693 7.394 -4.6306105e-04 -6.3695364e-04 +3694 7.396 -4.6178889e-04 -6.3520858e-04 +3695 7.398 -4.6052021e-04 -6.3346827e-04 +3696 7.4 -4.5925501e-04 -6.3173270e-04 +3697 7.402 -4.5799328e-04 -6.3000186e-04 +3698 7.404 -4.5673500e-04 -6.2827574e-04 +3699 7.406 -4.5548017e-04 -6.2655432e-04 +3700 7.408 -4.5422878e-04 -6.2483760e-04 +3701 7.41 -4.5298082e-04 -6.2312555e-04 +3702 7.412 -4.5173628e-04 -6.2141816e-04 +3703 7.414 -4.5049514e-04 -6.1971543e-04 +3704 7.416 -4.4925741e-04 -6.1801734e-04 +3705 7.418 -4.4802307e-04 -6.1632387e-04 +3706 7.42 -4.4679211e-04 -6.1463502e-04 +3707 7.422 -4.4556453e-04 -6.1295078e-04 +3708 7.424 -4.4434031e-04 -6.1127112e-04 +3709 7.426 -4.4311944e-04 -6.0959605e-04 +3710 7.428 -4.4190192e-04 -6.0792553e-04 +3711 7.43 -4.4068773e-04 -6.0625958e-04 +3712 7.432 -4.3947688e-04 -6.0459816e-04 +3713 7.434 -4.3826934e-04 -6.0294127e-04 +3714 7.436 -4.3706511e-04 -6.0128890e-04 +3715 7.438 -4.3586418e-04 -5.9964103e-04 +3716 7.44 -4.3466654e-04 -5.9799766e-04 +3717 7.442 -4.3347219e-04 -5.9635877e-04 +3718 7.444 -4.3228110e-04 -5.9472434e-04 +3719 7.446 -4.3109329e-04 -5.9309437e-04 +3720 7.448 -4.2990872e-04 -5.9146884e-04 +3721 7.45 -4.2872741e-04 -5.8984775e-04 +3722 7.452 -4.2754933e-04 -5.8823108e-04 +3723 7.454 -4.2637448e-04 -5.8661881e-04 +3724 7.456 -4.2520285e-04 -5.8501094e-04 +3725 7.458 -4.2403443e-04 -5.8340746e-04 +3726 7.46 -4.2286922e-04 -5.8180835e-04 +3727 7.462 -4.2170720e-04 -5.8021360e-04 +3728 7.464 -4.2054836e-04 -5.7862319e-04 +3729 7.466 -4.1939270e-04 -5.7703713e-04 +3730 7.468 -4.1824021e-04 -5.7545539e-04 +3731 7.47 -4.1709088e-04 -5.7387797e-04 +3732 7.472 -4.1594470e-04 -5.7230484e-04 +3733 7.474 -4.1480166e-04 -5.7073601e-04 +3734 7.476 -4.1366175e-04 -5.6917146e-04 +3735 7.478 -4.1252497e-04 -5.6761117e-04 +3736 7.48 -4.1139130e-04 -5.6605515e-04 +3737 7.482 -4.1026074e-04 -5.6450336e-04 +3738 7.484 -4.0913329e-04 -5.6295581e-04 +3739 7.486 -4.0800892e-04 -5.6141248e-04 +3740 7.488 -4.0688763e-04 -5.5987336e-04 +3741 7.49 -4.0576942e-04 -5.5833844e-04 +3742 7.492 -4.0465428e-04 -5.5680771e-04 +3743 7.494 -4.0354219e-04 -5.5528115e-04 +3744 7.496 -4.0243315e-04 -5.5375876e-04 +3745 7.498 -4.0132715e-04 -5.5224052e-04 +3746 7.5 -4.0022418e-04 -5.5072642e-04 +3747 7.502 -3.9912424e-04 -5.4921646e-04 +3748 7.504 -3.9802732e-04 -5.4771061e-04 +3749 7.506 -3.9693340e-04 -5.4620888e-04 +3750 7.508 -3.9584248e-04 -5.4471124e-04 +3751 7.51 -3.9475455e-04 -5.4321769e-04 +3752 7.512 -3.9366960e-04 -5.4172821e-04 +3753 7.514 -3.9258763e-04 -5.4024280e-04 +3754 7.516 -3.9150863e-04 -5.3876145e-04 +3755 7.518 -3.9043258e-04 -5.3728413e-04 +3756 7.52 -3.8935949e-04 -5.3581085e-04 +3757 7.522 -3.8828934e-04 -5.3434159e-04 +3758 7.524 -3.8722212e-04 -5.3287634e-04 +3759 7.526 -3.8615783e-04 -5.3141509e-04 +3760 7.528 -3.8509646e-04 -5.2995783e-04 +3761 7.53 -3.8403800e-04 -5.2850454e-04 +3762 7.532 -3.8298244e-04 -5.2705522e-04 +3763 7.534 -3.8192977e-04 -5.2560986e-04 +3764 7.536 -3.8088000e-04 -5.2416844e-04 +3765 7.538 -3.7983310e-04 -5.2273096e-04 +3766 7.54 -3.7878907e-04 -5.2129740e-04 +3767 7.542 -3.7774790e-04 -5.1986776e-04 +3768 7.544 -3.7670960e-04 -5.1844202e-04 +3769 7.546 -3.7567413e-04 -5.1702017e-04 +3770 7.548 -3.7464151e-04 -5.1560220e-04 +3771 7.55 -3.7361172e-04 -5.1418811e-04 +3772 7.552 -3.7258476e-04 -5.1277787e-04 +3773 7.554 -3.7156061e-04 -5.1137149e-04 +3774 7.556 -3.7053927e-04 -5.0996894e-04 +3775 7.558 -3.6952073e-04 -5.0857023e-04 +3776 7.56 -3.6850499e-04 -5.0717533e-04 +3777 7.562 -3.6749203e-04 -5.0578425e-04 +3778 7.564 -3.6648185e-04 -5.0439696e-04 +3779 7.566 -3.6547444e-04 -5.0301346e-04 +3780 7.568 -3.6446979e-04 -5.0163374e-04 +3781 7.57 -3.6346790e-04 -5.0025779e-04 +3782 7.572 -3.6246876e-04 -4.9888559e-04 +3783 7.574 -3.6147235e-04 -4.9751715e-04 +3784 7.576 -3.6047868e-04 -4.9615243e-04 +3785 7.578 -3.5948774e-04 -4.9479145e-04 +3786 7.58 -3.5849952e-04 -4.9343419e-04 +3787 7.582 -3.5751400e-04 -4.9208063e-04 +3788 7.584 -3.5653119e-04 -4.9073077e-04 +3789 7.586 -3.5555108e-04 -4.8938459e-04 +3790 7.588 -3.5457365e-04 -4.8804209e-04 +3791 7.59 -3.5359891e-04 -4.8670326e-04 +3792 7.592 -3.5262683e-04 -4.8536809e-04 +3793 7.594 -3.5165743e-04 -4.8403656e-04 +3794 7.596 -3.5069069e-04 -4.8270868e-04 +3795 7.598 -3.4972659e-04 -4.8138442e-04 +3796 7.6 -3.4876515e-04 -4.8006377e-04 +3797 7.602 -3.4780634e-04 -4.7874674e-04 +3798 7.604 -3.4685016e-04 -4.7743330e-04 +3799 7.606 -3.4589660e-04 -4.7612345e-04 +3800 7.608 -3.4494566e-04 -4.7481718e-04 +3801 7.61 -3.4399733e-04 -4.7351448e-04 +3802 7.612 -3.4305160e-04 -4.7221534e-04 +3803 7.614 -3.4210847e-04 -4.7091975e-04 +3804 7.616 -3.4116792e-04 -4.6962770e-04 +3805 7.618 -3.4022995e-04 -4.6833917e-04 +3806 7.62 -3.3929456e-04 -4.6705417e-04 +3807 7.622 -3.3836173e-04 -4.6577268e-04 +3808 7.624 -3.3743147e-04 -4.6449470e-04 +3809 7.626 -3.3650375e-04 -4.6322020e-04 +3810 7.628 -3.3557858e-04 -4.6194919e-04 +3811 7.63 -3.3465595e-04 -4.6068165e-04 +3812 7.632 -3.3373585e-04 -4.5941758e-04 +3813 7.634 -3.3281828e-04 -4.5815696e-04 +3814 7.636 -3.3190322e-04 -4.5689978e-04 +3815 7.638 -3.3099068e-04 -4.5564605e-04 +3816 7.64 -3.3008064e-04 -4.5439573e-04 +3817 7.642 -3.2917309e-04 -4.5314884e-04 +3818 7.644 -3.2826804e-04 -4.5190535e-04 +3819 7.646 -3.2736547e-04 -4.5066527e-04 +3820 7.648 -3.2646538e-04 -4.4942857e-04 +3821 7.65 -3.2556775e-04 -4.4819525e-04 +3822 7.652 -3.2467259e-04 -4.4696530e-04 +3823 7.654 -3.2377989e-04 -4.4573872e-04 +3824 7.656 -3.2288964e-04 -4.4451549e-04 +3825 7.658 -3.2200183e-04 -4.4329560e-04 +3826 7.66 -3.2111645e-04 -4.4207905e-04 +3827 7.662 -3.2023351e-04 -4.4086582e-04 +3828 7.664 -3.1935299e-04 -4.3965591e-04 +3829 7.666 -3.1847488e-04 -4.3844931e-04 +3830 7.668 -3.1759919e-04 -4.3724601e-04 +3831 7.67 -3.1672590e-04 -4.3604600e-04 +3832 7.672 -3.1585500e-04 -4.3484926e-04 +3833 7.674 -3.1498650e-04 -4.3365580e-04 +3834 7.676 -3.1412038e-04 -4.3246561e-04 +3835 7.678 -3.1325663e-04 -4.3127866e-04 +3836 7.68 -3.1239526e-04 -4.3009497e-04 +3837 7.682 -3.1153625e-04 -4.2891451e-04 +3838 7.684 -3.1067960e-04 -4.2773727e-04 +3839 7.686 -3.0982530e-04 -4.2656326e-04 +3840 7.688 -3.0897334e-04 -4.2539246e-04 +3841 7.69 -3.0812373e-04 -4.2422485e-04 +3842 7.692 -3.0727644e-04 -4.2306045e-04 +3843 7.694 -3.0643148e-04 -4.2189922e-04 +3844 7.696 -3.0558884e-04 -4.2074117e-04 +3845 7.698 -3.0474852e-04 -4.1958629e-04 +3846 7.7 -3.0391050e-04 -4.1843457e-04 +3847 7.702 -3.0307478e-04 -4.1728599e-04 +3848 7.704 -3.0224135e-04 -4.1614056e-04 +3849 7.706 -3.0141021e-04 -4.1499826e-04 +3850 7.708 -3.0058135e-04 -4.1385909e-04 +3851 7.71 -2.9975477e-04 -4.1272303e-04 +3852 7.712 -2.9893046e-04 -4.1159008e-04 +3853 7.714 -2.9810841e-04 -4.1046023e-04 +3854 7.716 -2.9728862e-04 -4.0933346e-04 +3855 7.718 -2.9647107e-04 -4.0820978e-04 +3856 7.72 -2.9565578e-04 -4.0708918e-04 +3857 7.722 -2.9484272e-04 -4.0597164e-04 +3858 7.724 -2.9403189e-04 -4.0485715e-04 +3859 7.726 -2.9322329e-04 -4.0374572e-04 +3860 7.728 -2.9241690e-04 -4.0263732e-04 +3861 7.73 -2.9161273e-04 -4.0153196e-04 +3862 7.732 -2.9081077e-04 -4.0042962e-04 +3863 7.734 -2.9001101e-04 -3.9933030e-04 +3864 7.736 -2.8921345e-04 -3.9823398e-04 +3865 7.738 -2.8841808e-04 -3.9714067e-04 +3866 7.74 -2.8762488e-04 -3.9605034e-04 +3867 7.742 -2.8683387e-04 -3.9496300e-04 +3868 7.744 -2.8604503e-04 -3.9387864e-04 +3869 7.746 -2.8525836e-04 -3.9279724e-04 +3870 7.748 -2.8447384e-04 -3.9171880e-04 +3871 7.75 -2.8369148e-04 -3.9064331e-04 +3872 7.752 -2.8291126e-04 -3.8957076e-04 +3873 7.754 -2.8213319e-04 -3.8850115e-04 +3874 7.756 -2.8135726e-04 -3.8743446e-04 +3875 7.758 -2.8058345e-04 -3.8637070e-04 +3876 7.76 -2.7981177e-04 -3.8530984e-04 +3877 7.762 -2.7904221e-04 -3.8425189e-04 +3878 7.764 -2.7827476e-04 -3.8319683e-04 +3879 7.766 -2.7750942e-04 -3.8214466e-04 +3880 7.768 -2.7674618e-04 -3.8109537e-04 +3881 7.77 -2.7598504e-04 -3.8004895e-04 +3882 7.772 -2.7522599e-04 -3.7900540e-04 +3883 7.774 -2.7446902e-04 -3.7796470e-04 +3884 7.776 -2.7371413e-04 -3.7692685e-04 +3885 7.778 -2.7296131e-04 -3.7589184e-04 +3886 7.78 -2.7221056e-04 -3.7485966e-04 +3887 7.782 -2.7146187e-04 -3.7383031e-04 +3888 7.784 -2.7071523e-04 -3.7280377e-04 +3889 7.786 -2.6997065e-04 -3.7178005e-04 +3890 7.788 -2.6922811e-04 -3.7075913e-04 +3891 7.79 -2.6848761e-04 -3.6974100e-04 +3892 7.792 -2.6774914e-04 -3.6872566e-04 +3893 7.794 -2.6701271e-04 -3.6771309e-04 +3894 7.796 -2.6627829e-04 -3.6670330e-04 +3895 7.798 -2.6554589e-04 -3.6569628e-04 +3896 7.8 -2.6481550e-04 -3.6469201e-04 +3897 7.802 -2.6408712e-04 -3.6369049e-04 +3898 7.804 -2.6336074e-04 -3.6269171e-04 +3899 7.806 -2.6263635e-04 -3.6169566e-04 +3900 7.808 -2.6191396e-04 -3.6070235e-04 +3901 7.81 -2.6119354e-04 -3.5971175e-04 +3902 7.812 -2.6047511e-04 -3.5872386e-04 +3903 7.814 -2.5975864e-04 -3.5773868e-04 +3904 7.816 -2.5904415e-04 -3.5675620e-04 +3905 7.818 -2.5833162e-04 -3.5577640e-04 +3906 7.82 -2.5762104e-04 -3.5479929e-04 +3907 7.822 -2.5691242e-04 -3.5382485e-04 +3908 7.824 -2.5620574e-04 -3.5285308e-04 +3909 7.826 -2.5550100e-04 -3.5188398e-04 +3910 7.828 -2.5479820e-04 -3.5091752e-04 +3911 7.83 -2.5409733e-04 -3.4995371e-04 +3912 7.832 -2.5339839e-04 -3.4899255e-04 +3913 7.834 -2.5270136e-04 -3.4803401e-04 +3914 7.836 -2.5200625e-04 -3.4707810e-04 +3915 7.838 -2.5131305e-04 -3.4612480e-04 +3916 7.84 -2.5062175e-04 -3.4517412e-04 +3917 7.842 -2.4993235e-04 -3.4422604e-04 +3918 7.844 -2.4924484e-04 -3.4328055e-04 +3919 7.846 -2.4855922e-04 -3.4233766e-04 +3920 7.848 -2.4787549e-04 -3.4139735e-04 +3921 7.85 -2.4719363e-04 -3.4045961e-04 +3922 7.852 -2.4651365e-04 -3.3952444e-04 +3923 7.854 -2.4583553e-04 -3.3859183e-04 +3924 7.856 -2.4515928e-04 -3.3766178e-04 +3925 7.858 -2.4448489e-04 -3.3673427e-04 +3926 7.86 -2.4381234e-04 -3.3580931e-04 +3927 7.862 -2.4314165e-04 -3.3488687e-04 +3928 7.864 -2.4247279e-04 -3.3396697e-04 +3929 7.866 -2.4180578e-04 -3.3304958e-04 +3930 7.868 -2.4114059e-04 -3.3213470e-04 +3931 7.87 -2.4047724e-04 -3.3122234e-04 +3932 7.872 -2.3981570e-04 -3.3031247e-04 +3933 7.874 -2.3915599e-04 -3.2940509e-04 +3934 7.876 -2.3849808e-04 -3.2850020e-04 +3935 7.878 -2.3784198e-04 -3.2759779e-04 +3936 7.88 -2.3718769e-04 -3.2669784e-04 +3937 7.882 -2.3653519e-04 -3.2580037e-04 +3938 7.884 -2.3588448e-04 -3.2490535e-04 +3939 7.886 -2.3523557e-04 -3.2401279e-04 +3940 7.888 -2.3458843e-04 -3.2312267e-04 +3941 7.89 -2.3394307e-04 -3.2223498e-04 +3942 7.892 -2.3329949e-04 -3.2134973e-04 +3943 7.894 -2.3265767e-04 -3.2046691e-04 +3944 7.896 -2.3201762e-04 -3.1958650e-04 +3945 7.898 -2.3137933e-04 -3.1870851e-04 +3946 7.9 -2.3074279e-04 -3.1783292e-04 +3947 7.902 -2.3010799e-04 -3.1695973e-04 +3948 7.904 -2.2947494e-04 -3.1608894e-04 +3949 7.906 -2.2884364e-04 -3.1522052e-04 +3950 7.908 -2.2821406e-04 -3.1435449e-04 +3951 7.91 -2.2758622e-04 -3.1349083e-04 +3952 7.912 -2.2696010e-04 -3.1262954e-04 +3953 7.914 -2.2633570e-04 -3.1177061e-04 +3954 7.916 -2.2571301e-04 -3.1091403e-04 +3955 7.918 -2.2509204e-04 -3.1005980e-04 +3956 7.92 -2.2447277e-04 -3.0920790e-04 +3957 7.922 -2.2385521e-04 -3.0835835e-04 +3958 7.924 -2.2323934e-04 -3.0751112e-04 +3959 7.926 -2.2262516e-04 -3.0666621e-04 +3960 7.928 -2.2201267e-04 -3.0582362e-04 +3961 7.93 -2.2140186e-04 -3.0498333e-04 +3962 7.932 -2.2079273e-04 -3.0414535e-04 +3963 7.934 -2.2018528e-04 -3.0330967e-04 +3964 7.936 -2.1957949e-04 -3.0247627e-04 +3965 7.938 -2.1897537e-04 -3.0164516e-04 +3966 7.94 -2.1837291e-04 -3.0081633e-04 +3967 7.942 -2.1777211e-04 -2.9998977e-04 +3968 7.944 -2.1717295e-04 -2.9916548e-04 +3969 7.946 -2.1657544e-04 -2.9834344e-04 +3970 7.948 -2.1597958e-04 -2.9752365e-04 +3971 7.95 -2.1538535e-04 -2.9670612e-04 +3972 7.952 -2.1479275e-04 -2.9589082e-04 +3973 7.954 -2.1420178e-04 -2.9507776e-04 +3974 7.956 -2.1361244e-04 -2.9426693e-04 +3975 7.958 -2.1302471e-04 -2.9345832e-04 +3976 7.96 -2.1243860e-04 -2.9265192e-04 +3977 7.962 -2.1185410e-04 -2.9184774e-04 +3978 7.964 -2.1127121e-04 -2.9104576e-04 +3979 7.966 -2.1068992e-04 -2.9024598e-04 +3980 7.968 -2.1011023e-04 -2.8944839e-04 +3981 7.97 -2.0953212e-04 -2.8865298e-04 +3982 7.972 -2.0895561e-04 -2.8785976e-04 +3983 7.974 -2.0838068e-04 -2.8706871e-04 +3984 7.976 -2.0780734e-04 -2.8627983e-04 +3985 7.978 -2.0723556e-04 -2.8549311e-04 +3986 7.98 -2.0666536e-04 -2.8470855e-04 +3987 7.982 -2.0609673e-04 -2.8392614e-04 +3988 7.984 -2.0552966e-04 -2.8314588e-04 +3989 7.986 -2.0496414e-04 -2.8236775e-04 +3990 7.988 -2.0440018e-04 -2.8159176e-04 +3991 7.99 -2.0383777e-04 -2.8081789e-04 +3992 7.992 -2.0327691e-04 -2.8004615e-04 +3993 7.994 -2.0271759e-04 -2.7927652e-04 +3994 7.996 -2.0215980e-04 -2.7850900e-04 +3995 7.998 -2.0160355e-04 -2.7774359e-04 +3996 8.0 -2.0104883e-04 -2.7698027e-04 +3997 8.002 -2.0049563e-04 -2.7621905e-04 +3998 8.004 -1.9994395e-04 -2.7545991e-04 +3999 8.006 -1.9939379e-04 -2.7470286e-04 +4000 8.008 -1.9884514e-04 -2.7394788e-04 +4001 8.01 -1.9829799e-04 -2.7319497e-04 +4002 8.012 -1.9775236e-04 -2.7244413e-04 +4003 8.014 -1.9720822e-04 -2.7169534e-04 +4004 8.016 -1.9666557e-04 -2.7094861e-04 +4005 8.018 -1.9612442e-04 -2.7020393e-04 +4006 8.02 -1.9558476e-04 -2.6946128e-04 +4007 8.022 -1.9504657e-04 -2.6872068e-04 +4008 8.024 -1.9450987e-04 -2.6798210e-04 +4009 8.026 -1.9397464e-04 -2.6724555e-04 +4010 8.028 -1.9344089e-04 -2.6651102e-04 +4011 8.03 -1.9290860e-04 -2.6577850e-04 +4012 8.032 -1.9237777e-04 -2.6504800e-04 +4013 8.034 -1.9184841e-04 -2.6431949e-04 +4014 8.036 -1.9132049e-04 -2.6359299e-04 +4015 8.038 -1.9079403e-04 -2.6286847e-04 +4016 8.04 -1.9026902e-04 -2.6214594e-04 +4017 8.042 -1.8974545e-04 -2.6142540e-04 +4018 8.044 -1.8922332e-04 -2.6070683e-04 +4019 8.046 -1.8870262e-04 -2.5999023e-04 +4020 8.048 -1.8818335e-04 -2.5927560e-04 +4021 8.05 -1.8766552e-04 -2.5856292e-04 +4022 8.052 -1.8714910e-04 -2.5785220e-04 +4023 8.054 -1.8663411e-04 -2.5714343e-04 +4024 8.056 -1.8612053e-04 -2.5643661e-04 +4025 8.058 -1.8560836e-04 -2.5573172e-04 +4026 8.06 -1.8509760e-04 -2.5502876e-04 +4027 8.062 -1.8458824e-04 -2.5432774e-04 +4028 8.064 -1.8408028e-04 -2.5362863e-04 +4029 8.066 -1.8357373e-04 -2.5293145e-04 +4030 8.068 -1.8306856e-04 -2.5223617e-04 +4031 8.07 -1.8256478e-04 -2.5154281e-04 +4032 8.072 -1.8206239e-04 -2.5085134e-04 +4033 8.074 -1.8156137e-04 -2.5016177e-04 +4034 8.076 -1.8106174e-04 -2.4947410e-04 +4035 8.078 -1.8056347e-04 -2.4878831e-04 +4036 8.08 -1.8006658e-04 -2.4810440e-04 +4037 8.082 -1.7957106e-04 -2.4742237e-04 +4038 8.084 -1.7907689e-04 -2.4674220e-04 +4039 8.086 -1.7858409e-04 -2.4606391e-04 +4040 8.088 -1.7809263e-04 -2.4538747e-04 +4041 8.09 -1.7760253e-04 -2.4471289e-04 +4042 8.092 -1.7711378e-04 -2.4404016e-04 +4043 8.094 -1.7662637e-04 -2.4336928e-04 +4044 8.096 -1.7614030e-04 -2.4270023e-04 +4045 8.098 -1.7565557e-04 -2.4203302e-04 +4046 8.1 -1.7517217e-04 -2.4136765e-04 +4047 8.102 -1.7469010e-04 -2.4070409e-04 +4048 8.104 -1.7420935e-04 -2.4004236e-04 +4049 8.106 -1.7372993e-04 -2.3938244e-04 +4050 8.108 -1.7325182e-04 -2.3872434e-04 +4051 8.11 -1.7277503e-04 -2.3806804e-04 +4052 8.112 -1.7229955e-04 -2.3741354e-04 +4053 8.114 -1.7182537e-04 -2.3676083e-04 +4054 8.116 -1.7135250e-04 -2.3610992e-04 +4055 8.118 -1.7088093e-04 -2.3546079e-04 +4056 8.12 -1.7041066e-04 -2.3481344e-04 +4057 8.122 -1.6994168e-04 -2.3416787e-04 +4058 8.124 -1.6947399e-04 -2.3352407e-04 +4059 8.126 -1.6900758e-04 -2.3288204e-04 +4060 8.128 -1.6854246e-04 -2.3224177e-04 +4061 8.13 -1.6807861e-04 -2.3160326e-04 +4062 8.132 -1.6761604e-04 -2.3096649e-04 +4063 8.134 -1.6715475e-04 -2.3033148e-04 +4064 8.136 -1.6669472e-04 -2.2969821e-04 +4065 8.138 -1.6623595e-04 -2.2906667e-04 +4066 8.14 -1.6577845e-04 -2.2843687e-04 +4067 8.142 -1.6532220e-04 -2.2780879e-04 +4068 8.144 -1.6486721e-04 -2.2718244e-04 +4069 8.146 -1.6441347e-04 -2.2655781e-04 +4070 8.148 -1.6396098e-04 -2.2593489e-04 +4071 8.15 -1.6350973e-04 -2.2531369e-04 +4072 8.152 -1.6305972e-04 -2.2469418e-04 +4073 8.154 -1.6261095e-04 -2.2407638e-04 +4074 8.156 -1.6216342e-04 -2.2346027e-04 +4075 8.158 -1.6171711e-04 -2.2284585e-04 +4076 8.16 -1.6127203e-04 -2.2223312e-04 +4077 8.162 -1.6082818e-04 -2.2162207e-04 +4078 8.164 -1.6038554e-04 -2.2101270e-04 +4079 8.166 -1.5994413e-04 -2.2040500e-04 +4080 8.168 -1.5950392e-04 -2.1979896e-04 +4081 8.17 -1.5906493e-04 -2.1919460e-04 +4082 8.172 -1.5862714e-04 -2.1859188e-04 +4083 8.174 -1.5819056e-04 -2.1799083e-04 +4084 8.176 -1.5775518e-04 -2.1739142e-04 +4085 8.178 -1.5732099e-04 -2.1679366e-04 +4086 8.18 -1.5688800e-04 -2.1619754e-04 +4087 8.182 -1.5645620e-04 -2.1560305e-04 +4088 8.184 -1.5602559e-04 -2.1501020e-04 +4089 8.186 -1.5559616e-04 -2.1441897e-04 +4090 8.188 -1.5516791e-04 -2.1382937e-04 +4091 8.19 -1.5474084e-04 -2.1324138e-04 +4092 8.192 -1.5431495e-04 -2.1265501e-04 +4093 8.194 -1.5389022e-04 -2.1207025e-04 +4094 8.196 -1.5346666e-04 -2.1148709e-04 +4095 8.198 -1.5304427e-04 -2.1090553e-04 +4096 8.2 -1.5262304e-04 -2.1032557e-04 +4097 8.202 -1.5220297e-04 -2.0974721e-04 +4098 8.204 -1.5178405e-04 -2.0917043e-04 +4099 8.206 -1.5136629e-04 -2.0859523e-04 +4100 8.208 -1.5094967e-04 -2.0802161e-04 +4101 8.21 -1.5053420e-04 -2.0744957e-04 +4102 8.212 -1.5011987e-04 -2.0687909e-04 +4103 8.214 -1.4970668e-04 -2.0631018e-04 +4104 8.216 -1.4929463e-04 -2.0574284e-04 +4105 8.218 -1.4888371e-04 -2.0517705e-04 +4106 8.22 -1.4847392e-04 -2.0461281e-04 +4107 8.222 -1.4806526e-04 -2.0405013e-04 +4108 8.224 -1.4765772e-04 -2.0348899e-04 +4109 8.226 -1.4725130e-04 -2.0292938e-04 +4110 8.228 -1.4684600e-04 -2.0237132e-04 +4111 8.23 -1.4644181e-04 -2.0181479e-04 +4112 8.232 -1.4603874e-04 -2.0125978e-04 +4113 8.234 -1.4563677e-04 -2.0070630e-04 +4114 8.236 -1.4523591e-04 -2.0015434e-04 +4115 8.238 -1.4483615e-04 -1.9960389e-04 +4116 8.24 -1.4443750e-04 -1.9905495e-04 +4117 8.242 -1.4403993e-04 -1.9850753e-04 +4118 8.244 -1.4364346e-04 -1.9796160e-04 +4119 8.246 -1.4324809e-04 -1.9741717e-04 +4120 8.248 -1.4285379e-04 -1.9687424e-04 +4121 8.25 -1.4246059e-04 -1.9633280e-04 +4122 8.252 -1.4206846e-04 -1.9579284e-04 +4123 8.254 -1.4167742e-04 -1.9525437e-04 +4124 8.256 -1.4128744e-04 -1.9471738e-04 +4125 8.258 -1.4089854e-04 -1.9418186e-04 +4126 8.26 -1.4051072e-04 -1.9364781e-04 +4127 8.262 -1.4012395e-04 -1.9311523e-04 +4128 8.264 -1.3973825e-04 -1.9258411e-04 +4129 8.266 -1.3935362e-04 -1.9205444e-04 +4130 8.268 -1.3897003e-04 -1.9152623e-04 +4131 8.27 -1.3858751e-04 -1.9099948e-04 +4132 8.272 -1.3820604e-04 -1.9047417e-04 +4133 8.274 -1.3782561e-04 -1.8995030e-04 +4134 8.276 -1.3744623e-04 -1.8942787e-04 +4135 8.278 -1.3706790e-04 -1.8890687e-04 +4136 8.28 -1.3669061e-04 -1.8838731e-04 +4137 8.282 -1.3631435e-04 -1.8786917e-04 +4138 8.284 -1.3593913e-04 -1.8735245e-04 +4139 8.286 -1.3556494e-04 -1.8683715e-04 +4140 8.288 -1.3519178e-04 -1.8632327e-04 +4141 8.29 -1.3481964e-04 -1.8581080e-04 +4142 8.292 -1.3444853e-04 -1.8529974e-04 +4143 8.294 -1.3407844e-04 -1.8479008e-04 +4144 8.296 -1.3370937e-04 -1.8428182e-04 +4145 8.298 -1.3334132e-04 -1.8377495e-04 +4146 8.3 -1.3297427e-04 -1.8326948e-04 +4147 8.302 -1.3260824e-04 -1.8276539e-04 +4148 8.304 -1.3224321e-04 -1.8226269e-04 +4149 8.306 -1.3187919e-04 -1.8176137e-04 +4150 8.308 -1.3151616e-04 -1.8126143e-04 +4151 8.31 -1.3115414e-04 -1.8076286e-04 +4152 8.312 -1.3079311e-04 -1.8026566e-04 +4153 8.314 -1.3043308e-04 -1.7976982e-04 +4154 8.316 -1.3007403e-04 -1.7927535e-04 +4155 8.318 -1.2971597e-04 -1.7878223e-04 +4156 8.32 -1.2935890e-04 -1.7829047e-04 +4157 8.322 -1.2900281e-04 -1.7780006e-04 +4158 8.324 -1.2864770e-04 -1.7731100e-04 +4159 8.326 -1.2829357e-04 -1.7682328e-04 +4160 8.328 -1.2794041e-04 -1.7633690e-04 +4161 8.33 -1.2758822e-04 -1.7585185e-04 +4162 8.332 -1.2723700e-04 -1.7536814e-04 +4163 8.334 -1.2688674e-04 -1.7488575e-04 +4164 8.336 -1.2653745e-04 -1.7440469e-04 +4165 8.338 -1.2618912e-04 -1.7392495e-04 +4166 8.34 -1.2584175e-04 -1.7344653e-04 +4167 8.342 -1.2549534e-04 -1.7296943e-04 +4168 8.344 -1.2514987e-04 -1.7249363e-04 +4169 8.346 -1.2480536e-04 -1.7201914e-04 +4170 8.348 -1.2446180e-04 -1.7154595e-04 +4171 8.35 -1.2411918e-04 -1.7107407e-04 +4172 8.352 -1.2377750e-04 -1.7060348e-04 +4173 8.354 -1.2343676e-04 -1.7013418e-04 +4174 8.356 -1.2309696e-04 -1.6966617e-04 +4175 8.358 -1.2275810e-04 -1.6919945e-04 +4176 8.36 -1.2242016e-04 -1.6873401e-04 +4177 8.362 -1.2208316e-04 -1.6826984e-04 +4178 8.364 -1.2174708e-04 -1.6780695e-04 +4179 8.366 -1.2141193e-04 -1.6734534e-04 +4180 8.368 -1.2107770e-04 -1.6688499e-04 +4181 8.37 -1.2074439e-04 -1.6642591e-04 +4182 8.372 -1.2041200e-04 -1.6596808e-04 +4183 8.374 -1.2008052e-04 -1.6551152e-04 +4184 8.376 -1.1974995e-04 -1.6505621e-04 +4185 8.378 -1.1942029e-04 -1.6460215e-04 +4186 8.38 -1.1909154e-04 -1.6414934e-04 +4187 8.382 -1.1876369e-04 -1.6369777e-04 +4188 8.384 -1.1843675e-04 -1.6324744e-04 +4189 8.386 -1.1811070e-04 -1.6279835e-04 +4190 8.388 -1.1778555e-04 -1.6235049e-04 +4191 8.39 -1.1746130e-04 -1.6190386e-04 +4192 8.392 -1.1713794e-04 -1.6145846e-04 +4193 8.394 -1.1681547e-04 -1.6101429e-04 +4194 8.396 -1.1649388e-04 -1.6057133e-04 +4195 8.398 -1.1617318e-04 -1.6012959e-04 +4196 8.4 -1.1585336e-04 -1.5968906e-04 +4197 8.402 -1.1553442e-04 -1.5924975e-04 +4198 8.404 -1.1521636e-04 -1.5881164e-04 +4199 8.406 -1.1489917e-04 -1.5837474e-04 +4200 8.408 -1.1458286e-04 -1.5793903e-04 +4201 8.41 -1.1426742e-04 -1.5750452e-04 +4202 8.412 -1.1395284e-04 -1.5707121e-04 +4203 8.414 -1.1363913e-04 -1.5663909e-04 +4204 8.416 -1.1332629e-04 -1.5620815e-04 +4205 8.418 -1.1301430e-04 -1.5577840e-04 +4206 8.42 -1.1270317e-04 -1.5534983e-04 +4207 8.422 -1.1239290e-04 -1.5492243e-04 +4208 8.424 -1.1208348e-04 -1.5449621e-04 +4209 8.426 -1.1177491e-04 -1.5407116e-04 +4210 8.428 -1.1146719e-04 -1.5364728e-04 +4211 8.43 -1.1116032e-04 -1.5322457e-04 +4212 8.432 -1.1085430e-04 -1.5280301e-04 +4213 8.434 -1.1054911e-04 -1.5238262e-04 +4214 8.436 -1.1024476e-04 -1.5196337e-04 +4215 8.438 -1.0994126e-04 -1.5154529e-04 +4216 8.44 -1.0963858e-04 -1.5112834e-04 +4217 8.442 -1.0933674e-04 -1.5071255e-04 +4218 8.444 -1.0903573e-04 -1.5029790e-04 +4219 8.446 -1.0873555e-04 -1.4988438e-04 +4220 8.448 -1.0843619e-04 -1.4947201e-04 +4221 8.45 -1.0813766e-04 -1.4906076e-04 +4222 8.452 -1.0783995e-04 -1.4865065e-04 +4223 8.454 -1.0754306e-04 -1.4824166e-04 +4224 8.456 -1.0724698e-04 -1.4783380e-04 +4225 8.458 -1.0695172e-04 -1.4742706e-04 +4226 8.46 -1.0665727e-04 -1.4702143e-04 +4227 8.462 -1.0636364e-04 -1.4661692e-04 +4228 8.464 -1.0607080e-04 -1.4621352e-04 +4229 8.466 -1.0577878e-04 -1.4581123e-04 +4230 8.468 -1.0548756e-04 -1.4541005e-04 +4231 8.47 -1.0519714e-04 -1.4500997e-04 +4232 8.472 -1.0490752e-04 -1.4461099e-04 +4233 8.474 -1.0461869e-04 -1.4421310e-04 +4234 8.476 -1.0433067e-04 -1.4381631e-04 +4235 8.478 -1.0404343e-04 -1.4342060e-04 +4236 8.48 -1.0375698e-04 -1.4302599e-04 +4237 8.482 -1.0347132e-04 -1.4263246e-04 +4238 8.484 -1.0318645e-04 -1.4224001e-04 +4239 8.486 -1.0290236e-04 -1.4184864e-04 +4240 8.488 -1.0261906e-04 -1.4145834e-04 +4241 8.49 -1.0233653e-04 -1.4106912e-04 +4242 8.492 -1.0205478e-04 -1.4068097e-04 +4243 8.494 -1.0177380e-04 -1.4029388e-04 +4244 8.496 -1.0149360e-04 -1.3990786e-04 +4245 8.498 -1.0121417e-04 -1.3952290e-04 +4246 8.5 -1.0093551e-04 -1.3913899e-04 +4247 8.502 -1.0065762e-04 -1.3875615e-04 +4248 8.504 -1.0038049e-04 -1.3837435e-04 +4249 8.506 -1.0010412e-04 -1.3799360e-04 +4250 8.508 -9.9828510e-05 -1.3761390e-04 +4251 8.51 -9.9553661e-05 -1.3723525e-04 +4252 8.512 -9.9279569e-05 -1.3685763e-04 +4253 8.514 -9.9006230e-05 -1.3648105e-04 +4254 8.516 -9.8733644e-05 -1.3610551e-04 +4255 8.518 -9.8461807e-05 -1.3573100e-04 +4256 8.52 -9.8190719e-05 -1.3535751e-04 +4257 8.522 -9.7920377e-05 -1.3498506e-04 +4258 8.524 -9.7650778e-05 -1.3461363e-04 +4259 8.526 -9.7381921e-05 -1.3424322e-04 +4260 8.528 -9.7113805e-05 -1.3387382e-04 +4261 8.53 -9.6846425e-05 -1.3350544e-04 +4262 8.532 -9.6579782e-05 -1.3313808e-04 +4263 8.534 -9.6313872e-05 -1.3277172e-04 +4264 8.536 -9.6048695e-05 -1.3240638e-04 +4265 8.538 -9.5784246e-05 -1.3204203e-04 +4266 8.54 -9.5520526e-05 -1.3167869e-04 +4267 8.542 -9.5257531e-05 -1.3131634e-04 +4268 8.544 -9.4995260e-05 -1.3095500e-04 +4269 8.546 -9.4733710e-05 -1.3059464e-04 +4270 8.548 -9.4472881e-05 -1.3023528e-04 +4271 8.55 -9.4212768e-05 -1.2987690e-04 +4272 8.552 -9.3953372e-05 -1.2951951e-04 +4273 8.554 -9.3694690e-05 -1.2916310e-04 +4274 8.556 -9.3436719e-05 -1.2880767e-04 +4275 8.558 -9.3179458e-05 -1.2845322e-04 +4276 8.56 -9.2922906e-05 -1.2809974e-04 +4277 8.562 -9.2667059e-05 -1.2774723e-04 +4278 8.564 -9.2411916e-05 -1.2739569e-04 +4279 8.566 -9.2157475e-05 -1.2704512e-04 +4280 8.568 -9.1903735e-05 -1.2669551e-04 +4281 8.57 -9.1650693e-05 -1.2634687e-04 +4282 8.572 -9.1398347e-05 -1.2599918e-04 +4283 8.574 -9.1146695e-05 -1.2565245e-04 +4284 8.576 -9.0895736e-05 -1.2530667e-04 +4285 8.578 -9.0645468e-05 -1.2496184e-04 +4286 8.58 -9.0395888e-05 -1.2461796e-04 +4287 8.582 -9.0146996e-05 -1.2427502e-04 +4288 8.584 -8.9898788e-05 -1.2393303e-04 +4289 8.586 -8.9651263e-05 -1.2359198e-04 +4290 8.588 -8.9404419e-05 -1.2325186e-04 +4291 8.59 -8.9158255e-05 -1.2291268e-04 +4292 8.592 -8.8912768e-05 -1.2257443e-04 +4293 8.594 -8.8667956e-05 -1.2223711e-04 +4294 8.596 -8.8423819e-05 -1.2190072e-04 +4295 8.598 -8.8180353e-05 -1.2156526e-04 +4296 8.6 -8.7937557e-05 -1.2123071e-04 +4297 8.602 -8.7695430e-05 -1.2089709e-04 +4298 8.604 -8.7453968e-05 -1.2056438e-04 +4299 8.606 -8.7213171e-05 -1.2023259e-04 +4300 8.608 -8.6973037e-05 -1.1990171e-04 +4301 8.61 -8.6733564e-05 -1.1957174e-04 +4302 8.612 -8.6494750e-05 -1.1924268e-04 +4303 8.614 -8.6256593e-05 -1.1891452e-04 +4304 8.616 -8.6019091e-05 -1.1858726e-04 +4305 8.618 -8.5782243e-05 -1.1826090e-04 +4306 8.62 -8.5546047e-05 -1.1793545e-04 +4307 8.622 -8.5310501e-05 -1.1761088e-04 +4308 8.624 -8.5075603e-05 -1.1728721e-04 +4309 8.626 -8.4841351e-05 -1.1696443e-04 +4310 8.628 -8.4607744e-05 -1.1664253e-04 +4311 8.63 -8.4374780e-05 -1.1632152e-04 +4312 8.632 -8.4142458e-05 -1.1600139e-04 +4313 8.634 -8.3910774e-05 -1.1568215e-04 +4314 8.636 -8.3679729e-05 -1.1536378e-04 +4315 8.638 -8.3449319e-05 -1.1504628e-04 +4316 8.64 -8.3219543e-05 -1.1472966e-04 +4317 8.642 -8.2990399e-05 -1.1441391e-04 +4318 8.644 -8.2761887e-05 -1.1409903e-04 +4319 8.646 -8.2534003e-05 -1.1378501e-04 +4320 8.648 -8.2306746e-05 -1.1347186e-04 +4321 8.65 -8.2080115e-05 -1.1315956e-04 +4322 8.652 -8.1854107e-05 -1.1284813e-04 +4323 8.654 -8.1628722e-05 -1.1253755e-04 +4324 8.656 -8.1403956e-05 -1.1222783e-04 +4325 8.658 -8.1179810e-05 -1.1191896e-04 +4326 8.66 -8.0956280e-05 -1.1161093e-04 +4327 8.662 -8.0733365e-05 -1.1130376e-04 +4328 8.664 -8.0511064e-05 -1.1099743e-04 +4329 8.666 -8.0289375e-05 -1.1069194e-04 +4330 8.668 -8.0068296e-05 -1.1038729e-04 +4331 8.67 -7.9847825e-05 -1.1008348e-04 +4332 8.672 -7.9627962e-05 -1.0978050e-04 +4333 8.674 -7.9408703e-05 -1.0947836e-04 +4334 8.676 -7.9190048e-05 -1.0917704e-04 +4335 8.678 -7.8971994e-05 -1.0887656e-04 +4336 8.68 -7.8754541e-05 -1.0857690e-04 +4337 8.682 -7.8537686e-05 -1.0827807e-04 +4338 8.684 -7.8321428e-05 -1.0798006e-04 +4339 8.686 -7.8105765e-05 -1.0768287e-04 +4340 8.688 -7.7890696e-05 -1.0738649e-04 +4341 8.69 -7.7676219e-05 -1.0709093e-04 +4342 8.692 -7.7462332e-05 -1.0679618e-04 +4343 8.694 -7.7249033e-05 -1.0650225e-04 +4344 8.696 -7.7036322e-05 -1.0620912e-04 +4345 8.698 -7.6824196e-05 -1.0591679e-04 +4346 8.7 -7.6612655e-05 -1.0562528e-04 +4347 8.702 -7.6401695e-05 -1.0533456e-04 +4348 8.704 -7.6191316e-05 -1.0504464e-04 +4349 8.706 -7.5981516e-05 -1.0475552e-04 +4350 8.708 -7.5772293e-05 -1.0446720e-04 +4351 8.71 -7.5563646e-05 -1.0417966e-04 +4352 8.712 -7.5355574e-05 -1.0389292e-04 +4353 8.714 -7.5148074e-05 -1.0360697e-04 +4354 8.716 -7.4941146e-05 -1.0332180e-04 +4355 8.718 -7.4734786e-05 -1.0303742e-04 +4356 8.72 -7.4528995e-05 -1.0275382e-04 +4357 8.722 -7.4323771e-05 -1.0247100e-04 +4358 8.724 -7.4119111e-05 -1.0218895e-04 +4359 8.726 -7.3915014e-05 -1.0190769e-04 +4360 8.728 -7.3711480e-05 -1.0162719e-04 +4361 8.73 -7.3508505e-05 -1.0134747e-04 +4362 8.732 -7.3306089e-05 -1.0106852e-04 +4363 8.734 -7.3104231e-05 -1.0079033e-04 +4364 8.736 -7.2902927e-05 -1.0051291e-04 +4365 8.738 -7.2702178e-05 -1.0023625e-04 +4366 8.74 -7.2501982e-05 -9.9960352e-05 +4367 8.742 -7.2302336e-05 -9.9685214e-05 +4368 8.744 -7.2103241e-05 -9.9410832e-05 +4369 8.746 -7.1904693e-05 -9.9137204e-05 +4370 8.748 -7.1706691e-05 -9.8864329e-05 +4371 8.75 -7.1509235e-05 -9.8592205e-05 +4372 8.752 -7.1312322e-05 -9.8320829e-05 +4373 8.754 -7.1115951e-05 -9.8050199e-05 +4374 8.756 -7.0920121e-05 -9.7780314e-05 +4375 8.758 -7.0724829e-05 -9.7511171e-05 +4376 8.76 -7.0530075e-05 -9.7242768e-05 +4377 8.762 -7.0335858e-05 -9.6975103e-05 +4378 8.764 -7.0142175e-05 -9.6708174e-05 +4379 8.766 -6.9949024e-05 -9.6441980e-05 +4380 8.768 -6.9756406e-05 -9.6176517e-05 +4381 8.77 -6.9564318e-05 -9.5911785e-05 +4382 8.772 -6.9372758e-05 -9.5647781e-05 +4383 8.774 -6.9181726e-05 -9.5384502e-05 +4384 8.776 -6.8991220e-05 -9.5121948e-05 +4385 8.778 -6.8801238e-05 -9.4860117e-05 +4386 8.78 -6.8611779e-05 -9.4599005e-05 +4387 8.782 -6.8422842e-05 -9.4338611e-05 +4388 8.784 -6.8234424e-05 -9.4078934e-05 +4389 8.786 -6.8046525e-05 -9.3819970e-05 +4390 8.788 -6.7859144e-05 -9.3561719e-05 +4391 8.79 -6.7672278e-05 -9.3304179e-05 +4392 8.792 -6.7485927e-05 -9.3047346e-05 +4393 8.794 -6.7300088e-05 -9.2791220e-05 +4394 8.796 -6.7114761e-05 -9.2535799e-05 +4395 8.798 -6.6929944e-05 -9.2281080e-05 +4396 8.8 -6.6745636e-05 -9.2027062e-05 +4397 8.802 -6.6561836e-05 -9.1773742e-05 +4398 8.804 -6.6378541e-05 -9.1521119e-05 +4399 8.806 -6.6195751e-05 -9.1269191e-05 +4400 8.808 -6.6013464e-05 -9.1017956e-05 +4401 8.81 -6.5831679e-05 -9.0767412e-05 +4402 8.812 -6.5650394e-05 -9.0517557e-05 +4403 8.814 -6.5469608e-05 -9.0268389e-05 +4404 8.816 -6.5289320e-05 -9.0019907e-05 +4405 8.818 -6.5109528e-05 -8.9772108e-05 +4406 8.82 -6.4930231e-05 -8.9524990e-05 +4407 8.822 -6.4751427e-05 -8.9278553e-05 +4408 8.824 -6.4573116e-05 -8.9032793e-05 +4409 8.826 -6.4395296e-05 -8.8787709e-05 +4410 8.828 -6.4217965e-05 -8.8543300e-05 +4411 8.83 -6.4041122e-05 -8.8299562e-05 +4412 8.832 -6.3864766e-05 -8.8056496e-05 +4413 8.834 -6.3688896e-05 -8.7814097e-05 +4414 8.836 -6.3513509e-05 -8.7572366e-05 +4415 8.838 -6.3338606e-05 -8.7331299e-05 +4416 8.84 -6.3164184e-05 -8.7090896e-05 +4417 8.842 -6.2990242e-05 -8.6851154e-05 +4418 8.844 -6.2816779e-05 -8.6612071e-05 +4419 8.846 -6.2643793e-05 -8.6373646e-05 +4420 8.848 -6.2471284e-05 -8.6135877e-05 +4421 8.85 -6.2299249e-05 -8.5898761e-05 +4422 8.852 -6.2127688e-05 -8.5662298e-05 +4423 8.854 -6.1956599e-05 -8.5426486e-05 +4424 8.856 -6.1785982e-05 -8.5191322e-05 +4425 8.858 -6.1615834e-05 -8.4956805e-05 +4426 8.86 -6.1446154e-05 -8.4722934e-05 +4427 8.862 -6.1276942e-05 -8.4489705e-05 +4428 8.864 -6.1108195e-05 -8.4257118e-05 +4429 8.866 -6.0939913e-05 -8.4025171e-05 +4430 8.868 -6.0772094e-05 -8.3793862e-05 +4431 8.87 -6.0604737e-05 -8.3563189e-05 +4432 8.872 -6.0437841e-05 -8.3333151e-05 +4433 8.874 -6.0271404e-05 -8.3103746e-05 +4434 8.876 -6.0105425e-05 -8.2874972e-05 +4435 8.878 -5.9939903e-05 -8.2646827e-05 +4436 8.88 -5.9774837e-05 -8.2419310e-05 +4437 8.882 -5.9610226e-05 -8.2192418e-05 +4438 8.884 -5.9446067e-05 -8.1966151e-05 +4439 8.886 -5.9282361e-05 -8.1740506e-05 +4440 8.888 -5.9119105e-05 -8.1515482e-05 +4441 8.89 -5.8956298e-05 -8.1291077e-05 +4442 8.892 -5.8793940e-05 -8.1067289e-05 +4443 8.894 -5.8632029e-05 -8.0844117e-05 +4444 8.896 -5.8470563e-05 -8.0621559e-05 +4445 8.898 -5.8309542e-05 -8.0399613e-05 +4446 8.9 -5.8148964e-05 -8.0178278e-05 +4447 8.902 -5.7988829e-05 -7.9957552e-05 +4448 8.904 -5.7829134e-05 -7.9737433e-05 +4449 8.906 -5.7669879e-05 -7.9517919e-05 +4450 8.908 -5.7511062e-05 -7.9299010e-05 +4451 8.91 -5.7352682e-05 -7.9080702e-05 +4452 8.912 -5.7194739e-05 -7.8862995e-05 +4453 8.914 -5.7037230e-05 -7.8645888e-05 +4454 8.916 -5.6880155e-05 -7.8429377e-05 +4455 8.918 -5.6723512e-05 -7.8213462e-05 +4456 8.92 -5.6567300e-05 -7.7998141e-05 +4457 8.922 -5.6411519e-05 -7.7783413e-05 +4458 8.924 -5.6256166e-05 -7.7569275e-05 +4459 8.926 -5.6101241e-05 -7.7355726e-05 +4460 8.928 -5.5946743e-05 -7.7142765e-05 +4461 8.93 -5.5792670e-05 -7.6930390e-05 +4462 8.932 -5.5639021e-05 -7.6718599e-05 +4463 8.934 -5.5485795e-05 -7.6507391e-05 +4464 8.936 -5.5332991e-05 -7.6296763e-05 +4465 8.938 -5.5180608e-05 -7.6086716e-05 +4466 8.94 -5.5028644e-05 -7.5877246e-05 +4467 8.942 -5.4877098e-05 -7.5668352e-05 +4468 8.944 -5.4725970e-05 -7.5460034e-05 +4469 8.946 -5.4575258e-05 -7.5252288e-05 +4470 8.948 -5.4424961e-05 -7.5045114e-05 +4471 8.95 -5.4275077e-05 -7.4838510e-05 +4472 8.952 -5.4125606e-05 -7.4632474e-05 +4473 8.954 -5.3976547e-05 -7.4427005e-05 +4474 8.956 -5.3827898e-05 -7.4222102e-05 +4475 8.958 -5.3679658e-05 -7.4017762e-05 +4476 8.96 -5.3531826e-05 -7.3813985e-05 +4477 8.962 -5.3384402e-05 -7.3610768e-05 +4478 8.964 -5.3237383e-05 -7.3408110e-05 +4479 8.966 -5.3090769e-05 -7.3206010e-05 +4480 8.968 -5.2944558e-05 -7.3004466e-05 +4481 8.97 -5.2798751e-05 -7.2803476e-05 +4482 8.972 -5.2653344e-05 -7.2603040e-05 +4483 8.974 -5.2508338e-05 -7.2403155e-05 +4484 8.976 -5.2363731e-05 -7.2203819e-05 +4485 8.978 -5.2219522e-05 -7.2005033e-05 +4486 8.98 -5.2075711e-05 -7.1806793e-05 +4487 8.982 -5.1932295e-05 -7.1609099e-05 +4488 8.984 -5.1789274e-05 -7.1411949e-05 +4489 8.986 -5.1646647e-05 -7.1215341e-05 +4490 8.988 -5.1504412e-05 -7.1019274e-05 +4491 8.99 -5.1362569e-05 -7.0823746e-05 +4492 8.992 -5.1221117e-05 -7.0628757e-05 +4493 8.994 -5.1080054e-05 -7.0434304e-05 +4494 8.996 -5.0939379e-05 -7.0240386e-05 +4495 8.998 -5.0799092e-05 -7.0047002e-05 +4496 9.0 -5.0659191e-05 -6.9854150e-05 +4497 9.002 -5.0519675e-05 -6.9661828e-05 +4498 9.004 -5.0380543e-05 -6.9470036e-05 +4499 9.006 -5.0241795e-05 -6.9278771e-05 +4500 9.008 -5.0103428e-05 -6.9088033e-05 +4501 9.01 -4.9965442e-05 -6.8897819e-05 +4502 9.012 -4.9827836e-05 -6.8708129e-05 +4503 9.014 -4.9690609e-05 -6.8518961e-05 +4504 9.016 -4.9553760e-05 -6.8330313e-05 +4505 9.018 -4.9417288e-05 -6.8142184e-05 +4506 9.02 -4.9281191e-05 -6.7954573e-05 +4507 9.022 -4.9145469e-05 -6.7767479e-05 +4508 9.024 -4.9010121e-05 -6.7580899e-05 +4509 9.026 -4.8875145e-05 -6.7394832e-05 +4510 9.028 -4.8740541e-05 -6.7209278e-05 +4511 9.03 -4.8606308e-05 -6.7024234e-05 +4512 9.032 -4.8472444e-05 -6.6839699e-05 +4513 9.034 -4.8338948e-05 -6.6655672e-05 +4514 9.036 -4.8205821e-05 -6.6472152e-05 +4515 9.038 -4.8073059e-05 -6.6289136e-05 +4516 9.04 -4.7940664e-05 -6.6106624e-05 +4517 9.042 -4.7808633e-05 -6.5924614e-05 +4518 9.044 -4.7676965e-05 -6.5743105e-05 +4519 9.046 -4.7545660e-05 -6.5562096e-05 +4520 9.048 -4.7414716e-05 -6.5381585e-05 +4521 9.05 -4.7284133e-05 -6.5201570e-05 +4522 9.052 -4.7153910e-05 -6.5022051e-05 +4523 9.054 -4.7024045e-05 -6.4843025e-05 +4524 9.056 -4.6894537e-05 -6.4664493e-05 +4525 9.058 -4.6765386e-05 -6.4486451e-05 +4526 9.06 -4.6636591e-05 -6.4308900e-05 +4527 9.062 -4.6508150e-05 -6.4131837e-05 +4528 9.064 -4.6380063e-05 -6.3955261e-05 +4529 9.066 -4.6252329e-05 -6.3779172e-05 +4530 9.068 -4.6124946e-05 -6.3603567e-05 +4531 9.07 -4.5997915e-05 -6.3428445e-05 +4532 9.072 -4.5871232e-05 -6.3253805e-05 +4533 9.074 -4.5744899e-05 -6.3079645e-05 +4534 9.076 -4.5618913e-05 -6.2905965e-05 +4535 9.078 -4.5493275e-05 -6.2732763e-05 +4536 9.08 -4.5367982e-05 -6.2560037e-05 +4537 9.082 -4.5243034e-05 -6.2387787e-05 +4538 9.084 -4.5118431e-05 -6.2216011e-05 +4539 9.086 -4.4994170e-05 -6.2044707e-05 +4540 9.088 -4.4870251e-05 -6.1873875e-05 +4541 9.09 -4.4746674e-05 -6.1703513e-05 +4542 9.092 -4.4623437e-05 -6.1533620e-05 +4543 9.094 -4.4500539e-05 -6.1364194e-05 +4544 9.096 -4.4377980e-05 -6.1195235e-05 +4545 9.098 -4.4255758e-05 -6.1026741e-05 +4546 9.1 -4.4133873e-05 -6.0858710e-05 +4547 9.102 -4.4012323e-05 -6.0691141e-05 +4548 9.104 -4.3891108e-05 -6.0524034e-05 +4549 9.106 -4.3770227e-05 -6.0357387e-05 +4550 9.108 -4.3649678e-05 -6.0191198e-05 +4551 9.11 -4.3529461e-05 -6.0025467e-05 +4552 9.112 -4.3409576e-05 -5.9860192e-05 +4553 9.114 -4.3290020e-05 -5.9695371e-05 +4554 9.116 -4.3170794e-05 -5.9531004e-05 +4555 9.118 -4.3051896e-05 -5.9367090e-05 +4556 9.12 -4.2933325e-05 -5.9203627e-05 +4557 9.122 -4.2815081e-05 -5.9040613e-05 +4558 9.124 -4.2697163e-05 -5.8878048e-05 +4559 9.126 -4.2579569e-05 -5.8715931e-05 +4560 9.128 -4.2462299e-05 -5.8554259e-05 +4561 9.13 -4.2345351e-05 -5.8393033e-05 +4562 9.132 -4.2228726e-05 -5.8232250e-05 +4563 9.134 -4.2112422e-05 -5.8071910e-05 +4564 9.136 -4.1996438e-05 -5.7912011e-05 +4565 9.138 -4.1880774e-05 -5.7752552e-05 +4566 9.14 -4.1765428e-05 -5.7593532e-05 +4567 9.142 -4.1650399e-05 -5.7434950e-05 +4568 9.144 -4.1535688e-05 -5.7276804e-05 +4569 9.146 -4.1421292e-05 -5.7119093e-05 +4570 9.148 -4.1307211e-05 -5.6961816e-05 +4571 9.15 -4.1193444e-05 -5.6804972e-05 +4572 9.152 -4.1079991e-05 -5.6648560e-05 +4573 9.154 -4.0966850e-05 -5.6492578e-05 +4574 9.156 -4.0854020e-05 -5.6337026e-05 +4575 9.158 -4.0741501e-05 -5.6181902e-05 +4576 9.16 -4.0629292e-05 -5.6027204e-05 +4577 9.162 -4.0517392e-05 -5.5872933e-05 +4578 9.164 -4.0405800e-05 -5.5719086e-05 +4579 9.166 -4.0294516e-05 -5.5565662e-05 +4580 9.168 -4.0183537e-05 -5.5412661e-05 +4581 9.17 -4.0072865e-05 -5.5260080e-05 +4582 9.172 -3.9962497e-05 -5.5107920e-05 +4583 9.174 -3.9852433e-05 -5.4956178e-05 +4584 9.176 -3.9742672e-05 -5.4804854e-05 +4585 9.178 -3.9633213e-05 -5.4653947e-05 +4586 9.18 -3.9524056e-05 -5.4503455e-05 +4587 9.182 -3.9415199e-05 -5.4353377e-05 +4588 9.184 -3.9306642e-05 -5.4203712e-05 +4589 9.186 -3.9198384e-05 -5.4054459e-05 +4590 9.188 -3.9090424e-05 -5.3905617e-05 +4591 9.19 -3.8982761e-05 -5.3757184e-05 +4592 9.192 -3.8875395e-05 -5.3609160e-05 +4593 9.194 -3.8768324e-05 -5.3461544e-05 +4594 9.196 -3.8661548e-05 -5.3314334e-05 +4595 9.198 -3.8555067e-05 -5.3167528e-05 +4596 9.2 -3.8448878e-05 -5.3021127e-05 +4597 9.202 -3.8342982e-05 -5.2875129e-05 +4598 9.204 -3.8237377e-05 -5.2729533e-05 +4599 9.206 -3.8132063e-05 -5.2584337e-05 +4600 9.208 -3.8027040e-05 -5.2439542e-05 +4601 9.21 -3.7922305e-05 -5.2295144e-05 +4602 9.212 -3.7817859e-05 -5.2151144e-05 +4603 9.214 -3.7713700e-05 -5.2007541e-05 +4604 9.216 -3.7609828e-05 -5.1864332e-05 +4605 9.218 -3.7506243e-05 -5.1721518e-05 +4606 9.22 -3.7402942e-05 -5.1579097e-05 +4607 9.222 -3.7299926e-05 -5.1437068e-05 +4608 9.224 -3.7197193e-05 -5.1295430e-05 +4609 9.226 -3.7094744e-05 -5.1154181e-05 +4610 9.228 -3.6992576e-05 -5.1013322e-05 +4611 9.23 -3.6890690e-05 -5.0872850e-05 +4612 9.232 -3.6789085e-05 -5.0732765e-05 +4613 9.234 -3.6687759e-05 -5.0593065e-05 +4614 9.236 -3.6586712e-05 -5.0453750e-05 +4615 9.238 -3.6485944e-05 -5.0314818e-05 +4616 9.24 -3.6385453e-05 -5.0176269e-05 +4617 9.242 -3.6285238e-05 -5.0038101e-05 +4618 9.244 -3.6185300e-05 -4.9900313e-05 +4619 9.246 -3.6085637e-05 -4.9762905e-05 +4620 9.248 -3.5986248e-05 -4.9625875e-05 +4621 9.25 -3.5887133e-05 -4.9489222e-05 +4622 9.252 -3.5788291e-05 -4.9352945e-05 +4623 9.254 -3.5689721e-05 -4.9217043e-05 +4624 9.256 -3.5591423e-05 -4.9081516e-05 +4625 9.258 -3.5493395e-05 -4.8946361e-05 +4626 9.26 -3.5395637e-05 -4.8811578e-05 +4627 9.262 -3.5298148e-05 -4.8677167e-05 +4628 9.264 -3.5200928e-05 -4.8543125e-05 +4629 9.266 -3.5103976e-05 -4.8409453e-05 +4630 9.268 -3.5007290e-05 -4.8276148e-05 +4631 9.27 -3.4910871e-05 -4.8143210e-05 +4632 9.272 -3.4814717e-05 -4.8010638e-05 +4633 9.274 -3.4718828e-05 -4.7878431e-05 +4634 9.276 -3.4623203e-05 -4.7746588e-05 +4635 9.278 -3.4527841e-05 -4.7615108e-05 +4636 9.28 -3.4432742e-05 -4.7483990e-05 +4637 9.282 -3.4337905e-05 -4.7353232e-05 +4638 9.284 -3.4243329e-05 -4.7222835e-05 +4639 9.286 -3.4149014e-05 -4.7092796e-05 +4640 9.288 -3.4054958e-05 -4.6963116e-05 +4641 9.29 -3.3961161e-05 -4.6833792e-05 +4642 9.292 -3.3867622e-05 -4.6704825e-05 +4643 9.294 -3.3774341e-05 -4.6576212e-05 +4644 9.296 -3.3681317e-05 -4.6447954e-05 +4645 9.298 -3.3588549e-05 -4.6320048e-05 +4646 9.3 -3.3496037e-05 -4.6192495e-05 +4647 9.302 -3.3403779e-05 -4.6065292e-05 +4648 9.304 -3.3311775e-05 -4.5938440e-05 +4649 9.306 -3.3220025e-05 -4.5811937e-05 +4650 9.308 -3.3128527e-05 -4.5685782e-05 +4651 9.31 -3.3037282e-05 -4.5559975e-05 +4652 9.312 -3.2946287e-05 -4.5434514e-05 +4653 9.314 -3.2855543e-05 -4.5309398e-05 +4654 9.316 -3.2765049e-05 -4.5184626e-05 +4655 9.318 -3.2674805e-05 -4.5060198e-05 +4656 9.32 -3.2584808e-05 -4.4936113e-05 +4657 9.322 -3.2495060e-05 -4.4812369e-05 +4658 9.324 -3.2405559e-05 -4.4688966e-05 +4659 9.326 -3.2316304e-05 -4.4565902e-05 +4660 9.328 -3.2227295e-05 -4.4443177e-05 +4661 9.33 -3.2138531e-05 -4.4320790e-05 +4662 9.332 -3.2050012e-05 -4.4198740e-05 +4663 9.334 -3.1961736e-05 -4.4077026e-05 +4664 9.336 -3.1873703e-05 -4.3955647e-05 +4665 9.338 -3.1785913e-05 -4.3834602e-05 +4666 9.34 -3.1698365e-05 -4.3713890e-05 +4667 9.342 -3.1611057e-05 -4.3593511e-05 +4668 9.344 -3.1523990e-05 -4.3473463e-05 +4669 9.346 -3.1437163e-05 -4.3353745e-05 +4670 9.348 -3.1350575e-05 -4.3234357e-05 +4671 9.35 -3.1264225e-05 -4.3115298e-05 +4672 9.352 -3.1178114e-05 -4.2996566e-05 +4673 9.354 -3.1092239e-05 -4.2878161e-05 +4674 9.356 -3.1006601e-05 -4.2760083e-05 +4675 9.358 -3.0921198e-05 -4.2642329e-05 +4676 9.36 -3.0836031e-05 -4.2524899e-05 +4677 9.362 -3.0751099e-05 -4.2407793e-05 +4678 9.364 -3.0666400e-05 -4.2291009e-05 +4679 9.366 -3.0581934e-05 -4.2174546e-05 +4680 9.368 -3.0497702e-05 -4.2058404e-05 +4681 9.37 -3.0413701e-05 -4.1942582e-05 +4682 9.372 -3.0329931e-05 -4.1827079e-05 +4683 9.374 -3.0246392e-05 -4.1711893e-05 +4684 9.376 -3.0163083e-05 -4.1597025e-05 +4685 9.378 -3.0080004e-05 -4.1482473e-05 +4686 9.38 -2.9997153e-05 -4.1368236e-05 +4687 9.382 -2.9914531e-05 -4.1254314e-05 +4688 9.384 -2.9832136e-05 -4.1140705e-05 +4689 9.386 -2.9749968e-05 -4.1027410e-05 +4690 9.388 -2.9668026e-05 -4.0914426e-05 +4691 9.39 -2.9586310e-05 -4.0801753e-05 +4692 9.392 -2.9504819e-05 -4.0689390e-05 +4693 9.394 -2.9423552e-05 -4.0577336e-05 +4694 9.396 -2.9342509e-05 -4.0465591e-05 +4695 9.398 -2.9261689e-05 -4.0354154e-05 +4696 9.4 -2.9181092e-05 -4.0243024e-05 +4697 9.402 -2.9100717e-05 -4.0132199e-05 +4698 9.404 -2.9020563e-05 -4.0021679e-05 +4699 9.406 -2.8940630e-05 -3.9911464e-05 +4700 9.408 -2.8860917e-05 -3.9801552e-05 +4701 9.41 -2.8781424e-05 -3.9691943e-05 +4702 9.412 -2.8702149e-05 -3.9582635e-05 +4703 9.414 -2.8623093e-05 -3.9473629e-05 +4704 9.416 -2.8544254e-05 -3.9364922e-05 +4705 9.418 -2.8465633e-05 -3.9256515e-05 +4706 9.42 -2.8387228e-05 -3.9148406e-05 +4707 9.422 -2.8309039e-05 -3.9040595e-05 +4708 9.424 -2.8231066e-05 -3.8933081e-05 +4709 9.426 -2.8153307e-05 -3.8825862e-05 +4710 9.428 -2.8075762e-05 -3.8718939e-05 +4711 9.43 -2.7998431e-05 -3.8612310e-05 +4712 9.432 -2.7921313e-05 -3.8505975e-05 +4713 9.434 -2.7844407e-05 -3.8399932e-05 +4714 9.436 -2.7767713e-05 -3.8294181e-05 +4715 9.438 -2.7691230e-05 -3.8188722e-05 +4716 9.44 -2.7614958e-05 -3.8083553e-05 +4717 9.442 -2.7538895e-05 -3.7978673e-05 +4718 9.444 -2.7463043e-05 -3.7874082e-05 +4719 9.446 -2.7387399e-05 -3.7769779e-05 +4720 9.448 -2.7311963e-05 -3.7665763e-05 +4721 9.45 -2.7236736e-05 -3.7562034e-05 +4722 9.452 -2.7161715e-05 -3.7458590e-05 +4723 9.454 -2.7086901e-05 -3.7355431e-05 +4724 9.456 -2.7012293e-05 -3.7252556e-05 +4725 9.458 -2.6937891e-05 -3.7149964e-05 +4726 9.46 -2.6863693e-05 -3.7047655e-05 +4727 9.462 -2.6789700e-05 -3.6945627e-05 +4728 9.464 -2.6715910e-05 -3.6843880e-05 +4729 9.466 -2.6642324e-05 -3.6742413e-05 +4730 9.468 -2.6568940e-05 -3.6641226e-05 +4731 9.47 -2.6495759e-05 -3.6540317e-05 +4732 9.472 -2.6422779e-05 -3.6439686e-05 +4733 9.474 -2.6350000e-05 -3.6339332e-05 +4734 9.476 -2.6277422e-05 -3.6239255e-05 +4735 9.478 -2.6205043e-05 -3.6139452e-05 +4736 9.48 -2.6132864e-05 -3.6039925e-05 +4737 9.482 -2.6060883e-05 -3.5940672e-05 +4738 9.484 -2.5989101e-05 -3.5841692e-05 +4739 9.486 -2.5917516e-05 -3.5742984e-05 +4740 9.488 -2.5846129e-05 -3.5644548e-05 +4741 9.49 -2.5774938e-05 -3.5546383e-05 +4742 9.492 -2.5703943e-05 -3.5448489e-05 +4743 9.494 -2.5633144e-05 -3.5350864e-05 +4744 9.496 -2.5562539e-05 -3.5253508e-05 +4745 9.498 -2.5492129e-05 -3.5156419e-05 +4746 9.5 -2.5421913e-05 -3.5059598e-05 +4747 9.502 -2.5351891e-05 -3.4963044e-05 +4748 9.504 -2.5282061e-05 -3.4866755e-05 +4749 9.506 -2.5212424e-05 -3.4770732e-05 +4750 9.508 -2.5142978e-05 -3.4674973e-05 +4751 9.51 -2.5073723e-05 -3.4579478e-05 +4752 9.512 -2.5004660e-05 -3.4484245e-05 +4753 9.514 -2.4935786e-05 -3.4389275e-05 +4754 9.516 -2.4867103e-05 -3.4294566e-05 +4755 9.518 -2.4798608e-05 -3.4200118e-05 +4756 9.52 -2.4730302e-05 -3.4105930e-05 +4757 9.522 -2.4662184e-05 -3.4012001e-05 +4758 9.524 -2.4594254e-05 -3.3918331e-05 +4759 9.526 -2.4526511e-05 -3.3824919e-05 +4760 9.528 -2.4458954e-05 -3.3731764e-05 +4761 9.53 -2.4391583e-05 -3.3638865e-05 +4762 9.532 -2.4324398e-05 -3.3546222e-05 +4763 9.534 -2.4257398e-05 -3.3453835e-05 +4764 9.536 -2.4190583e-05 -3.3361701e-05 +4765 9.538 -2.4123951e-05 -3.3269822e-05 +4766 9.54 -2.4057503e-05 -3.3178195e-05 +4767 9.542 -2.3991238e-05 -3.3086821e-05 +4768 9.544 -2.3925156e-05 -3.2995698e-05 +4769 9.546 -2.3859255e-05 -3.2904826e-05 +4770 9.548 -2.3793536e-05 -3.2814204e-05 +4771 9.55 -2.3727998e-05 -3.2723832e-05 +4772 9.552 -2.3662641e-05 -3.2633708e-05 +4773 9.554 -2.3597463e-05 -3.2543833e-05 +4774 9.556 -2.3532465e-05 -3.2454205e-05 +4775 9.558 -2.3467646e-05 -3.2364824e-05 +4776 9.56 -2.3403006e-05 -3.2275689e-05 +4777 9.562 -2.3338543e-05 -3.2186800e-05 +4778 9.564 -2.3274259e-05 -3.2098155e-05 +4779 9.566 -2.3210151e-05 -3.2009754e-05 +4780 9.568 -2.3146219e-05 -3.1921597e-05 +4781 9.57 -2.3082464e-05 -3.1833682e-05 +4782 9.572 -2.3018884e-05 -3.1746009e-05 +4783 9.574 -2.2955480e-05 -3.1658578e-05 +4784 9.576 -2.2892250e-05 -3.1571388e-05 +4785 9.578 -2.2829194e-05 -3.1484437e-05 +4786 9.58 -2.2766312e-05 -3.1397726e-05 +4787 9.582 -2.2703603e-05 -3.1311254e-05 +4788 9.584 -2.2641067e-05 -3.1225020e-05 +4789 9.586 -2.2578703e-05 -3.1139023e-05 +4790 9.588 -2.2516511e-05 -3.1053263e-05 +4791 9.59 -2.2454490e-05 -3.0967739e-05 +4792 9.592 -2.2392640e-05 -3.0882451e-05 +4793 9.594 -2.2330960e-05 -3.0797398e-05 +4794 9.596 -2.2269450e-05 -3.0712578e-05 +4795 9.598 -2.2208109e-05 -3.0627992e-05 +4796 9.6 -2.2146938e-05 -3.0543640e-05 +4797 9.602 -2.2085935e-05 -3.0459519e-05 +4798 9.604 -2.2025099e-05 -3.0375630e-05 +4799 9.606 -2.1964432e-05 -3.0291972e-05 +4800 9.608 -2.1903931e-05 -3.0208544e-05 +4801 9.61 -2.1843598e-05 -3.0125346e-05 +4802 9.612 -2.1783430e-05 -3.0042377e-05 +4803 9.614 -2.1723428e-05 -2.9959637e-05 +4804 9.616 -2.1663591e-05 -2.9877124e-05 +4805 9.618 -2.1603919e-05 -2.9794839e-05 +4806 9.62 -2.1544412e-05 -2.9712780e-05 +4807 9.622 -2.1485068e-05 -2.9630947e-05 +4808 9.624 -2.1425888e-05 -2.9549339e-05 +4809 9.626 -2.1366870e-05 -2.9467957e-05 +4810 9.628 -2.1308016e-05 -2.9386798e-05 +4811 9.63 -2.1249323e-05 -2.9305862e-05 +4812 9.632 -2.1190792e-05 -2.9225150e-05 +4813 9.634 -2.1132422e-05 -2.9144660e-05 +4814 9.636 -2.1074213e-05 -2.9064391e-05 +4815 9.638 -2.1016165e-05 -2.8984343e-05 +4816 9.64 -2.0958276e-05 -2.8904516e-05 +4817 9.642 -2.0900546e-05 -2.8824909e-05 +4818 9.644 -2.0842976e-05 -2.8745521e-05 +4819 9.646 -2.0785564e-05 -2.8666351e-05 +4820 9.648 -2.0728311e-05 -2.8587399e-05 +4821 9.65 -2.0671214e-05 -2.8508665e-05 +4822 9.652 -2.0614276e-05 -2.8430148e-05 +4823 9.654 -2.0557494e-05 -2.8351846e-05 +4824 9.656 -2.0500868e-05 -2.8273761e-05 +4825 9.658 -2.0444399e-05 -2.8195890e-05 +4826 9.66 -2.0388084e-05 -2.8118234e-05 +4827 9.662 -2.0331925e-05 -2.8040792e-05 +4828 9.664 -2.0275921e-05 -2.7963562e-05 +4829 9.666 -2.0220071e-05 -2.7886546e-05 +4830 9.668 -2.0164375e-05 -2.7809741e-05 +4831 9.67 -2.0108832e-05 -2.7733148e-05 +4832 9.672 -2.0053442e-05 -2.7656766e-05 +4833 9.674 -1.9998205e-05 -2.7580595e-05 +4834 9.676 -1.9943120e-05 -2.7504633e-05 +4835 9.678 -1.9888186e-05 -2.7428880e-05 +4836 9.68 -1.9833404e-05 -2.7353336e-05 +4837 9.682 -1.9778773e-05 -2.7277999e-05 +4838 9.684 -1.9724292e-05 -2.7202871e-05 +4839 9.686 -1.9669961e-05 -2.7127949e-05 +4840 9.688 -1.9615780e-05 -2.7053233e-05 +4841 9.69 -1.9561748e-05 -2.6978723e-05 +4842 9.692 -1.9507865e-05 -2.6904419e-05 +4843 9.694 -1.9454130e-05 -2.6830318e-05 +4844 9.696 -1.9400543e-05 -2.6756422e-05 +4845 9.698 -1.9347104e-05 -2.6682730e-05 +4846 9.7 -1.9293812e-05 -2.6609240e-05 +4847 9.702 -1.9240667e-05 -2.6535953e-05 +4848 9.704 -1.9187668e-05 -2.6462867e-05 +4849 9.706 -1.9134816e-05 -2.6389983e-05 +4850 9.708 -1.9082108e-05 -2.6317299e-05 +4851 9.71 -1.9029546e-05 -2.6244816e-05 +4852 9.712 -1.8977129e-05 -2.6172532e-05 +4853 9.714 -1.8924856e-05 -2.6100447e-05 +4854 9.716 -1.8872727e-05 -2.6028561e-05 +4855 9.718 -1.8820742e-05 -2.5956873e-05 +4856 9.72 -1.8768899e-05 -2.5885382e-05 +4857 9.722 -1.8717200e-05 -2.5814088e-05 +4858 9.724 -1.8665643e-05 -2.5742990e-05 +4859 9.726 -1.8614228e-05 -2.5672088e-05 +4860 9.728 -1.8562954e-05 -2.5601381e-05 +4861 9.73 -1.8511822e-05 -2.5530869e-05 +4862 9.732 -1.8460831e-05 -2.5460551e-05 +4863 9.734 -1.8409980e-05 -2.5390427e-05 +4864 9.736 -1.8359269e-05 -2.5320496e-05 +4865 9.738 -1.8308698e-05 -2.5250757e-05 +4866 9.74 -1.8258266e-05 -2.5181211e-05 +4867 9.742 -1.8207973e-05 -2.5111856e-05 +4868 9.744 -1.8157818e-05 -2.5042691e-05 +4869 9.746 -1.8107802e-05 -2.4973718e-05 +4870 9.748 -1.8057923e-05 -2.4904934e-05 +4871 9.75 -1.8008182e-05 -2.4836340e-05 +4872 9.752 -1.7958578e-05 -2.4767934e-05 +4873 9.754 -1.7909110e-05 -2.4699717e-05 +4874 9.756 -1.7859779e-05 -2.4631688e-05 +4875 9.758 -1.7810583e-05 -2.4563846e-05 +4876 9.76 -1.7761523e-05 -2.4496191e-05 +4877 9.762 -1.7712598e-05 -2.4428722e-05 +4878 9.764 -1.7663808e-05 -2.4361439e-05 +4879 9.766 -1.7615153e-05 -2.4294342e-05 +4880 9.768 -1.7566631e-05 -2.4227429e-05 +4881 9.77 -1.7518243e-05 -2.4160700e-05 +4882 9.772 -1.7469988e-05 -2.4094155e-05 +4883 9.774 -1.7421866e-05 -2.4027794e-05 +4884 9.776 -1.7373877e-05 -2.3961615e-05 +4885 9.778 -1.7326019e-05 -2.3895618e-05 +4886 9.78 -1.7278294e-05 -2.3829803e-05 +4887 9.782 -1.7230700e-05 -2.3764169e-05 +4888 9.784 -1.7183237e-05 -2.3698716e-05 +4889 9.786 -1.7135905e-05 -2.3633444e-05 +4890 9.788 -1.7088703e-05 -2.3568351e-05 +4891 9.79 -1.7041632e-05 -2.3503437e-05 +4892 9.792 -1.6994689e-05 -2.3438702e-05 +4893 9.794 -1.6947877e-05 -2.3374145e-05 +4894 9.796 -1.6901193e-05 -2.3309766e-05 +4895 9.798 -1.6854637e-05 -2.3245564e-05 +4896 9.8 -1.6808210e-05 -2.3181539e-05 +4897 9.802 -1.6761911e-05 -2.3117691e-05 +4898 9.804 -1.6715739e-05 -2.3054018e-05 +4899 9.806 -1.6669695e-05 -2.2990521e-05 +4900 9.808 -1.6623777e-05 -2.2927198e-05 +4901 9.81 -1.6577986e-05 -2.2864050e-05 +4902 9.812 -1.6532321e-05 -2.2801076e-05 +4903 9.814 -1.6486782e-05 -2.2738275e-05 +4904 9.816 -1.6441368e-05 -2.2675647e-05 +4905 9.818 -1.6396079e-05 -2.2613191e-05 +4906 9.82 -1.6350915e-05 -2.2550908e-05 +4907 9.822 -1.6305875e-05 -2.2488796e-05 +4908 9.824 -1.6260960e-05 -2.2426855e-05 +4909 9.826 -1.6216168e-05 -2.2365085e-05 +4910 9.828 -1.6171499e-05 -2.2303484e-05 +4911 9.83 -1.6126954e-05 -2.2242054e-05 +4912 9.832 -1.6082531e-05 -2.2180792e-05 +4913 9.834 -1.6038230e-05 -2.2119699e-05 +4914 9.836 -1.5994052e-05 -2.2058775e-05 +4915 9.838 -1.5949995e-05 -2.1998018e-05 +4916 9.84 -1.5906060e-05 -2.1937429e-05 +4917 9.842 -1.5862245e-05 -2.1877006e-05 +4918 9.844 -1.5818552e-05 -2.1816750e-05 +4919 9.846 -1.5774978e-05 -2.1756660e-05 +4920 9.848 -1.5731525e-05 -2.1696735e-05 +4921 9.85 -1.5688191e-05 -2.1636975e-05 +4922 9.852 -1.5644977e-05 -2.1577380e-05 +4923 9.854 -1.5601882e-05 -2.1517949e-05 +4924 9.856 -1.5558905e-05 -2.1458681e-05 +4925 9.858 -1.5516047e-05 -2.1399577e-05 +4926 9.86 -1.5473306e-05 -2.1340636e-05 +4927 9.862 -1.5430684e-05 -2.1281857e-05 +4928 9.864 -1.5388179e-05 -2.1223239e-05 +4929 9.866 -1.5345791e-05 -2.1164783e-05 +4930 9.868 -1.5303520e-05 -2.1106489e-05 +4931 9.87 -1.5261365e-05 -2.1048354e-05 +4932 9.872 -1.5219326e-05 -2.0990380e-05 +4933 9.874 -1.5177403e-05 -2.0932565e-05 +4934 9.876 -1.5135596e-05 -2.0874910e-05 +4935 9.878 -1.5093904e-05 -2.0817413e-05 +4936 9.88 -1.5052326e-05 -2.0760075e-05 +4937 9.882 -1.5010863e-05 -2.0702895e-05 +4938 9.884 -1.4969514e-05 -2.0645872e-05 +4939 9.886 -1.4928280e-05 -2.0589006e-05 +4940 9.888 -1.4887158e-05 -2.0532297e-05 +4941 9.89 -1.4846150e-05 -2.0475744e-05 +4942 9.892 -1.4805255e-05 -2.0419346e-05 +4943 9.894 -1.4764473e-05 -2.0363104e-05 +4944 9.896 -1.4723803e-05 -2.0307017e-05 +4945 9.898 -1.4683245e-05 -2.0251084e-05 +4946 9.9 -1.4642798e-05 -2.0195306e-05 +4947 9.902 -1.4602463e-05 -2.0139681e-05 +4948 9.904 -1.4562239e-05 -2.0084209e-05 +4949 9.906 -1.4522126e-05 -2.0028890e-05 +4950 9.908 -1.4482124e-05 -1.9973723e-05 +4951 9.91 -1.4442231e-05 -1.9918708e-05 +4952 9.912 -1.4402449e-05 -1.9863845e-05 +4953 9.914 -1.4362776e-05 -1.9809132e-05 +4954 9.916 -1.4323212e-05 -1.9754571e-05 +4955 9.918 -1.4283757e-05 -1.9700160e-05 +4956 9.92 -1.4244411e-05 -1.9645898e-05 +4957 9.922 -1.4205174e-05 -1.9591786e-05 +4958 9.924 -1.4166044e-05 -1.9537823e-05 +4959 9.926 -1.4127022e-05 -1.9484009e-05 +4960 9.928 -1.4088108e-05 -1.9430342e-05 +4961 9.93 -1.4049301e-05 -1.9376824e-05 +4962 9.932 -1.4010601e-05 -1.9323453e-05 +4963 9.934 -1.3972007e-05 -1.9270229e-05 +4964 9.936 -1.3933520e-05 -1.9217151e-05 +4965 9.938 -1.3895138e-05 -1.9164220e-05 +4966 9.94 -1.3856863e-05 -1.9111434e-05 +4967 9.942 -1.3818692e-05 -1.9058794e-05 +4968 9.944 -1.3780627e-05 -1.9006299e-05 +4969 9.946 -1.3742667e-05 -1.8953948e-05 +4970 9.948 -1.3704812e-05 -1.8901742e-05 +4971 9.95 -1.3667060e-05 -1.8849679e-05 +4972 9.952 -1.3629413e-05 -1.8797760e-05 +4973 9.954 -1.3591869e-05 -1.8745984e-05 +4974 9.956 -1.3554429e-05 -1.8694350e-05 +4975 9.958 -1.3517091e-05 -1.8642858e-05 +4976 9.96 -1.3479857e-05 -1.8591508e-05 +4977 9.962 -1.3442725e-05 -1.8540300e-05 +4978 9.964 -1.3405696e-05 -1.8489233e-05 +4979 9.966 -1.3368768e-05 -1.8438306e-05 +4980 9.968 -1.3331943e-05 -1.8387520e-05 +4981 9.97 -1.3295218e-05 -1.8336873e-05 +4982 9.972 -1.3258595e-05 -1.8286366e-05 +4983 9.974 -1.3222073e-05 -1.8235998e-05 +4984 9.976 -1.3185651e-05 -1.8185769e-05 +4985 9.978 -1.3149329e-05 -1.8135678e-05 +4986 9.98 -1.3113108e-05 -1.8085725e-05 +4987 9.982 -1.3076986e-05 -1.8035909e-05 +4988 9.984 -1.3040964e-05 -1.7986231e-05 +4989 9.986 -1.3005041e-05 -1.7936690e-05 +4990 9.988 -1.2969217e-05 -1.7887285e-05 +4991 9.99 -1.2933492e-05 -1.7838016e-05 +4992 9.992 -1.2897865e-05 -1.7788883e-05 +4993 9.994 -1.2862337e-05 -1.7739885e-05 +4994 9.996 -1.2826906e-05 -1.7691022e-05 +4995 9.998 -1.2791572e-05 -1.7642293e-05 + diff --git a/examples/nb3b/data.NaPO3 b/examples/nb3b/data.NaPO3 new file mode 100644 index 0000000000..9db7e97ab3 --- /dev/null +++ b/examples/nb3b/data.NaPO3 @@ -0,0 +1,6020 @@ +LAMMPS data file via write_data, version 3 Aug 2023, timestep = 0, units = metal + +3000 atoms +3 atom types + +0 34.33782 xlo xhi +0 34.33782 ylo yhi +0 34.33782 zlo zhi + +Masses + +1 30.973762 +2 22.98976928 +3 15.9994 + +Atoms # charge + +8 1 3 1.8228596003598336 5.87510492688523 3.5062216239063626 0 0 0 +17 1 3 33.5723745447357 0.5375481258233651 3.8861638381362598 -1 0 0 +34 1 3 3.184933838096731 2.8311921099836765 5.164134822893228 0 0 0 +122 1 3 0.2370455745732013 4.372425131512704 7.54150797495957 0 0 0 +2961 3 -1.2 30.697407751732634 12.621061288706011 10.877176004694533 0 0 0 +1707 3 -1.2 12.3866317679469 11.97008050069813 10.482129353238545 0 0 0 +318 1 3 3.4858438136007606 4.520547981195128 1.363444333226657 0 0 0 +2958 3 -1.2 28.400787036084672 16.093543678904396 13.83941720223406 0 0 0 +458 1 3 33.749416075600095 4.741468617297005 4.6740969760068705 -1 0 0 +582 1 3 3.0593218994819846 3.5998240999490476 7.959064854740526 0 0 0 +2928 3 -1.2 27.93491158508066 12.130073721291792 13.565876649432077 0 0 0 +2807 3 -1.2 30.944427068568565 14.427453685922131 9.19235161047031 0 0 0 +782 2 0.6 0.28288503013923894 7.188860597571288 6.003881058807563 0 0 0 +2651 3 -1.2 27.50283296936166 15.480351807341014 8.923498916017095 0 0 0 +2619 3 -1.2 29.560955108562094 13.010220958747707 15.214294796064776 0 0 0 +1081 2 0.6 2.1001400722641788 1.4407841249642783 2.6310621865527515 0 0 0 +2596 3 -1.2 28.206227044747862 13.670025701498188 11.680622025211967 0 0 0 +584 1 3 19.910813483394687 14.765538517207547 12.498288312580092 0 0 0 +2592 3 -1.2 30.24617420399123 15.720368595458117 17.126420533088975 0 0 0 +1418 3 -1.2 34.026842304390044 3.010028930026641 7.503038098214573 -1 0 0 +1468 3 -1.2 1.1129934358525364 6.999764658255995 2.8670269774364625 0 0 0 +289 1 3 0.7971138163005053 3.720423599365621 0.3203086740122359 0 0 0 +2450 3 -1.2 27.83994140550279 11.222021949910367 11.22495605557564 0 0 0 +1547 3 -1.2 34.127502022299 1.569280415791703 3.0220282639712077 -1 0 0 +1576 3 -1.2 2.3957808294164895 6.2772727415252625 4.821112884850933 0 0 0 +1664 3 -1.2 32.78545834371478 3.6200071646788192 4.613386796565437 -1 0 0 +1686 3 -1.2 5.187414626819637 5.809560215560438 6.828801754128944 0 0 0 +1704 3 -1.2 3.718249398587753 3.036722961891026 6.678678942613548 0 0 0 +1932 3 -1.2 0.7518754594183069 4.756883054720914 3.8017697660892433 0 0 0 +569 1 3 25.765866719197614 9.15789898544425 12.973470090013436 0 0 0 +191 1 3 20.47898434174292 8.870649134062761 10.612831154514424 0 0 0 +2086 3 -1.2 2.9558995063443207 5.455654934825284 2.462137804241733 0 0 0 +2157 3 -1.2 34.24983807359828 5.033781002280117 6.169927897434142 -1 0 0 +6 1 3 21.06882093883699 15.884831991448587 16.83547943279087 0 0 0 +2225 3 -1.2 5.151075983865144 1.2402032969078276 0.6837811819178949 0 0 0 +2398 3 -1.2 29.246657760866544 10.606949877527057 15.205574302728138 0 0 0 +2088 3 -1.2 10.3049162634082 3.6176100147280743 0.8506571757770954 0 0 0 +2317 3 -1.2 5.59707186075629 6.054378880723959 2.1477523521609925 0 0 0 +2318 3 -1.2 3.4033169644554495 1.5541425495222554 4.448975001106595 0 0 0 +2333 3 -1.2 4.7327075340583455 3.5914226675211354 1.22692651098072 0 0 0 +2891 3 -1.2 16.49446327774468 11.844102607816644 8.839289765033168 0 0 0 +2541 3 -1.2 1.7349557060090126 2.926142730564026 5.482756437635006 0 0 0 +2548 3 -1.2 5.629882876940062 6.868190197095866 4.58639897539239 0 0 0 +2656 3 -1.2 31.936250635835666 6.188240192140672 7.086542776075716 -1 0 0 +1363 3 -1.2 10.02812650523174 1.228975179586754 0.7578128940749129 0 0 0 +2906 3 -1.2 3.796844383004932 3.866175669665926 4.308257722475782 0 0 0 +2916 3 -1.2 0.06387627177346021 4.814565327885862 0.9453037463439108 0 0 0 +2998 3 -1.2 33.05358421716851 5.973900637111086 4.194018532156243 -1 0 0 +11 1 3 5.125385690643427 5.7084809905452545 8.410933828301461 0 0 0 +2148 3 -1.2 29.636357987071232 7.504182611122242 12.980479879837201 0 0 0 +203 1 3 10.634289131337653 2.34594791856994 1.7316816963443238 0 0 0 +222 1 3 14.879656798461301 0.2958188477203788 7.488830394817911 0 0 0 +225 1 3 5.764391784399813 7.262132317661055 3.0439498642692486 0 0 0 +342 1 3 12.629127890393836 3.725023438061583 7.982760509092106 0 0 0 +2124 3 -1.2 31.116008337586443 14.182901017241301 12.856869594537924 0 0 0 +1940 3 -1.2 26.158199155880396 9.343830525683826 11.41488470181813 0 0 0 +505 1 3 13.216210333802689 3.2921898239118965 2.561753634990455 0 0 0 +549 1 3 9.152954560978827 5.634224636313086 5.921240953248451 0 0 0 +2219 3 -1.2 30.944947561366018 0.3163886539575838 3.4838084627097836 0 0 0 +573 1 3 6.196203823902112 5.819928137239532 5.597537073065396 0 0 0 +1966 3 -1.2 3.4927380069567433 5.451395349821202 0.08965098226947106 0 0 0 +588 1 3 11.593170788536568 8.238513625008896 3.0680629301141082 0 0 0 +596 1 3 5.2262369704180385 2.5690915364034423 0.05761374226515607 0 0 0 +623 2 0.6 10.787356338330996 8.565121414195154 6.473338045443549 0 0 0 +649 2 0.6 15.077085401221376 1.7138922627443811 0.3128346335307952 0 0 0 +684 2 0.6 10.666500249206777 3.5591567949675635 4.70166733076542 0 0 0 +716 2 0.6 13.203642475698972 0.5099672283760172 4.2994422826146215 0 0 0 +735 2 0.6 13.341897976904448 7.799817850452832 0.29172316243779417 0 0 0 +2503 3 -1.2 2.202092827720077 3.5881443041544583 1.1105000889744994 0 0 0 +2840 3 -1.2 19.670212193466593 8.353895876329942 13.425602487452794 0 0 0 +815 2 0.6 12.618339240196994 2.379314216157603 5.5873233436255125 0 0 0 +845 2 0.6 6.845076220158212 0.6157769344531513 6.685728577784767 0 0 0 +1001 2 0.6 7.691160893215583 4.973779078257769 2.9037324169636425 0 0 0 +1023 2 0.6 14.77808445445625 3.72347714760589 5.379378133679625 0 0 0 +1041 2 0.6 9.348505986446199 6.833416160263685 2.4534289204924407 0 0 0 +1666 3 -1.2 10.354671089943698 12.713915786686298 11.845613247705973 0 0 0 +1089 2 0.6 8.078052841742835 2.426185054636776 5.410175156181848 0 0 0 +1135 2 0.6 6.061592363516195 2.8824404664415098 3.4483709829785965 0 0 0 +1082 2 0.6 33.067195708943885 14.326925029155769 16.85186245579751 -1 0 0 +1202 3 -1.2 7.7300627334886505 0.6128797235614499 1.5893680414579219 0 0 0 +1273 3 -1.2 10.041182931367445 6.459930488394309 6.752118264252442 0 0 0 +2790 3 -1.2 18.698663552789284 10.352107863221546 8.696923055984517 0 0 0 +1308 3 -1.2 14.008478627759914 0.7563970512501356 6.410523602876454 0 0 0 +1344 3 -1.2 13.910512670453327 2.459991563665669 3.5785446874682187 0 0 0 +2496 3 -1.2 14.26275196533474 12.55437432957031 0.057049817919180394 0 0 0 +1599 3 -1.2 30.3934761763685 11.811096653218904 13.221594172156172 0 0 0 +1453 3 -1.2 7.598057635818902 6.16897169319817 6.1733185397543835 0 0 0 +1645 3 -1.2 9.11288571171751 0.5032320155394738 6.389345313591313 0 0 0 +560 1 3 8.956225366522052 4.263972780787976 0.42138041054240266 0 0 0 +2763 3 -1.2 17.915430169372115 10.892609163940012 13.452742223281668 0 0 0 +1888 3 -1.2 14.935255379938596 6.792014286636484 1.8909144763129722 0 0 0 +1915 3 -1.2 14.744406093871604 7.610211712186383 8.111338604936435 0 0 0 +1998 3 -1.2 13.942714325429854 3.7396674998662247 1.3493745015296459 0 0 0 +2684 3 -1.2 18.31042134805579 11.333352881153932 10.92161099281336 0 0 0 +2085 3 -1.2 6.456771896304846 4.584630133017286 4.831658121295312 0 0 0 +2580 3 -1.2 16.532573776555584 12.901815344045703 15.42859041555858 0 0 0 +2164 3 -1.2 9.171585482380756 5.622176168018752 4.423916832858168 0 0 0 +2173 3 -1.2 12.11300781317177 2.1390336280135736 1.946992000654117 0 0 0 +2188 3 -1.2 11.73915450864615 7.086373018379213 2.137315483015844 0 0 0 +2387 3 -1.2 11.910863381919985 9.665135335491941 0.043617148205173616 0 0 0 +2204 3 -1.2 9.28186238877823 4.20449401967803 6.333880612061862 0 0 0 +2215 3 -1.2 11.187871457479789 0.8856134417791364 5.0918611139144785 0 0 0 +2234 3 -1.2 7.834962301662877 3.5993618365517723 1.1604472494671545 0 0 0 +2302 3 -1.2 13.072601858437853 7.552983140970049 5.635940502101293 0 0 0 +2446 3 -1.2 18.31216539758974 7.074186446591256 15.07778959983515 0 0 0 +2330 3 -1.2 5.0709405865282156 13.122581416169801 0.7550178311680203 0 0 0 +2455 3 -1.2 7.358168985606684 0.5430731020399615 3.942240768461119 0 0 0 +693 2 0.6 23.64510051654558 16.85088238082749 9.233917287134679 0 0 0 +2523 3 -1.2 12.100811330686883 4.117383013989126 3.0842753884279475 0 0 0 +2549 3 -1.2 9.782854897759485 2.3575693007868823 2.921077135195698 0 0 0 +1930 3 -1.2 22.785932961046914 0.09118353013740653 15.257340503312522 0 0 0 +2957 3 -1.2 12.768260575061184 4.329532391969262 6.624577591065975 0 0 0 +213 1 3 20.19711279325501 5.031568286855892 6.641786910149037 0 0 0 +1498 3 -1.2 30.685169592917255 11.948002274493305 8.473450089298108 0 0 0 +464 1 3 15.435080932292966 6.357110619331396 3.231251730634334 0 0 0 +512 1 3 17.098416327823067 2.2273321576210647 6.810066808729312 0 0 0 +1199 2 0.6 23.01704455167944 1.8460378058308333 9.671691780904007 0 0 0 +615 2 0.6 18.140502106360138 1.6776064085734577 0.26363526691198486 0 0 0 +619 2 0.6 18.361303784581477 7.859461434749044 2.5618864760772437 0 0 0 +779 2 0.6 17.3261645886555 6.640682104898295 1.014836720901021 0 0 0 +835 2 0.6 18.531106780313802 4.324259965007819 2.6883202268587447 0 0 0 +1045 2 0.6 18.208294227414285 1.381646179992118 3.4304115979114185 0 0 0 +1191 2 0.6 16.28651569673256 3.8753290338420885 0.937442232616161 0 0 0 +1467 3 -1.2 27.28104490452926 9.878764583499917 9.186789580670752 0 0 0 +1345 3 -1.2 28.57681130631935 8.799479828136409 11.008805666034675 0 0 0 +1351 3 -1.2 16.878383718624406 8.235660543720002 6.943020663478171 0 0 0 +1406 3 -1.2 20.264272641793983 2.382358498268816 3.5499644342898518 0 0 0 +1293 3 -1.2 27.152035261746736 9.397595375027551 13.484448832656165 0 0 0 +1137 2 0.6 30.083486815125166 15.187899518599686 14.780481713938116 0 0 0 +2401 3 -1.2 15.036776106431523 15.210693037606696 10.786141661501212 0 0 0 +1905 3 -1.2 18.490499375925605 1.4758783434425842 6.9726334982061 0 0 0 +2267 3 -1.2 15.787820563070165 8.014740798868225 14.321498325771165 0 0 0 +1995 3 -1.2 16.719603319289924 2.1316933116198635 5.385914282619352 0 0 0 +2008 3 -1.2 20.050852161175186 4.0120939613664355 5.405757901089055 0 0 0 +2015 3 -1.2 16.91156689502158 6.073525123528359 3.1340481287857855 0 0 0 +2356 3 -1.2 14.749868491357551 5.139288382210879 3.7548570006848507 0 0 0 +2381 3 -1.2 16.649525647303083 1.7314622552489785 1.8743953461959773 0 0 0 +917 2 0.6 27.143670604968314 9.681447285762887 15.997220238114913 0 0 0 +2473 3 -1.2 16.989450285935945 3.5915396400375452 7.329022706162237 0 0 0 +910 2 0.6 26.450286162691434 13.30643739883064 15.592138668258315 0 0 0 +2673 3 -1.2 19.34173285755745 6.214248909579634 6.52179745065282 0 0 0 +2734 3 -1.2 21.18932691275593 7.463852745990761 3.6327475087984333 0 0 0 +2922 3 -1.2 15.137485700483756 7.503806333858288 4.27470062197817 0 0 0 +2951 3 -1.2 18.359236884467634 4.619873376051784 0.26122340837061997 0 0 0 +38 1 3 24.816988756166324 4.160958904445498 6.905368602865206 0 0 0 +63 1 3 22.129279715850583 5.792184560366883 1.7258760439413 0 0 0 +868 2 0.6 29.844640538271136 15.950067416368196 11.646522957324878 0 0 0 +285 1 3 23.260336226129755 1.804396044571201 5.926679989260175 0 0 0 +1654 3 -1.2 11.503804005659727 8.278931569974432 16.17615432794268 0 0 0 +703 2 0.6 31.50402532327435 17.05771223951092 9.279599763035264 0 0 0 +372 1 3 21.030496793958093 3.128600083629055 4.569472060759473 0 0 0 +2205 3 -1.2 17.167236941528504 16.262620570630578 10.24892627824235 0 0 0 +629 2 0.6 25.41145871697226 6.650980675312553 2.5324447774882324 0 0 0 +672 2 0.6 24.431448252000397 4.1838646078887 3.502175023663834 0 0 0 +660 2 0.6 27.4372644663658 15.972114927668642 11.742575060508866 0 0 0 +719 2 0.6 21.903874324800395 2.81438757104636 1.8805569633193675 0 0 0 +752 2 0.6 22.732830830118207 6.373778841378722 4.853180891874569 0 0 0 +627 2 0.6 30.935112973012266 9.707819140347835 10.053110003878716 0 0 0 +603 2 0.6 26.852668040812517 15.637842880595832 15.377269219366996 0 0 0 +1871 3 -1.2 19.206844940554202 13.891634378498571 13.469180199305672 0 0 0 +934 2 0.6 34.20545704676974 0.37993301613661085 1.019934709266085 -1 0 0 +762 2 0.6 7.389705778524074 17.118990107149518 15.888560298979044 0 0 0 +1538 3 -1.2 24.10314051087794 1.8162424145039802 4.697187009822323 0 0 0 +1626 3 -1.2 21.76491818818874 2.100247350326784 5.535270593923806 0 0 0 +1657 3 -1.2 19.899057036739958 4.116062417160987 7.870819241158122 0 0 0 +1741 3 -1.2 25.068359558255533 4.013191372005472 0.5671485688760626 0 0 0 +692 2 0.6 6.717646557480478 9.197210513884611 1.1850044101999335 0 0 0 +1987 3 -1.2 23.768865690162635 2.9988477928595354 6.848911206921669 0 0 0 +2087 3 -1.2 23.33798148096364 6.044667912476271 2.531974985465457 0 0 0 +2104 3 -1.2 22.21325173211058 3.877401990277711 4.086946268154399 0 0 0 +2222 3 -1.2 24.592364393192106 7.495951095474721 5.379186724796142 0 0 0 +2282 3 -1.2 22.764891861561303 4.712741210707209 0.6633079795207264 0 0 0 +2309 3 -1.2 21.64592022210278 5.3253980745912575 6.617966640852154 0 0 0 +1758 3 -1.2 16.62861785314105 9.159019113750952 9.223313856097084 0 0 0 +1724 3 -1.2 19.211671709781616 16.201406376238065 12.50593471851688 0 0 0 +2659 3 -1.2 21.716339345800833 6.960875484332111 0.7650451363813008 0 0 0 +2699 3 -1.2 22.551222241637795 0.6500636821567315 1.8072497502838032 0 0 0 +891 2 0.6 9.981668319834668 17.085614621179452 0.9939152739129233 0 0 0 +1695 3 -1.2 18.8866672093461 8.894372714271833 10.552089215583093 0 0 0 +2846 3 -1.2 24.220543649421433 5.393693203082043 7.666267175183327 0 0 0 +2151 3 -1.2 7.649319392583413 13.370772877335787 8.217932606990376 0 0 0 +2908 3 -1.2 23.47751594569011 0.507806700937784 6.614001512568061 0 0 0 +2242 3 -1.2 10.671628661819751 9.044682671440839 14.049714344732488 0 0 0 +2940 3 -1.2 20.845441860260575 5.162523737022697 2.126749268092696 0 0 0 +145 1 3 28.221177842544627 0.3911404140810752 5.459463655677135 0 0 0 +159 1 3 28.506399659282717 1.9532541195051996 0.9117370541153925 0 0 0 +531 1 3 27.40629627179996 9.821430234140855 10.651071354273506 0 0 0 +1573 3 -1.2 16.78286293242739 10.085992840488297 11.375013139207619 0 0 0 +284 1 3 27.696171077741095 4.7789713169058246 0.3464529556665972 0 0 0 +2456 3 -1.2 27.756270800816807 3.1860363321056577 0.28093718881104024 0 0 0 +656 2 0.6 31.04298922685021 4.127017923815153 2.862017235501279 0 0 0 +658 2 0.6 29.115643170053673 6.114788210125984 2.892737299652025 0 0 0 +1572 3 -1.2 19.989499640979194 16.09764163171018 15.814323731953337 0 0 0 +811 2 0.6 28.67450336617217 6.384916399908791 5.9395130975475015 0 0 0 +836 2 0.6 28.168045087665206 3.8562236892281754 6.494967213281092 0 0 0 +972 2 0.6 31.00078988415413 6.4179824978227655 4.853598421833192 0 0 0 +998 2 0.6 30.595416447965164 2.568540218062925 4.528098091364968 0 0 0 +1125 2 0.6 27.561171585851874 3.673400364546202 3.9694631376863625 0 0 0 +1184 2 0.6 31.02672435453094 4.06639037549849 7.051161665199886 0 0 0 +1461 3 -1.2 27.393696057086437 0.7750347987784595 0.8768261500932388 0 0 0 +2753 3 -1.2 11.066882521375806 1.5436257303651941 17.126470420092467 0 0 0 +1791 3 -1.2 22.192907816518446 16.90284759389284 16.605002157828803 0 0 0 +1543 3 -1.2 33.651136123770726 0.5606327941722694 5.319791250232987 -1 0 0 +2002 3 -1.2 25.293428153511687 4.496253887843739 5.553647226443952 0 0 0 +2080 3 -1.2 27.743141245545694 1.7661481967080417 5.3552697776445095 0 0 0 +2423 3 -1.2 25.223419010657725 16.805361151933894 1.9494341430740598 0 0 0 +2264 3 -1.2 29.530916101615585 4.665729894341677 4.486494888591105 0 0 0 +2429 3 -1.2 29.24381165335954 5.14426401554394 0.1859015181510137 0 0 0 +1319 3 -1.2 19.26326580794803 11.414772082660203 16.91410095665116 0 0 0 +2463 3 -1.2 26.650606076792183 7.136250897858355 6.745781515036149 0 0 0 +2494 3 -1.2 30.42547123815706 8.088607669085949 6.664179646845857 0 0 0 +2698 3 -1.2 29.631071045059315 0.3049619146754569 6.13990670031101 0 0 0 +2825 3 -1.2 28.958540243049022 2.3431804657991218 2.249896354783249 0 0 0 +2834 3 -1.2 27.306355031725392 5.400209061391878 1.62891323739481 0 0 0 +163 1 3 27.40609807645922 12.5069231996507 12.10331143382893 0 0 0 +2966 3 -1.2 30.065794171407465 8.025315694176975 3.6168946099041146 0 0 0 +12 1 3 1.6220059168633032 14.613397822152786 2.137565484370139 0 0 0 +53 1 3 34.10218895163492 10.858257676407556 2.964541469755975 -1 0 0 +126 1 3 0.2098135881608339 9.85408071715391 5.664070030296013 0 0 0 +209 1 3 2.6217891895067953 11.957920551762607 2.853951283574642 0 0 0 +2391 3 -1.2 8.925114384163926 16.225364076026906 14.406478573274374 0 0 0 +1253 3 -1.2 16.394335878347242 12.43889956911168 12.15556741690782 0 0 0 +426 1 3 1.964343044347403 12.122750379390265 6.5964139519322265 0 0 0 +548 1 3 4.042651190847374 12.181160299353666 0.2505307825503917 0 0 0 +718 2 0.6 33.763329870115385 13.802908022018148 4.9688795714723595 -1 0 0 +774 2 0.6 4.7845013810466535 12.242921294341409 5.262186973085306 0 0 0 +557 1 3 5.454316121777518 8.078615659380779 16.409913118322134 0 0 0 +873 2 0.6 5.0852795714249055 9.908854774201167 5.899257301527475 0 0 0 +923 2 0.6 5.523172160277404 10.951031853092395 2.668644146773366 0 0 0 +1347 3 -1.2 11.852613169320815 15.605360501322147 10.752587596352669 0 0 0 +976 2 0.6 2.872195914698283 8.711262505400228 3.9724610559785374 0 0 0 +1170 2 0.6 2.655879064030566 15.556006545435208 5.333866653012758 0 0 0 +1187 2 0.6 3.1248978810241264 9.05434076068433 7.178046941577896 0 0 0 +1404 3 -1.2 1.4170997815328406 9.58013715715741 1.8297419153653036 0 0 0 +1421 3 -1.2 5.6172224452265835 13.376803523881339 3.4014540209129773 0 0 0 +1435 3 -1.2 33.24429774376179 9.546158199553354 6.2893341733041055 -1 0 0 +1499 3 -1.2 1.4043173137759493 8.993758848787095 5.872017880962093 0 0 0 +1533 3 -1.2 31.694044922444338 14.239980292062926 5.599241836434841 -1 0 0 +1539 3 -1.2 0.8231365812889085 15.228742460685625 3.2185649491136115 0 0 0 +1042 2 0.6 16.43575020015038 14.295008593103923 13.531238169133472 0 0 0 +1622 3 -1.2 4.34879063294917 15.479327210783381 3.8971855675574933 0 0 0 +1722 3 -1.2 1.7856562152982423 15.16789826008646 7.4559402903682335 0 0 0 +1763 3 -1.2 3.101039513712694 11.199798281891479 6.802173262471717 0 0 0 +1766 3 -1.2 1.1151764522943395 11.745868794933294 3.1533801947654694 0 0 0 +1025 2 0.6 14.671627256549009 11.511289941803854 15.810298946662574 0 0 0 +1813 3 -1.2 3.16352469732681 11.623302780654235 1.4024735338648942 0 0 0 +1825 3 -1.2 5.672513105772113 15.395463575605875 1.7944138279943833 0 0 0 +1012 2 0.6 17.100078172474873 10.76993193331919 15.786767836388053 0 0 0 +2156 3 -1.2 2.3978949016133346 15.487447280411425 1.2248882437205943 0 0 0 +690 2 0.6 17.672315819581463 13.725817831958995 9.82356496611769 0 0 0 +2251 3 -1.2 0.6780050926363054 11.322940315761715 6.048094838015902 0 0 0 +2281 3 -1.2 34.326109577863996 9.76028067450365 4.101063598879842 -1 0 0 +2303 3 -1.2 2.67619021345124 13.516583387875 2.7133884410406153 0 0 0 +686 2 0.6 14.709993035054392 14.456721591461074 15.430953209472964 0 0 0 +2419 3 -1.2 33.09118659188431 11.699781689287772 3.7694990595182225 -1 0 0 +2498 3 -1.2 33.15481333817167 17.035422796749096 0.37485650318401165 -1 0 0 +2515 3 -1.2 4.8001034475511215 8.294639936690308 2.591348872524802 0 0 0 +2597 3 -1.2 2.284067094156926 13.082870773834115 5.520253982615054 0 0 0 +621 2 0.6 18.152115050963754 14.545496722707949 15.669729371706962 0 0 0 +2736 3 -1.2 33.56199018857875 10.810057942290012 1.5789496024904957 -1 0 0 +2743 3 -1.2 3.4468734506916476 11.169509307374188 3.775006222983322 0 0 0 +2751 3 -1.2 0.7787222975551522 13.654151573320712 1.3134340996787754 0 0 0 +2949 3 -1.2 4.39100617067191 16.74425930090203 7.2679032134947 0 0 0 +2991 3 -1.2 1.5005314314771256 12.840535260021406 7.8994390500273575 0 0 0 +93 1 3 5.5251004820425695 14.853014281869871 3.2898451575148684 0 0 0 +113 1 3 9.357159783290546 14.409820172885402 2.504591007627544 0 0 0 +125 1 3 13.698210345660765 12.39192962609301 1.4563135878800573 0 0 0 +498 1 3 17.32911916441924 11.311655386234838 12.181263708524865 0 0 0 +176 1 3 7.649996430583427 9.9669102517475 7.597887943781673 0 0 0 +248 1 3 10.512721638203779 9.189046740091621 0.5145828588369955 0 0 0 +493 1 3 19.704979303444116 11.343280358097777 7.973806073291758 0 0 0 +354 1 3 13.9409176582109 8.415852682250383 4.8108974940155 0 0 0 +356 1 3 10.658535989107017 11.512424274751867 5.059616036713927 0 0 0 +459 1 3 7.880542756387041 14.68226710430678 5.13285679240167 0 0 0 +475 1 3 11.116424655463083 12.065858732914755 7.825842346967625 0 0 0 +515 1 3 5.905805828224932 15.201665655521213 0.2226524946642345 0 0 0 +452 1 3 15.108335213457853 12.014949000542016 8.214167796362021 0 0 0 +1768 3 -1.2 6.378645280523506 11.801054396371576 15.85115498028605 0 0 0 +643 2 0.6 13.371176580149273 13.769773065689371 4.960673753659656 0 0 0 +651 2 0.6 8.853423909575097 15.459527125705208 8.233347510933857 0 0 0 +307 1 3 17.752761744502596 10.013413635762143 10.001316755321112 0 0 0 +819 2 0.6 11.337884871667493 14.654790570108824 6.234406445762218 0 0 0 +842 2 0.6 10.812828979675967 15.032426593532104 0.29006282771660824 0 0 0 +888 2 0.6 8.357986460498209 9.754460499854503 2.9435410840763923 0 0 0 +941 2 0.6 11.08126023596597 11.623527793763676 2.2841690814096305 0 0 0 +943 2 0.6 8.420227794144337 8.7139765092658 4.699203188208425 0 0 0 +970 2 0.6 12.705478094553884 15.55001265376947 2.4929128986588505 0 0 0 +1166 2 0.6 7.516801678667312 11.900362296177786 3.550034678748337 0 0 0 +1217 3 -1.2 9.647690947278262 13.168141691207184 1.7240978715428343 0 0 0 +1400 3 -1.2 6.243969858998785 16.880732062958835 0.06499158898306741 0 0 0 +1641 3 -1.2 9.195713009543681 11.594960419981419 14.416325704928365 0 0 0 +1442 3 -1.2 7.161514881936357 13.42980358354603 5.789061842422809 0 0 0 +2091 3 -1.2 6.899910215317973 9.98401418180627 11.42944975601543 0 0 0 +1596 3 -1.2 7.204718313604991 7.618270013701662 2.8916596565255466 0 0 0 +1603 3 -1.2 8.683226316363557 9.496254132393396 6.641562359529139 0 0 0 +1634 3 -1.2 6.65942137004763 15.892401812270904 6.752252529148516 0 0 0 +1678 3 -1.2 15.827444000368605 12.353251696593984 4.117088848707607 0 0 0 +1714 3 -1.2 9.05582440812752 15.072934348478551 5.9171633763670535 0 0 0 +1732 3 -1.2 15.33828603322244 12.41867579909505 6.659667498643708 0 0 0 +1786 3 -1.2 6.885724110871477 11.271689945685669 7.015434258746191 0 0 0 +1840 3 -1.2 14.825181564175713 15.966231269006704 3.613207199170957 0 0 0 +1868 3 -1.2 10.299788272907398 8.503940308029884 9.214954631589173 0 0 0 +670 2 0.6 16.98364587908929 0.32598574942205155 12.708396377019408 0 0 0 +1956 3 -1.2 16.127342427945283 15.923581014796639 5.760805680893282 0 0 0 +2016 3 -1.2 11.368784840075628 12.62445903772358 4.365051890876006 0 0 0 +2063 3 -1.2 10.187310927233826 11.970192361710424 6.505668299394642 0 0 0 +2102 3 -1.2 12.296966318528975 12.683079400208037 7.175689274586963 0 0 0 +2123 3 -1.2 10.597975996766333 15.20874004795201 2.6276510986077755 0 0 0 +10 1 3 15.697871012294561 16.34860249620227 10.117366072909244 0 0 0 +2177 3 -1.2 13.520539705995125 11.088896453849145 2.0013265589433265 0 0 0 +2942 3 -1.2 8.25016177800817 10.473278615163403 8.851686317180144 0 0 0 +2178 3 -1.2 24.63368185929118 0.27842141618328364 13.565629649558966 0 0 0 +2470 3 -1.2 8.434677386341638 15.334182519249369 1.7646198567942926 0 0 0 +2472 3 -1.2 13.034047847417835 8.619123257155909 3.521123455025941 0 0 0 +2937 3 -1.2 15.166241592517405 7.693292106015787 11.959974407348513 0 0 0 +2883 3 -1.2 13.224333415072573 13.038853665244028 15.398065043953338 0 0 0 +2505 3 -1.2 12.37482496856758 15.860929583153142 4.79364316218136 0 0 0 +2556 3 -1.2 8.647126838796451 14.006856085436548 3.8435484293039566 0 0 0 +2628 3 -1.2 9.017450028241095 8.840132210842107 0.9693992493443016 0 0 0 +2660 3 -1.2 10.550528421142733 8.038655436477297 4.08863837877901 0 0 0 +2689 3 -1.2 9.510711019300182 11.12052791259004 4.187491816021347 0 0 0 +1649 3 -1.2 9.358115862478844 16.87422604270051 11.96733530604074 0 0 0 +2759 3 -1.2 7.675905738150477 11.38606443916342 1.0308112758370624 0 0 0 +2815 3 -1.2 10.974003153591296 9.321233397515643 2.1062001297043023 0 0 0 +2858 3 -1.2 14.524348522479807 9.643881351386474 5.34654778891758 0 0 0 +2863 3 -1.2 6.779457851221646 15.34299549990603 4.181231836942948 0 0 0 +2936 3 -1.2 11.549920014177694 10.356308457292243 5.341603355853948 0 0 0 +2967 3 -1.2 6.505186435657284 10.039005929397982 4.274244557675488 0 0 0 +60 1 3 15.495970530331466 15.773122550251424 7.26951593770238 0 0 0 +89 1 3 20.915924969003544 8.913716377787894 3.5176396533616168 0 0 0 +154 1 3 18.641042926314285 15.883189561740872 2.8548094879269454 0 0 0 +200 1 3 16.339367755978017 12.23766836974287 5.505319955209417 0 0 0 +218 1 3 16.18013045515762 7.99673590118485 8.232232511834146 0 0 0 +277 1 3 16.086333154651445 16.368133104838762 4.256463305165464 0 0 0 +2871 3 -1.2 15.250988499594165 16.6190462743386 8.646524158928058 0 0 0 +491 1 3 18.867981111433604 13.59550936248926 6.219981702638131 0 0 0 +669 2 0.6 14.89124294068493 9.256764705228388 1.5297530357482763 0 0 0 +1475 3 -1.2 14.510410879186521 13.160086990698964 8.93045061570829 0 0 0 +788 2 0.6 16.914453965748915 9.020601123882352 4.831532203241428 0 0 0 +851 2 0.6 18.953349937364813 8.73806910126358 6.266275606562154 0 0 0 +911 2 0.6 18.182654907740417 10.88288498191213 3.7659462216920208 0 0 0 +999 2 0.6 18.9200002287705 15.841497660972857 8.76665570960279 0 0 0 +1200 2 0.6 16.862979294929346 11.427546697250941 1.9482412663697013 0 0 0 +1320 3 -1.2 19.393694548905977 11.537873074080075 2.0267092309446713 0 0 0 +1323 3 -1.2 16.548009573216554 14.904377949341653 7.902262257163476 0 0 0 +946 2 0.6 9.596768550324851 1.9682309837327467 8.15717668645043 0 0 0 +1434 3 -1.2 17.22363418920935 15.562603725832583 3.404867638745535 0 0 0 +1623 3 -1.2 16.187880446743346 15.95581395764611 16.312657078228966 0 0 0 +1723 3 -1.2 19.64257838468673 9.24923649788804 4.215199794734691 0 0 0 +1802 3 -1.2 16.842083651093045 9.364370602102408 2.5860390121585657 0 0 0 +1955 3 -1.2 19.558518476240625 15.926129859675314 3.9999109629880305 0 0 0 +2058 3 -1.2 19.28791487902189 14.696885979533324 1.9849260855605617 0 0 0 +2175 3 -1.2 17.398414796912785 13.444297505320865 5.678967482735201 0 0 0 +2193 3 -1.2 19.69565055568496 13.014325168937322 5.1413932812645315 0 0 0 +755 2 0.6 29.74086160186781 8.575774638609255 16.664177956657007 0 0 0 +2504 3 -1.2 19.40603063961719 14.861347755991765 6.753976318662836 0 0 0 +2081 3 -1.2 12.079406572321084 11.128203443403324 12.765121207242503 0 0 0 +2725 3 -1.2 19.29751834930337 7.4200095182725505 0.3915055928699 0 0 0 +2767 3 -1.2 17.227061016103484 11.071520021606098 5.7342897821776875 0 0 0 +2987 3 -1.2 13.499474306154388 13.610089315787619 2.1512639256121817 0 0 0 +23 1 3 25.271564738007648 9.847082168023848 1.997345520468332 0 0 0 +2676 3 -1.2 13.116365619038376 9.34178131966574 14.64232770325298 0 0 0 +1618 3 -1.2 14.388668788941118 10.737046703984408 8.276580778655099 0 0 0 +322 1 3 20.180176896761125 10.592632433767365 1.202807883480694 0 0 0 +412 1 3 24.653569823455683 13.143192358615735 9.121912569797823 0 0 0 +437 1 3 26.621126388502805 9.89237736680894 4.698004173192933 0 0 0 +570 1 3 20.782777477458765 14.454039527869542 1.5542210868601567 0 0 0 +590 1 3 23.51388717455849 13.697889338905995 6.383777938843604 0 0 0 +652 2 0.6 23.95340505482794 15.294607060581798 1.2972792794516144 0 0 0 +681 2 0.6 25.227811603396724 16.76603577398321 6.049300484942883 0 0 0 +699 2 0.6 21.126497161342687 11.460797873120045 4.950231064151637 0 0 0 +700 2 0.6 22.88325533238183 12.024959860683346 3.2959205170232257 0 0 0 +2608 3 -1.2 6.388123050736264 16.262372710638715 12.284379903628082 0 0 0 +810 2 0.6 22.629934241790096 10.366173017458834 8.625853902192777 0 0 0 +2567 3 -1.2 14.129972422463915 15.291025504555268 6.993223236128789 0 0 0 +2502 3 -1.2 6.236480023282383 11.225274351607137 13.397286398808218 0 0 0 +1070 2 0.6 21.329615340449074 15.656814428480535 5.131180162516522 0 0 0 +1525 3 -1.2 6.982070753771091 12.476202106862566 11.320578063136894 0 0 0 +1207 3 -1.2 24.16837578779941 13.016262976822963 7.54513761106032 0 0 0 +1241 3 -1.2 20.299954364812 10.609247110349129 6.83208290000257 0 0 0 +1370 3 -1.2 23.40855702525213 15.125100766080193 6.147059157037812 0 0 0 +1882 3 -1.2 21.64302945563939 13.79110098028925 2.56112927764941 0 0 0 +1937 3 -1.2 24.704030472801225 11.15766220020758 2.278674360498426 0 0 0 +2031 3 -1.2 21.56690218573319 11.266000863796942 0.834193643929693 0 0 0 +359 1 3 8.95346367619213 0.09909928971016169 0.806183759437379 0 0 0 +2089 3 -1.2 22.069221290606738 9.792742508258165 3.8455560632033796 0 0 0 +2127 3 -1.2 20.955348478944256 13.502226599354424 0.27598384320323255 0 0 0 +2488 3 -1.2 4.796622430356143 16.599533792234634 16.603576305821292 0 0 0 +2321 3 -1.2 24.5167723165236 8.787789436796787 1.3261473022554626 0 0 0 +2367 3 -1.2 20.559853702520282 9.325183566216614 2.0048023151866308 0 0 0 +2909 3 -1.2 21.30118519706563 15.798027208833584 1.193519262099006 0 0 0 +2974 3 -1.2 22.907871645870188 12.771491089368798 5.491601289910581 0 0 0 +16 1 3 28.093092227663213 10.41125245925158 1.1203934612999824 0 0 0 +61 1 3 25.433589010195007 7.948623242321133 6.500260841364083 0 0 0 +2097 3 -1.2 12.493774676891679 9.044742015582612 10.067499990224862 0 0 0 +327 1 3 31.292809086184306 7.377549918195232 7.602821787267629 0 0 0 +362 1 3 28.134618896877416 13.330044655330969 1.69673300264818 0 0 0 +401 1 3 30.500739783253593 14.917828777723699 0.9609118286174586 0 0 0 +451 1 3 27.138442398606024 14.361587144837006 8.045414337467728 0 0 0 +466 1 3 29.35938098655492 9.3089875927496 3.666009393456217 0 0 0 +2038 3 -1.2 7.475289052500883 15.036742385002226 16.92261969868044 0 0 0 +725 2 0.6 31.97254816228217 15.99828959784927 4.3756348484439895 0 0 0 +749 2 0.6 30.661613388350855 15.394039957537155 7.155194878464862 0 0 0 +778 2 0.6 27.68199316723105 13.585754331445449 5.109388452951252 0 0 0 +2370 3 -1.2 7.289971727139639 8.026011108804532 13.668199371883437 0 0 0 +898 2 0.6 31.162777657401765 12.698678728276603 4.228785845009721 0 0 0 +1054 2 0.6 31.5585100402116 11.115720736764844 6.230700192891273 0 0 0 +1058 2 0.6 28.579094414422606 11.269114203617258 7.692852173401253 0 0 0 +2257 3 -1.2 13.199227166725548 16.334116880374026 12.559324830566723 0 0 0 +1426 3 -1.2 27.161706361678164 13.632029236563325 0.6338558515813065 0 0 0 +1602 3 -1.2 26.246637666700607 14.755420889317213 6.889800815798162 0 0 0 +1751 3 -1.2 29.59232863478427 13.658966468565803 1.0948986986649705 0 0 0 +1776 3 -1.2 28.041126196480484 9.211004622071751 4.564692664485137 0 0 0 +1876 3 -1.2 28.24161798837016 13.532057360242083 7.484413509354465 0 0 0 +1880 3 -1.2 31.330197951349852 15.100493551014432 2.141892203107252 0 0 0 +2001 3 -1.2 26.580742320960088 10.04811675952205 1.0482532762956867 0 0 0 +2012 3 -1.2 25.947623065948314 9.356542960736322 3.3728874889073714 0 0 0 +2162 3 -1.2 28.129260540731313 14.066854901188263 2.960208042955908 0 0 0 +2341 3 -1.2 28.121957607476883 11.763536689246385 1.8815679308754398 0 0 0 +2508 3 -1.2 25.927410632566847 9.365674762522733 5.978683942205251 0 0 0 +2606 3 -1.2 30.0253260368134 10.57702137583437 3.9701859896679714 0 0 0 +2622 3 -1.2 29.4996841682849 16.116276470507824 0.7728740721527416 0 0 0 +2643 3 -1.2 28.69468141128889 9.41656817831364 2.168731764012579 0 0 0 +2791 3 -1.2 26.784458304592142 11.34045738193589 4.671299620679113 0 0 0 +2 1 3 2.4418678858749994 5.85164879790282 12.57463812843276 0 0 0 +90 1 3 33.74530118051254 3.923348520727286 10.343879008774001 -1 0 0 +152 1 3 31.192232242148357 12.995641909839378 9.380414075285522 0 0 0 +404 1 3 1.8510707199570593 2.0175198111580266 10.250355291391193 0 0 0 +422 1 3 1.6919378516895158 4.070587081778009 16.67832351676812 0 0 0 +456 1 3 3.2309354310805687 3.530846428721078 14.265037356447298 0 0 0 +477 1 3 3.7315247999121404 8.049601531334277 9.75090580517567 0 0 0 +732 2 0.6 33.80512511685721 4.66042326579467 13.910888795197252 -1 0 0 +753 2 0.6 0.49179308306414227 1.4131554885808808 14.612659967913308 0 0 0 +885 2 0.6 33.4948579007412 6.931773533826903 11.89322984123546 -1 0 0 +119 1 3 31.225003281223568 12.819396495712976 12.351243248677335 0 0 0 +98 1 3 29.269628250302286 11.82877428198122 14.380516737060713 0 0 0 +1105 2 0.6 4.891947172105047 2.6571907829897348 11.562990209058428 0 0 0 +1176 2 0.6 34.07759475520795 7.169093731195742 15.166142804971496 -1 0 0 +1264 3 -1.2 2.2882640233473404 4.440582550156639 13.380918213055036 0 0 0 +2885 3 -1.2 24.843233816787293 10.22589996992295 13.369633970303374 0 0 0 +1384 3 -1.2 1.4538772609074668 6.7757921258671905 13.142700385379733 0 0 0 +1412 3 -1.2 2.470710252504265 5.582194948161029 11.127356035118696 0 0 0 +1459 3 -1.2 33.110638445331006 2.662529356395472 14.003488230911016 -1 0 0 +1463 3 -1.2 4.0933550345041345 4.539837813721011 8.639637500462731 0 0 0 +1513 3 -1.2 3.7774977298218078 8.018268964379057 11.21635538674719 0 0 0 +1601 3 -1.2 32.33164377762012 3.5144990965964173 10.184381975404794 -1 0 0 +1613 3 -1.2 0.4198439113311315 2.6805281693684577 10.294136838711825 0 0 0 +1677 3 -1.2 2.4475842902853655 2.4599147761980062 8.772049377019956 0 0 0 +1737 3 -1.2 2.824421632637215 2.671238665074366 11.13006195903871 0 0 0 +1846 3 -1.2 5.277329550665405 1.415852715833914 16.025095776875276 0 0 0 +1891 3 -1.2 0.046577642955788874 7.444841543608815 8.224766747045589 0 0 0 +1931 3 -1.2 2.9650487154067275 2.1053271169023873 14.225508776479545 0 0 0 +2062 3 -1.2 1.6512407946235383 8.693649638029374 15.59127761726648 0 0 0 +2065 3 -1.2 1.0931964966304004 2.721184864711251 16.667629918833125 0 0 0 +2098 3 -1.2 1.8312533848712544 0.5638892601579697 10.228559303497601 0 0 0 +1492 3 -1.2 6.787447084018837 13.474385893951462 14.073371604760057 0 0 0 +2171 3 -1.2 5.869781157006333 0.5200260943734978 11.044403342621699 0 0 0 +2201 3 -1.2 32.95829440339477 0.15874216267929273 11.014224335417627 -1 0 0 +2229 3 -1.2 33.99061213122378 4.745173441239425 11.540310818359396 -1 0 0 +2306 3 -1.2 0.8176837874870242 5.09683976232762 16.023324264989277 0 0 0 +2339 3 -1.2 3.9680266971414353 6.0429855521812215 13.098888769756075 0 0 0 +2375 3 -1.2 6.236071689440973 6.672208792144653 16.19128884021576 0 0 0 +1867 3 -1.2 8.83784579191856 5.700310458901069 0.5963666755092215 0 0 0 +2445 3 -1.2 5.776606855854211 4.260464264584584 16.222410470721837 0 0 0 +2458 3 -1.2 2.3547045572940806 7.661442267866429 9.098572649723293 0 0 0 +2459 3 -1.2 1.8288022423906758 4.495805450704567 7.654572271172731 0 0 0 +2614 3 -1.2 4.629773335882693 3.922523690519157 13.635578454203484 0 0 0 +2697 3 -1.2 2.6077088477277983 7.812660468871465 0.4174146280760784 0 0 0 +2723 3 -1.2 34.170033852574925 4.735268087649475 9.019733689734238 -1 0 0 +2754 3 -1.2 2.9540467495124254 4.083387339534749 15.685973649750611 0 0 0 +2819 3 -1.2 24.317030462772532 8.403649852567117 15.832146118116885 0 0 0 +2904 3 -1.2 5.625220311288179 0.7052604613963925 8.641117495150624 0 0 0 +47 1 3 12.480408676206219 4.5554356795876565 14.778251967178015 0 0 0 +142 1 3 6.786090986305527 1.943014505801247 15.995761554935187 0 0 0 +208 1 3 12.205021356514633 2.392623202130191 11.907890812263398 0 0 0 +2774 3 -1.2 25.96397945793024 12.689555752390183 11.989692190713633 0 0 0 +273 1 3 15.911162378460686 7.19159635446757 13.113233229291064 0 0 0 +293 1 3 12.158142255873742 5.018950113901266 10.616742022226255 0 0 0 +313 1 3 7.196350521578711 3.7141640348459273 8.85404821625785 0 0 0 +355 1 3 6.444932772846798 5.320842644736055 17.00018590625556 0 0 0 +367 1 3 8.027528125886358 2.5291697441248298 13.320593069541719 0 0 0 +453 1 3 5.272814397695176 5.182554532328153 12.88281667499367 0 0 0 +2740 3 -1.2 24.627840386670947 7.789915547251719 7.858078866068491 0 0 0 +561 1 3 6.433798542950932 1.1233504545655073 9.820052551968505 0 0 0 +591 1 3 7.828887147311205 6.699737696582691 13.237877739913653 0 0 0 +639 2 0.6 9.48601902261313 2.6290222397140033 10.872556968882867 0 0 0 +2708 3 -1.2 24.240179843925326 11.860287195226388 9.698188910856443 0 0 0 +775 2 0.6 15.273099562083976 5.314585903204601 7.582960121730988 0 0 0 +803 2 0.6 12.278610496172899 6.9980378009070705 7.603699466942302 0 0 0 +829 2 0.6 8.363083008624638 7.604616258235112 15.889490523847924 0 0 0 +855 2 0.6 13.431911940508282 1.9761709805825092 15.299620203758021 0 0 0 +2587 3 -1.2 20.994612704584828 10.095566517575728 11.242622279387223 0 0 0 +937 2 0.6 9.20380915096589 4.428633483532978 15.406055784847402 0 0 0 +2465 3 -1.2 19.715103325195138 14.203408394531118 11.124275657352527 0 0 0 +2411 3 -1.2 25.420476972074333 11.52544882110778 16.592881810059616 0 0 0 +984 2 0.6 10.943970625439555 7.131121792930927 12.86422620343501 0 0 0 +947 2 0.6 33.11990196520108 13.541124581001368 0.7280841265548146 -1 0 0 +1040 2 0.6 9.692663511087517 1.091701924768 15.38152293878923 0 0 0 +1106 2 0.6 9.399173923274699 6.362677373837425 9.565257372518046 0 0 0 +1109 2 0.6 13.921992849025397 7.458654452030575 10.241849635020394 0 0 0 +2944 3 -1.2 18.678325555708447 17.10497313615366 2.0204353722307844 0 0 0 +1168 2 0.6 13.996675521779782 7.331801933199245 15.451339806958938 0 0 0 +1205 3 -1.2 6.307527255999394 2.7481857042795994 9.699039679086106 0 0 0 +1252 3 -1.2 11.687615583681442 2.579607322702786 7.975505616570644 0 0 0 +1304 3 -1.2 7.370343324491989 0.6235288766262922 15.635883797705118 0 0 0 +1331 3 -1.2 6.584563103460467 5.680303674854835 13.492183933859213 0 0 0 +1416 3 -1.2 11.38030313951141 3.636502825210937 15.209371758699392 0 0 0 +1514 3 -1.2 13.250054700992683 2.0148120659074937 10.75165761602955 0 0 0 +1520 3 -1.2 12.740880252881283 2.7137414877839974 13.232101116470274 0 0 0 +1272 3 -1.2 7.745121042515868 15.647817104831281 10.168280612252957 0 0 0 +1605 3 -1.2 6.95380980188582 3.182128036303692 7.47800849335541 0 0 0 +1865 3 -1.2 21.917054422277054 11.830217154689725 13.994093777920156 0 0 0 +1727 3 -1.2 8.177329773155076 6.68921433612721 11.800155672668478 0 0 0 +1740 3 -1.2 10.510784317524973 13.006587981759703 8.776769235578065 0 0 0 +1901 3 -1.2 12.178348570408616 5.602888859832466 16.139852268137066 0 0 0 +1928 3 -1.2 8.916883473782331 6.321162361165613 14.192136136236305 0 0 0 +2053 3 -1.2 6.506073734220149 5.148248854332297 8.769648748528665 0 0 0 +2093 3 -1.2 8.571057609529236 3.884541503769448 9.34042951963685 0 0 0 +2165 3 -1.2 11.294314242781175 6.163176048832021 10.893595925024334 0 0 0 +2284 3 -1.2 13.878848951211987 4.2423696704841785 15.1965835569867 0 0 0 +2342 3 -1.2 5.416113417437894 5.0176035547592965 11.43138886331854 0 0 0 +2363 3 -1.2 9.115094413276749 3.521886193488985 13.10160347393832 0 0 0 +1784 3 -1.2 20.934445364971427 8.774397977018701 9.185435345414465 0 0 0 +2412 3 -1.2 7.918464387871303 1.0713325497986832 9.644984618222916 0 0 0 +2490 3 -1.2 15.587908234291211 5.662157449143876 13.348967533784561 0 0 0 +2522 3 -1.2 12.293796674546277 5.478432397499722 13.648597793431204 0 0 0 +2539 3 -1.2 11.29614866097855 1.235946615105371 11.97607780176603 0 0 0 +1963 3 -1.2 10.926373132988957 15.525119161818017 13.131845336064616 0 0 0 +2649 3 -1.2 12.127507026645336 4.789469723498316 9.0297408160301 0 0 0 +1098 2 0.6 34.333485258878504 0.857459819022491 7.575620021812746 -1 0 0 +2769 3 -1.2 14.015723075710557 3.284464324537277 8.35830005376273 0 0 0 +2787 3 -1.2 6.915875640303708 2.794435121765495 12.386077293299449 0 0 0 +2799 3 -1.2 11.594205811643858 3.6661266715392347 11.209169258831377 0 0 0 +2836 3 -1.2 13.590986494028801 5.092349483154178 10.941697309795332 0 0 0 +2953 3 -1.2 7.42500788006905 2.7681354692770785 14.7727273194088 0 0 0 +3000 3 -1.2 8.616268061412097 1.171698250400215 13.17559027150028 0 0 0 +116 1 3 18.097776169213244 6.214513909339797 16.371207350618523 0 0 0 +276 1 3 18.879840936063058 7.140351465473925 13.622875033270642 0 0 0 +279 1 3 14.38671719310986 1.0836274527852534 10.303304182862759 0 0 0 +463 1 3 16.1497874555173 4.223872547659984 12.867177965435816 0 0 0 +19 1 3 4.483871962474078 15.355666372984956 15.88780146611459 0 0 0 +1701 3 -1.2 21.68855365646264 14.51618715256692 16.752211324632526 0 0 0 +577 1 3 16.155080986099325 0.3306531828490763 15.962230507633045 0 0 0 +641 2 0.6 16.223789541911692 3.763638021777639 15.918083059246655 0 0 0 +1690 3 -1.2 21.362420987686505 15.037436136210939 12.764957134117578 0 0 0 +712 2 0.6 17.38837038187027 4.637586225727892 9.310912677035255 0 0 0 +713 2 0.6 17.6883282183419 6.576659997172821 10.726617852257732 0 0 0 +763 2 0.6 19.4498712461439 3.708642295609683 14.51739600587607 0 0 0 +814 2 0.6 17.748423585992338 2.0669111925044716 10.669714440862036 0 0 0 +856 2 0.6 19.146786052385394 7.27738191408062 8.43271005253012 0 0 0 +884 2 0.6 18.926173639216792 4.4494035877772955 11.639612479139627 0 0 0 +1625 3 -1.2 26.201470140760147 13.347835055724051 8.916970848893268 0 0 0 +1444 3 -1.2 21.650160237853928 0.32682762885941663 13.152543136162333 0 0 0 +1484 3 -1.2 18.689956739082476 4.871209048775992 16.313324583199005 0 0 0 +1542 3 -1.2 18.92300087053425 12.59491310555636 7.464860743120077 0 0 0 +1850 3 -1.2 15.46382739455863 1.5896201633399427 16.24873776541176 0 0 0 +2239 3 -1.2 10.663906124288117 10.442301906155354 10.820291884613823 0 0 0 +2181 3 -1.2 16.80255786900203 6.770963989520168 8.864281817537215 0 0 0 +2337 3 -1.2 15.401346089557338 2.9521432958250964 12.837590658512738 0 0 0 +2368 3 -1.2 17.501909627569518 7.1413978015800055 12.809664229326515 0 0 0 +2417 3 -1.2 16.755212253739153 4.553634471470007 11.530113547635237 0 0 0 +2474 3 -1.2 15.746264635257738 1.5844278565338419 10.34325690679821 0 0 0 +2545 3 -1.2 19.529549286467027 5.857014405728703 10.03905150328727 0 0 0 +2605 3 -1.2 17.28783340469726 4.002155427205282 13.839187904495368 0 0 0 +2742 3 -1.2 17.69352248544844 0.7281361359360821 16.149707038366778 0 0 0 +2821 3 -1.2 16.135897722031167 1.2186712600603502 7.575915555712857 0 0 0 +2854 3 -1.2 16.656980620989494 6.048346664841773 16.612679013377097 0 0 0 +2976 3 -1.2 19.603042944395657 2.960150846064358 10.112080238671847 0 0 0 +54 1 3 25.161131844339188 7.340844288347691 15.196608205690316 0 0 0 +138 1 3 20.60648158813856 3.311757508903282 9.053511381958213 0 0 0 +178 1 3 26.350776109103702 2.6659548958675687 8.99306118619044 0 0 0 +290 1 3 24.348305096737136 6.513921412712687 8.765841658408931 0 0 0 +306 1 3 24.201376444648993 0.784705892939306 14.873031455977214 0 0 0 +1483 3 -1.2 20.805994973301512 11.86206340412786 8.821448457446303 0 0 0 +371 1 3 22.745278124567896 7.173193306104428 11.14383651548283 0 0 0 +1322 3 -1.2 24.894957789097496 14.770810855922743 14.970983137928929 0 0 0 +1289 3 -1.2 24.07513050961062 14.433711403613021 9.53586546225503 0 0 0 +704 2 0.6 25.00786142601733 1.8821974868308196 11.966243157347884 0 0 0 +728 2 0.6 23.41629021946517 4.008293383308437 13.563836362899913 0 0 0 +781 2 0.6 20.96668663347571 5.021884647132659 11.526397822594324 0 0 0 +929 2 0.6 22.16125640942258 6.081432964129819 14.447807829756947 0 0 0 +935 2 0.6 25.32149991347026 5.856640139492273 12.4526169645511 0 0 0 +1096 2 0.6 20.952411251582447 10.398158264856113 15.445235748850681 0 0 0 +1056 2 0.6 26.666004876096327 4.654857611472239 11.225096701976305 0 0 0 +1165 2 0.6 25.536191767852433 3.9761451494111446 15.066116669622378 0 0 0 +1071 2 0.6 23.671904419348856 10.883476546996917 15.14231878683311 0 0 0 +1248 3 -1.2 25.29258632325714 7.835485294218413 13.654611010336309 0 0 0 +1175 2 0.6 33.228012955172275 6.727459075069613 1.5675521724864263 -1 0 0 +1465 3 -1.2 23.112725983384273 6.7087631788335775 9.662729321726722 0 0 0 +1528 3 -1.2 25.556053383556254 3.8001588840502536 12.849158326172999 0 0 0 +1564 3 -1.2 25.51276963126306 6.191797620711659 9.59724908465856 0 0 0 +1615 3 -1.2 21.266669110364912 7.659323423410025 11.24075829847851 0 0 0 +1630 3 -1.2 24.474732501679757 6.0216883245309285 15.153627163617326 0 0 0 +1044 2 0.6 23.066755472776205 13.748725992710764 14.000602300023205 0 0 0 +1034 2 0.6 24.13621009956985 16.841174138330445 15.378349424122629 0 0 0 +962 2 0.6 20.98527521845094 12.21068543354978 11.747723333775616 0 0 0 +2078 3 -1.2 20.294009265411493 0.7607095962934374 15.106454888697357 0 0 0 +957 2 0.6 23.41724125326337 16.37154887694135 12.444109103550684 0 0 0 +2326 3 -1.2 21.790645214495584 4.008205564990695 9.636579204059194 0 0 0 +2415 3 -1.2 22.958088482474476 6.068160256558905 12.106567850932244 0 0 0 +2481 3 -1.2 21.128630071028493 2.0650894084909805 8.405671938114077 0 0 0 +2634 3 -1.2 21.48305688029201 3.9694063197895373 15.571370592949647 0 0 0 +2703 3 -1.2 25.065658494803593 2.750000094866463 9.745472792603985 0 0 0 +2899 3 -1.2 26.027146178181297 3.649241574876207 7.719411877583779 0 0 0 +2905 3 -1.2 23.96685486665629 2.234012533961483 14.890287302965318 0 0 0 +2921 3 -1.2 20.97683248186655 6.853515423821479 16.12575591278662 0 0 0 +2965 3 -1.2 23.603777632802437 8.365392084574504 11.320852859404239 0 0 0 +2985 3 -1.2 19.595559550562495 5.880121977328694 13.298003804025221 0 0 0 +120 1 3 29.400120538282792 4.148540343476329 13.844917847792784 0 0 0 +793 2 0.6 19.515136067299174 12.089643075453367 14.704164964779162 0 0 0 +312 1 3 28.34600622867386 1.7301274836848 12.561881925183217 0 0 0 +429 1 3 28.75563552501116 7.322873766468034 11.716282830293123 0 0 0 +492 1 3 30.653050601276504 6.7037962640941045 13.933774572012796 0 0 0 +769 2 0.6 23.805207549632073 13.836742603028105 16.731208469976032 0 0 0 +862 2 0.6 27.82275585767434 6.39151634786445 8.785746648310058 0 0 0 +602 2 0.6 23.156146622905865 10.990785478649364 12.081224192536574 0 0 0 +1060 2 0.6 29.000320703760362 1.520237336947049 16.073432902784823 0 0 0 +1083 2 0.6 32.17168659791453 1.5688963883958167 12.444074778647822 0 0 0 +1119 2 0.6 31.995633413430323 2.477255317314044 15.885630728816125 0 0 0 +1127 2 0.6 31.05893958905495 1.491675692900216 10.322731051241176 0 0 0 +1143 2 0.6 29.628093997738475 4.334040512564589 9.754107965968368 0 0 0 +1332 3 -1.2 30.00738242354899 0.7971634964125346 8.473189627985224 0 0 0 +1552 3 -1.2 29.683840140125916 1.1491708666285856 12.218114725848059 0 0 0 +2189 3 -1.2 0.18816138414503153 8.101711400661191 0.14969414606566633 0 0 0 +1567 3 -1.2 26.505681380124074 7.3992375783227775 15.816062308857093 0 0 0 +1810 3 -1.2 26.489833628136623 1.3062527449237549 8.401700419434382 0 0 0 +1899 3 -1.2 27.30503671642503 1.2499725158957016 11.591824986059896 0 0 0 +2155 3 -1.2 29.341070771471678 5.312408511167539 7.701740784992824 0 0 0 +2197 3 -1.2 30.37062038145536 6.821404396288755 15.378848780970602 0 0 0 +2233 3 -1.2 27.533390037645052 3.293188140977811 9.617267670506466 0 0 0 +2248 3 -1.2 26.584610816123504 2.4078237076308553 17.14797082531338 0 0 0 +2322 3 -1.2 28.769371124279182 3.296500308225283 12.654904285232066 0 0 0 +2420 3 -1.2 30.576640453606554 5.17165328055211 13.45813037805086 0 0 0 +2437 3 -1.2 27.359901423616183 6.88303248336015 11.896472174374288 0 0 0 +2530 3 -1.2 29.91813702138127 3.181181976754468 14.820036712783 0 0 0 +2573 3 -1.2 29.4446622055635 6.4140044001865215 10.783857671558374 0 0 0 +2686 3 -1.2 31.408446020834447 7.934342704491162 8.932521257863232 0 0 0 +1398 3 -1.2 6.6068737163048175 8.902266993839458 7.73303520594 0 0 0 +2950 3 -1.2 27.832192692751356 1.4218484353523249 13.94547659129183 0 0 0 +2970 3 -1.2 28.391931263608384 5.170073807350288 14.201993565702088 0 0 0 +4 1 3 33.53456589492457 11.8625285231365 10.775655380966889 -1 0 0 +86 1 3 0.6474402817627473 12.033634224667656 14.673773713650938 0 0 0 +406 1 3 1.6985124749640246 14.269861747203182 8.646352093265707 0 0 0 +416 1 3 1.6239714817812518 14.519651800842057 15.664744859986916 0 0 0 +503 1 3 0.8442083777648062 8.279130761711007 9.168235187518203 0 0 0 +2390 3 -1.2 14.188056491766137 0.34928753817439223 8.901437355800022 0 0 0 +599 1 3 2.54615124070152 9.894742122463644 15.417365242567518 0 0 0 +606 2 0.6 5.265523907646483 14.215876627655623 9.618436184515543 0 0 0 +607 2 0.6 4.884306694304009 8.886317654713775 13.120445413979706 0 0 0 +659 2 0.6 1.8855133731028095 14.679854510199513 11.623648408602975 0 0 0 +679 2 0.6 34.08303996207308 16.721566246958883 10.593108018973485 -1 0 0 +867 2 0.6 3.29258193033771 12.628617391966724 12.486411017233957 0 0 0 +887 2 0.6 0.3269164200393898 8.856004023525372 13.004400069180717 0 0 0 +1007 2 0.6 32.98752789510994 16.491335120089676 14.962077329292502 -1 0 0 +1055 2 0.6 2.285812853017783 10.335347397342275 11.709483012787171 0 0 0 +1065 2 0.6 3.9234377266721787 11.677542017283953 9.18614806782143 0 0 0 +1233 3 -1.2 0.5765143645509154 14.72927221432342 9.522012530542941 0 0 0 +1256 3 -1.2 33.696255377507754 12.448875725606653 15.293727068377937 -1 0 0 +1257 3 -1.2 3.492583155595683 10.039865181148521 16.563606552835008 0 0 0 +1266 3 -1.2 1.5127524888432955 11.133855110303196 15.600220179073824 0 0 0 +1441 3 -1.2 2.9076634013953546 15.357272972164262 15.535189942130627 0 0 0 +1470 3 -1.2 5.489535420481315 16.393014828380032 10.038231429650615 0 0 0 +1608 3 -1.2 32.73319823046971 12.711318092938958 9.66026308811876 -1 0 0 +1712 3 -1.2 11.406128808667116 10.564202520161942 16.031383201070422 0 0 0 +1711 3 -1.2 32.9148482754697 10.525771544298177 10.642977971104523 -1 0 0 +1750 3 -1.2 4.489128279614326 12.592216930072345 14.320081766882401 0 0 0 +598 1 3 21.629029591926603 3.6561256979062065 16.976216260814336 0 0 0 +1913 3 -1.2 0.395697281518047 15.344145835508181 15.64595398579139 0 0 0 +2032 3 -1.2 4.824140187344413 11.390033848184991 11.372986552755341 0 0 0 +2106 3 -1.2 1.6505216623680865 13.698781955353997 16.906571712034285 0 0 0 +2118 3 -1.2 4.454519768761832 8.008746307393954 15.330756585476124 0 0 0 +2169 3 -1.2 1.458434935513604 13.391441703531672 14.53225148388531 0 0 0 +2184 3 -1.2 0.9742934481102571 9.67274028544987 8.660220433123751 0 0 0 +2195 3 -1.2 5.067603577486218 15.472230230911299 14.432781165982986 0 0 0 +2213 3 -1.2 32.714966768122046 12.457576801823729 12.065421442954499 -1 0 0 +2254 3 -1.2 2.922899722661217 14.066760997573478 9.489466479968351 0 0 0 +2299 3 -1.2 3.0115875440954403 10.035338339638928 14.003986918653426 0 0 0 +2509 3 -1.2 32.0272837633595 7.197881414931493 13.611046746066764 -1 0 0 +2511 3 -1.2 0.6405989981226549 12.068524028536839 10.794646394345243 0 0 0 +2595 3 -1.2 0.5134227328632435 8.224428970443372 10.614790467393558 0 0 0 +2623 3 -1.2 3.958545961035179 9.411137766773187 9.226276191850136 0 0 0 +1872 3 -1.2 6.568705285637014 9.020131833717905 16.48184361081125 0 0 0 +2766 3 -1.2 4.769578095595996 7.027497637844567 9.072668762898799 0 0 0 +2824 3 -1.2 4.725335287133926 14.107954798538376 16.614638369002126 0 0 0 +2874 3 -1.2 0.5069350411076048 11.216133904365691 13.444463606230498 0 0 0 +2881 3 -1.2 0.863668480920791 16.171043087341868 12.856499798096197 0 0 0 +2900 3 -1.2 3.9312682498660814 16.248439472449437 12.41873183902124 0 0 0 +2934 3 -1.2 5.315680204201426 13.07492970634899 7.460967996843883 0 0 0 +30 1 3 6.757362842942775 12.832618915557289 7.211632764447952 0 0 0 +72 1 3 9.829319317089393 16.659922546826216 13.34927541411043 0 0 0 +130 1 3 12.113294428998678 15.225942690983393 12.162532864349567 0 0 0 +186 1 3 5.154962094746428 16.501900885625062 13.229610608597831 0 0 0 +250 1 3 11.698961518683317 9.498519165360259 15.02683344810751 0 0 0 +275 1 3 6.785651004633354 16.610468349699914 10.77416210252361 0 0 0 +345 1 3 5.953269924038838 12.347646502596797 14.547875571594055 0 0 0 +445 1 3 6.26492613066968 11.27709348018079 11.806002920597527 0 0 0 +571 1 3 11.215911314253113 9.61738076898739 9.597059251772345 0 0 0 +578 1 3 11.407723102035225 11.709653935073534 11.572374568724008 0 0 0 +655 2 0.6 8.748632886833617 13.5227704286143 10.264810293307427 0 0 0 +671 2 0.6 7.835457015400292 9.9933647318457 14.83754715553975 0 0 0 +695 2 0.6 11.427094712541965 12.834566977145984 14.336117129272495 0 0 0 +1246 3 -1.2 12.688461225053912 13.906481172139893 12.414466772508092 0 0 0 +818 2 0.6 14.378752045795512 13.046472635690582 11.205336961620235 0 0 0 +1338 3 -1.2 33.774426911325605 0.13311755084491533 16.426228406874245 -1 0 0 +854 2 0.6 8.305950632267491 8.64234637882292 10.421221337010108 0 0 0 +950 2 0.6 9.093654671059529 10.233890056305322 12.731301849594127 0 0 0 +987 2 0.6 10.09535838076416 12.423882319917425 16.14686733149824 0 0 0 +1017 2 0.6 8.821018829739511 13.629115261596269 13.438966356028137 0 0 0 +1134 2 0.6 12.690611615936858 14.36089321890829 8.996420707838025 0 0 0 +1138 2 0.6 14.087272057926741 9.945076780320436 12.618604431654187 0 0 0 +476 1 3 18.73321762589055 0.22017364660109986 17.165192438908264 0 0 0 +1225 3 -1.2 11.267449693106748 10.591880456003128 8.34194213250296 0 0 0 +863 2 0.6 3.1588103587544634 0.08951835701962099 6.0614312368024486 0 0 0 +1150 2 0.6 8.180144865813546 10.86015033741547 16.963244973178618 0 0 0 +341 1 3 1.3904445134275878 8.887994902594237 0.5024544590791505 0 0 0 +737 2 0.6 14.165320473964151 16.73548774963783 1.4720693682933048 0 0 0 +966 2 0.6 9.425234412122094 0.24597676110401662 11.120768913011682 0 0 0 +860 2 0.6 15.729087685429876 1.0533746262094108 3.743024148304143 0 1 0 +1051 2 0.6 2.5157112055088833 6.816974629572479 16.389990403663315 0 0 0 +2074 3 -1.2 25.160366859668557 0.4709030459221921 16.108932972102266 0 0 0 +1219 3 -1.2 10.729361098408472 14.47907009750532 16.730095254344377 0 0 0 +2838 3 -1.2 20.25018163166703 3.11822924315667 0.08638057972008041 0 0 0 +115 1 3 5.785102155685449 17.113008209962842 6.94163683972685 0 0 0 +21 1 3 33.87202924159821 0.75529179453393 20.890382650941085 -1 0 0 +79 1 3 1.384138108046314 1.7081433977160148 22.984219158425564 0 0 0 +161 1 3 5.120374132327063 6.015600632595287 23.727681366680546 0 0 0 +432 1 3 4.049390321657622 2.0771263157639863 19.57824618533234 0 0 0 +523 1 3 0.6115923650652229 5.683410906930614 25.444262843446904 0 0 0 +597 1 3 2.521826648718364 4.513662270082266 23.330505868250928 0 0 0 +748 2 0.6 0.8252378803129985 3.096506168946036 19.61919981257551 0 0 0 +768 2 0.6 2.683101694981099 6.9883656859818615 20.470738450613624 0 0 0 +830 2 0.6 1.074967353790657 5.389513041343086 19.899642233159117 0 0 0 +899 2 0.6 33.787556845012745 8.58073562973117 24.483173297519297 -1 0 0 +930 2 0.6 32.250677071632246 5.161783925899259 21.823975496734846 -1 0 0 +1039 2 0.6 4.692987865746362 2.0174205205509304 23.80029041693949 0 0 0 +1117 2 0.6 14.839957085023185 4.9540564590801175 17.338795347871034 0 0 0 +2680 3 -1.2 25.27126474746286 0.3684072196983974 25.811317049467988 0 0 0 +1085 2 0.6 2.0899816607559045 7.645529434739992 22.79288280046483 0 0 0 +1210 3 -1.2 4.566615849821873 3.8593265505911205 21.793039633255404 0 0 0 +1286 3 -1.2 2.36247362817055 2.932667046025273 23.158715159722174 0 0 0 +1292 3 -1.2 5.624540199586263 5.698010290420648 18.242611856969003 0 0 0 +1310 3 -1.2 3.6597485543177224 1.6468584524198229 18.22084234208562 0 0 0 +2231 3 -1.2 16.963466842155462 16.592733026771448 34.22086207611215 0 0 -1 +1429 3 -1.2 1.073671859248546 7.016975683762402 25.026598637041086 0 0 0 +1480 3 -1.2 4.55447153551026 7.335955024015599 23.402964580906342 0 0 0 +2794 3 -1.2 26.07718059834433 15.353138260690105 32.09072038138618 0 0 0 +1535 3 -1.2 33.526754693976294 5.263998397220679 25.3952591388053 -1 0 0 +1733 3 -1.2 2.2754266847172877 5.448108263236337 22.234100433430168 0 0 0 +1764 3 -1.2 0.46400349875129204 1.7570216777207917 24.33036462030044 0 0 0 +1830 3 -1.2 1.3086288097014307 7.308295387300584 18.462607406189093 0 0 0 +1844 3 -1.2 1.0366633217991787 8.942816349445074 20.9565761119643 0 0 0 +2716 3 -1.2 28.31588550992843 16.917965957726192 30.571594441690273 0 0 0 +2011 3 -1.2 2.8221026634784785 2.1408286233204827 20.41287320050135 0 0 0 +2044 3 -1.2 1.471754924090107 4.654998041802253 24.531032699437734 0 0 0 +2077 3 -1.2 5.180220413927695 1.1322180341356871 20.228525867579272 0 0 0 +2185 3 -1.2 5.220814463022691 0.1796826059263569 22.582723019686945 0 0 0 +2196 3 -1.2 34.07965006567493 4.335813498119281 21.09284491675623 -1 0 0 +2312 3 -1.2 4.283404634205388 4.472268176329321 26.782865170391368 0 0 0 +2327 3 -1.2 0.38427402091235946 1.7110333576899819 21.822834088656503 0 0 0 +2360 3 -1.2 33.66627739678022 7.7934472809152995 19.80499470911826 -1 0 0 +2524 3 -1.2 28.39394533265397 16.594020644248513 28.074038591339182 0 0 0 +2394 3 -1.2 33.93617191497441 7.641079638891054 22.422516634516445 -1 0 0 +2603 3 -1.2 0.404754125730333 2.0616365686517795 26.787394943797416 0 0 0 +2491 3 -1.2 29.534219778891323 14.620639789910332 29.199097904134515 0 0 0 +2706 3 -1.2 32.9153121931151 1.6077357109541752 19.99929476096402 -1 0 0 +2748 3 -1.2 2.096445197351191 4.454398913646013 18.059633984932336 0 0 0 +2809 3 -1.2 4.814978431977681 3.4354668657168075 19.545949311006446 0 0 0 +2344 3 -1.2 29.127076874077108 10.678145403030092 28.67630954652604 0 0 0 +2848 3 -1.2 3.8864077724002306 5.028957866969486 24.01383946993782 0 0 0 +2975 3 -1.2 4.844935898103712 5.91765569534254 20.36669333161717 0 0 0 +2999 3 -1.2 3.5817627121450473 1.4196246253384561 25.617758826956212 0 0 0 +2304 3 -1.2 31.352077047877458 14.754385436667407 33.99090039185324 0 0 0 +127 1 3 5.990493411362333 0.8407013191244822 21.524989728779577 0 0 0 +160 1 3 5.357116598807503 7.138609457270406 19.308955669105337 0 0 0 +2249 3 -1.2 31.579292219705337 10.27548194982242 31.104818942477422 0 0 0 +206 1 3 10.799190514502325 8.253944037590468 17.510007879198813 0 0 0 +297 1 3 5.3686621932562515 4.48139178630468 20.686079029561817 0 0 0 +338 1 3 9.333348863630636 6.006040511528655 23.723051557705936 0 0 0 +351 1 3 8.877585840081862 0.6780903248004477 21.647452840535184 0 0 0 +391 1 3 12.181601631891386 2.1317685040700063 24.61707576807327 0 0 0 +448 1 3 13.082449449360341 5.743885413703314 20.092337878949262 0 0 0 +455 1 3 15.460384464561908 6.322985337737685 21.52481170991365 0 0 0 +471 1 3 11.65585603102487 5.453908203568536 17.538609098109767 0 0 0 +507 1 3 11.642363955972023 2.6147854085505218 17.969010759914696 0 0 0 +1193 2 0.6 21.56419234672341 1.4560849235321558 34.01143255564006 0 0 0 +2125 3 -1.2 30.180917995484883 16.098114745248207 32.01816901443911 0 0 0 +2117 3 -1.2 28.21880195990935 7.623929505710863 26.87015843156718 0 0 0 +739 2 0.6 12.79712638870434 5.792590675332303 25.20579230316537 0 0 0 +844 2 0.6 13.04163252066009 4.7100090917122355 23.112162008859833 0 0 0 +925 2 0.6 13.6693504201738 2.2834000765168656 20.13527551147733 0 0 0 +938 2 0.6 8.538661405600566 4.076551337316702 21.754667831283083 0 0 0 +2713 3 -1.2 16.494365044385322 10.825834007586968 34.10804123770621 0 0 -1 +2035 3 -1.2 31.522535568323196 10.45238968884175 28.64377282166424 0 0 0 +1000 2 0.6 7.744645011230744 2.5967439463997697 19.29102320628712 0 0 0 +1003 2 0.6 7.26640847273677 3.237057448153934 23.772772163789597 0 0 0 +1064 2 0.6 6.38962017882088 8.412621070577726 21.855139297216237 0 0 0 +1933 3 -1.2 29.890946212744073 11.924443517774526 26.71275221916851 0 0 0 +1113 2 0.6 11.302729491265334 2.9994119240738826 21.465527248682875 0 0 0 +1139 2 0.6 12.038815908526468 7.996250976800469 22.74533406964479 0 0 0 +1180 2 0.6 8.482560942079996 5.751243991191108 19.521610320377455 0 0 0 +1215 3 -1.2 8.212804865170742 6.994677382330957 24.260090034754942 0 0 0 +1669 3 -1.2 33.04797987135654 16.560178669454046 17.909123970026823 -1 0 0 +1318 3 -1.2 11.401407827669535 2.293353150367479 19.4066814013506 0 0 0 +1349 3 -1.2 8.866924747256892 2.3029564334827635 26.14682436998236 0 0 0 +1381 3 -1.2 6.953779710615301 1.0007627650164226 25.292727443876643 0 0 0 +1924 3 -1.2 27.04980604523634 13.627507650372053 28.442470126928896 0 0 0 +1555 3 -1.2 14.88765581521366 4.155385795372376 24.363282472015293 0 0 0 +1717 3 -1.2 6.8339449958897704 4.383932686334262 20.438821769999915 0 0 0 +1729 3 -1.2 13.462774902856047 7.914105384993325 26.227568716925624 0 0 0 +1771 3 -1.2 10.989866144980436 4.0963979991094375 17.824695807587727 0 0 0 +1829 3 -1.2 13.426193527772153 2.085651536640581 25.443721560816076 0 0 0 +1847 3 -1.2 12.428004218853195 2.5487150600291537 23.225897428980364 0 0 0 +1848 3 -1.2 29.49953000782389 6.666122947421508 32.48854690846253 0 0 0 +1873 3 -1.2 9.375712620543855 6.091725076203821 22.220135567000117 0 0 0 +1887 3 -1.2 10.686244242286042 6.287881678227605 24.29725664862772 0 0 0 +1925 3 -1.2 10.762686412162058 6.671337710597705 17.870122670208364 0 0 0 +1954 3 -1.2 6.3534103420361525 3.0408596485316894 26.46298579950827 0 0 0 +1713 3 -1.2 29.63901464722744 13.72142625775747 32.39379994757935 0 0 0 +2025 3 -1.2 13.067128016076268 4.416287031920962 20.759843339898673 0 0 0 +2061 3 -1.2 12.027161612114107 6.616810914748163 20.620113280394914 0 0 0 +2174 3 -1.2 12.80716456309151 5.509393175315275 18.571539831318727 0 0 0 +2260 3 -1.2 9.074030308236791 0.447240980501517 23.08558758991504 0 0 0 +2272 3 -1.2 6.492536782712307 2.1222269152186275 22.127887967141195 0 0 0 +2354 3 -1.2 8.840173616438472 4.6405233692500465 24.115212925923377 0 0 0 +2462 3 -1.2 9.14141467133428 2.062491499580305 21.19104039936489 0 0 0 +2479 3 -1.2 14.223584491902518 7.7326490925646 17.543108956113826 0 0 0 +1115 2 0.6 19.720694735396886 16.349552072135136 22.78178268442215 0 0 0 +2639 3 -1.2 14.549411510670355 6.252356122546282 20.263588774563082 0 0 0 +2641 3 -1.2 7.425472950936559 0.22476418609715776 21.296489056096334 0 0 0 +2717 3 -1.2 11.117287372502405 3.1759395233345185 25.23335285891363 0 0 0 +2732 3 -1.2 6.100887955926304 5.545210238248927 22.72266523553266 0 0 0 +2584 3 -1.2 7.307914130402483 2.536289080288699 17.241199000732873 0 0 0 +826 2 0.6 0.6224670588149885 11.822531850274952 34.29968379788403 0 0 -1 +2813 3 -1.2 6.04535034005218 6.146957763484895 25.005662797547423 0 0 0 +2866 3 -1.2 14.432774392363564 6.403045558265096 22.574836194343035 0 0 0 +52 1 3 17.853003970051752 7.989715616962989 19.321195877038072 0 0 0 +58 1 3 16.55021494279354 3.741838489473062 20.516766825251455 0 0 0 +174 1 3 16.19120624890968 3.599504880461019 24.73099279585333 0 0 0 +221 1 3 17.454023301295248 8.085010181771757 22.67683019762941 0 0 0 +1611 3 -1.2 28.770381753703713 10.427115890419568 34.16100263470871 0 0 0 +1582 3 -1.2 30.63458445187837 15.682675350894122 27.17704732167155 0 0 0 +384 1 3 17.009170830713956 6.48252582545315 25.0742331240277 0 0 0 +637 2 0.6 18.315506648349317 1.9769807957149472 22.17049631601365 0 0 0 +638 2 0.6 15.541376733468386 2.1546333488063927 18.357568783541797 0 0 0 +1402 3 -1.2 30.685210413005517 8.405828485555606 29.756587850653073 0 0 0 +1069 2 0.6 27.808620524167353 14.202066346625662 30.79334809591148 0 0 0 +991 2 0.6 19.411523323578553 2.6206601190682837 19.06896360355416 0 0 0 +1530 3 -1.2 7.312030309780547 10.526247475349122 33.2327670931592 0 0 -1 +1324 3 -1.2 17.99836146448043 3.4360151711795455 20.479032728378673 0 0 0 +1329 3 -1.2 16.7836401521563 2.6411830025616476 23.775856152792443 0 0 0 +1376 3 -1.2 16.42983700759842 2.6846859406901 26.05772645939972 0 0 0 +1452 3 -1.2 18.819108385464467 1.3728302603711624 26.009585108238685 0 0 0 +1637 3 -1.2 16.977810160250247 4.9114032432772765 25.19364880430957 0 0 0 +1720 3 -1.2 15.741207540690832 2.5615492958935753 20.952256476274076 0 0 0 +1870 3 -1.2 17.290277956456727 6.776443584373791 23.556966291862967 0 0 0 +2024 3 -1.2 19.224850937873523 4.238834605089753 26.821328724387268 0 0 0 +2036 3 -1.2 14.609079584567931 0.36138289518218586 18.96660643953176 0 0 0 +2043 3 -1.2 17.939540199378293 0.096977440044963 18.56330339682401 0 0 0 +2057 3 -1.2 15.58453514790793 7.0521572517579 25.28357697202451 0 0 0 +2211 3 -1.2 18.14159353521218 6.675931184854491 19.893928471582402 0 0 0 +2283 3 -1.2 16.392947662966105 7.565815520417107 21.59211297479836 0 0 0 +1575 3 -1.2 13.508757843207652 16.226443712878623 17.268153826497667 0 0 0 +2442 3 -1.2 20.754619452977437 4.063786130345259 18.055628117187037 0 0 0 +2448 3 -1.2 16.514927849965744 7.972971855040037 18.6084747723749 0 0 0 +2671 3 -1.2 16.059660368138527 4.128888714081012 19.153609427105064 0 0 0 +2688 3 -1.2 19.4025237925271 4.044125833031812 23.35056425868938 0 0 0 +2801 3 -1.2 16.24437855221224 4.982276474481282 21.500720665470567 0 0 0 +25 1 3 21.504573114230727 0.3356222260606246 20.616742901015986 0 0 0 +45 1 3 22.09628447351162 7.013657095165339 19.813817983963414 0 0 0 +71 1 3 24.623767977034422 8.364330698186624 26.754035846533913 0 0 0 +274 1 3 21.598771978476595 6.7699607979595955 24.827807680095408 0 0 0 +344 1 3 20.79184340306309 4.156370363891113 23.738653833854254 0 0 0 +368 1 3 20.5409873121115 7.565021899151067 17.346857769657614 0 0 0 +450 1 3 25.892862439777723 1.0176503579151062 17.3957269215845 0 0 0 +478 1 3 24.27779502487451 7.691679970698112 23.92709756428651 0 0 0 +502 1 3 21.52330948730537 1.4131940107736665 23.23396589821824 0 0 0 +1366 3 -1.2 26.931695244042647 0.06198837877171079 17.854096658473175 0 0 0 +730 2 0.6 25.157661401377638 4.577840976479339 23.056495681217935 0 0 0 +843 2 0.6 19.80710303135905 4.8592998920983845 20.210558408923173 0 0 0 +858 2 0.6 25.178688587640927 5.828229139093455 19.91850882271943 0 0 0 +921 2 0.6 24.525646141378164 0.6589462124186493 20.484169303489594 0 0 0 +1075 2 0.6 22.70799553381507 0.599871385513924 17.616382754301885 0 0 0 +1177 2 0.6 21.073616448384207 8.554587641470352 22.32454352252297 0 0 0 +1305 3 -1.2 21.034099979877745 6.854135366694758 18.63955618427128 0 0 0 +1312 3 -1.2 25.201948876183373 3.1408422205292506 21.078598868092737 0 0 0 +1341 3 -1.2 23.42437584218076 6.885998417787725 19.158872230093582 0 0 0 +979 2 0.6 29.89143939910153 12.729327117550703 30.288628733937415 0 0 0 +1496 3 -1.2 21.23402414540188 5.646617567763294 23.751750226506097 0 0 0 +1524 3 -1.2 25.995308813850617 4.57592771485774 18.254605959943607 0 0 0 +965 2 0.6 26.95286286274274 10.263585355535897 30.6813053173967 0 0 0 +1550 3 -1.2 21.830610648208527 5.9692714675309215 20.84308587526568 0 0 0 +1648 3 -1.2 21.639121038670435 2.960486771722948 23.15548150952624 0 0 0 +701 2 0.6 29.264560510908314 8.868288355540377 32.05190841289651 0 0 0 +1854 3 -1.2 20.55546949775635 1.4404317133658913 20.514783853982834 0 0 0 +2022 3 -1.2 25.196257671105148 6.773209975584982 23.25225653505575 0 0 0 +2250 3 -1.2 24.951681084584894 1.2551916913792507 18.497768368081637 0 0 0 +2788 3 -1.2 30.394419691387952 16.75067664513004 29.510168305585733 0 0 0 +2343 3 -1.2 23.14999081976993 6.793483725263771 24.671556789298293 0 0 0 +2380 3 -1.2 26.64784375271048 1.707627962068956 24.246099931550855 0 0 0 +2389 3 -1.2 22.65323737391113 2.7250437425874874 17.371031188522235 0 0 0 +2510 3 -1.2 21.032322799104854 3.8898983717967983 25.28909983040218 0 0 0 +457 1 3 29.761866510718683 15.793077699151805 28.33047865784638 0 0 0 +2629 3 -1.2 26.048759246033246 2.5562007499757833 26.67627329965821 0 0 0 +366 1 3 30.234725996489438 10.674800354094929 27.68348325510865 0 0 0 +210 1 3 29.790225120386907 17.046367710313508 30.88694686201304 0 0 0 +2758 3 -1.2 24.028425258758933 3.9645909634230128 26.217454454358858 0 0 0 +2895 3 -1.2 20.10930318884386 0.986893341056408 23.260887005629712 0 0 0 +7 1 3 26.344274841851917 1.3501884723908901 25.717835476319028 0 0 0 +55 1 3 28.03699146649361 7.185332484239081 19.93820185465257 0 0 0 +100 1 3 31.2824489081414 1.918123432459538 19.752223500597466 0 0 0 +169 1 3 28.498717641519566 7.275660370563927 25.448744469540042 0 0 0 +269 1 3 30.247319265009974 3.6155311547259408 25.428395557909404 0 0 0 +270 1 3 26.66154361345932 2.9231644587199823 21.00169260717284 0 0 0 +393 1 3 30.26715060292327 8.422436257286957 21.45653062223841 0 0 0 +485 1 3 27.502236705355728 1.0180888304503253 23.032828110593204 0 0 0 +592 1 3 27.092699830410975 3.6192719384603538 18.10543145048626 0 0 0 +850 2 0.6 30.010505949354155 5.6165076581456645 17.520484887488283 0 0 0 +931 2 0.6 29.21607168447395 4.958919833450366 22.257904977500257 0 0 0 +1519 3 -1.2 1.999258885481254 0.38495514931702585 23.13011283679673 0 0 0 +1099 2 0.6 31.08631571132682 1.7592321301933682 22.723177244527907 0 0 0 +1243 3 -1.2 26.92200217654404 1.4499376200905598 21.655211718238792 0 0 0 +760 2 0.6 7.142202677700236 7.028674788519913 34.32900763865746 0 0 -1 +1291 3 -1.2 30.655690864926978 0.5857004994384128 20.093922816925524 0 0 0 +1362 3 -1.2 31.2732746372644 7.363653409244691 21.413461729924244 0 0 0 +1409 3 -1.2 14.016830772304045 14.937721391106725 33.98745916619378 0 0 -1 +1423 3 -1.2 27.333827280369906 3.723652857172078 22.050722734124843 0 0 0 +1454 3 -1.2 26.649724991601268 7.6979040627010225 20.041836118734366 0 0 0 +1660 3 -1.2 28.89331406025431 1.407068381778274 23.303058852366526 0 0 0 +1684 3 -1.2 30.890866737971045 2.9570670414233384 20.733165852050533 0 0 0 +1731 3 -1.2 30.062138611004123 2.101280466981301 25.8687990858845 0 0 0 +1801 3 -1.2 31.161770708602738 2.1996518002297294 18.300792485139443 0 0 0 +1964 3 -1.2 28.87268417064614 7.7319908263522406 21.238166644083623 0 0 0 +2120 3 -1.2 27.832750609224245 0.9139924503294944 26.27343010034075 0 0 0 +2207 3 -1.2 29.926712378305226 7.053895457061809 25.096456448011867 0 0 0 +2289 3 -1.2 28.14997684362877 5.7084739935090685 20.040157186472783 0 0 0 +2783 3 -1.2 21.68804701215989 11.767814945743826 32.79974432451425 0 0 0 +2625 3 -1.2 27.23038458581263 2.8926333118037824 19.552649298549724 0 0 0 +2705 3 -1.2 27.723698180800724 6.052478244678783 25.104971936072808 0 0 0 +2765 3 -1.2 30.587950878041035 3.896878090329487 24.090511416960332 0 0 0 +5 1 3 6.064983412474592 13.646643665964566 24.413828741545196 0 0 0 +726 2 0.6 27.88896948914521 2.698861562314701 32.37195321794002 0 0 0 +29 1 3 33.91924291852739 16.16649121367891 24.73600704063223 -1 0 0 +91 1 3 0.4735982386237835 12.21006669140914 19.497094651032956 0 0 0 +179 1 3 33.993757929769984 8.424499929999206 21.190728197627433 -1 0 0 +240 1 3 0.8739946609326763 11.236098577593255 25.95309307274067 0 0 0 +326 1 3 3.325839408661105 11.747117254745735 19.92552021100122 0 0 0 +329 1 3 33.03510618970314 11.256879222941745 20.96206071103543 -1 0 0 +360 1 3 33.55779114588181 16.745840741252042 19.290583800943516 -1 0 0 +403 1 3 34.30372162040866 7.97453603463398 18.32487508239964 -1 0 0 +409 1 3 3.254075626769521 10.064557894372012 24.714043531448045 0 0 0 +410 1 3 3.063420394837123 11.579891595123547 22.399159572074034 0 0 0 +553 1 3 1.507554004980512 14.992372545019592 19.794799443358023 0 0 0 +562 1 3 6.050309583914177 12.244365769095316 19.297076671036717 0 0 0 +644 2 0.6 33.615183903393635 14.204607408033441 22.00253022981237 -1 0 0 +733 2 0.6 2.1883293963198853 14.469897219168585 23.489165930432666 0 0 0 +902 2 0.6 4.161508752889901 14.659850857072946 21.544968788256934 0 0 0 +2150 3 -1.2 33.37277025103059 7.400947316710873 17.338139610014682 -1 0 0 +1102 2 0.6 2.7736493616059397 9.105910890220636 18.441630407798815 0 0 0 +1245 3 -1.2 0.7749300382811808 16.24283951582849 19.26441717986583 0 0 0 +1258 3 -1.2 32.979827076282646 15.772782291894165 20.28567583423536 -1 0 0 +1303 3 -1.2 3.264429099494363 12.656440292043246 21.209502710381123 0 0 0 +1361 3 -1.2 0.18458132859250515 11.849855762441068 21.01297791373018 0 0 0 +1377 3 -1.2 0.9623426856218203 16.47871758408363 25.56503425789235 0 0 0 +1445 3 -1.2 4.831940020137166 7.807890814140199 17.827644885694575 0 0 0 +1481 3 -1.2 2.2797277379118253 14.252038972034198 25.92669430712018 0 0 0 +1574 3 -1.2 33.34638549869032 11.651887211304636 19.424879038395574 -1 0 0 +1580 3 -1.2 3.7691323982353953 16.812408628648864 25.365181117033774 0 0 0 +1656 3 -1.2 4.496218703830479 11.958439367775831 19.022528281571226 0 0 0 +1800 3 -1.2 2.378930580280937 11.127485764754764 25.58616558863403 0 0 0 +1849 3 -1.2 2.3145266182989954 16.93914512641391 23.27532732358969 0 0 0 +1945 3 -1.2 34.12608548709833 10.941599314739287 25.044318941103246 -1 0 0 +2019 3 -1.2 33.015536990885394 15.772002680456094 26.00366235449279 -1 0 0 +2039 3 -1.2 5.971716540008692 16.98042055865025 24.205368174792017 0 0 0 +2042 3 -1.2 0.5534587527336052 13.728191228147406 19.387822614578724 0 0 0 +2108 3 -1.2 33.085969380680595 9.758842351250925 21.294380988977302 -1 0 0 +2235 3 -1.2 1.9315087332197025 12.135603696645818 23.129411078097625 0 0 0 +2324 3 -1.2 5.995592956661333 12.351297745617792 25.15595624813518 0 0 0 +2406 3 -1.2 1.4586264446061008 15.00073331107311 21.27673726258074 0 0 0 +2428 3 -1.2 3.273572722793118 10.693188102261585 21.10314326580072 0 0 0 +2435 3 -1.2 1.912696318637344 11.67972390229081 19.27206347610094 0 0 0 +2506 3 -1.2 3.980678604438028 9.302549744120759 25.71184397271406 0 0 0 +2589 3 -1.2 4.3027705796523215 16.964752264010908 21.687175426683265 0 0 0 +2613 3 -1.2 34.07315879408402 14.932420233544603 23.976679844723243 -1 0 0 +2655 3 -1.2 2.8870744613913253 14.697244623791692 19.39000821981899 0 0 0 +2685 3 -1.2 3.916883957974411 10.927057518520956 23.531588466239025 0 0 0 +2730 3 -1.2 2.182616102817265 9.444140235705078 23.916291045711038 0 0 0 +2914 3 -1.2 4.648619470705936 8.227425259176238 20.105917677155034 0 0 0 +31 1 3 14.405915316559842 12.492974708937426 20.135183285732314 0 0 0 +141 1 3 10.577278261218463 11.992449492330138 23.972208453898705 0 0 0 +162 1 3 10.77199610634903 14.713642254262204 24.716342756448434 0 0 0 +184 1 3 15.315780179320248 14.925009050177746 22.854590782663507 0 0 0 +202 1 3 9.097266750457214 9.909590720891721 22.670677423212815 0 0 0 +247 1 3 11.590088383788252 10.153040464428424 19.57809911052514 0 0 0 +266 1 3 7.1800065913926785 7.1075058830535225 25.54447319487981 0 0 0 +323 1 3 14.627897054788967 8.371069212503475 25.406735540600188 0 0 0 +435 1 3 7.655310925575033 14.523086804197192 22.014415664304252 0 0 0 +481 1 3 15.069874522850851 8.698059407039796 18.31290018248244 0 0 0 +484 1 3 7.914886752915645 14.197009061766984 18.0254284101073 0 0 0 +567 1 3 12.506659706284479 14.93880863548357 20.356560913492284 0 0 0 +589 1 3 10.64944356423728 15.192177555042552 18.009841564986576 0 0 0 +609 2 0.6 10.011835101106893 7.634374782387514 20.7276192335597 0 0 0 +711 2 0.6 14.538329309022314 11.244200343364882 23.871840204611136 0 0 0 +722 2 0.6 8.740164225014082 11.78176995372527 20.092246383803385 0 0 0 +809 2 0.6 12.137513873674788 9.668656450545322 25.418201829166552 0 0 0 +849 2 0.6 6.148687624734679 11.273280161136507 22.772310569066924 0 0 0 +870 2 0.6 8.001116162176727 9.285024908811673 19.03913509339526 0 0 0 +918 2 0.6 14.030533626095627 9.378524960729344 21.80258917156963 0 0 0 +951 2 0.6 7.879284876263048 16.279875375542233 24.315067504897563 0 0 0 +956 2 0.6 7.434778580941038 10.723872323030305 25.515993455578588 0 0 0 +986 2 0.6 9.472630127011586 8.681003106746065 25.57967750880679 0 0 0 +1050 2 0.6 12.00364847153394 12.094605415934394 21.749344476715343 0 0 0 +137 1 3 3.032778151900254 0.27721929824882663 26.37859843420082 0 0 0 +1280 3 -1.2 4.744379537091312 13.912835881817301 23.801711062912446 0 0 0 +1380 3 -1.2 10.203032536382779 10.610215349179636 19.282561592462283 0 0 0 +1488 3 -1.2 12.490109695720822 11.260932390967078 19.166570673172732 0 0 0 +1505 3 -1.2 13.411932300803235 13.683396766387489 20.676901802715413 0 0 0 +1541 3 -1.2 14.358337946762207 8.916478560071443 19.606113551989022 0 0 0 +1959 3 -1.2 8.127234237939382 0.1095204338228586 18.15313758122595 0 0 0 +1694 3 -1.2 11.950238385923178 11.458404476711712 24.068177584401813 0 0 0 +1705 3 -1.2 10.038539207651143 9.090943701061457 23.493669057620455 0 0 0 +1708 3 -1.2 9.345980956360595 14.941864686283605 25.13740837395725 0 0 0 +1748 3 -1.2 11.582785157691374 14.151874901572118 25.82174119443153 0 0 0 +1797 3 -1.2 5.714620792292468 17.00737641301724 26.72675820607447 0 0 0 +1820 3 -1.2 11.636862869861625 8.867907781392717 18.632732955843295 0 0 0 +1833 3 -1.2 9.850662879917405 11.327358757606873 22.7335016627105 0 0 0 +1843 3 -1.2 8.48004685999818 15.70762835054145 22.389837799078563 0 0 0 +1897 3 -1.2 9.217551136457098 15.076848752586612 18.599513986323657 0 0 0 +1949 3 -1.2 13.861695984873691 14.894865136802288 23.106825099742505 0 0 0 +1960 3 -1.2 14.51196740294607 12.836019416147238 18.707095147196743 0 0 0 +2005 3 -1.2 9.664377935074171 11.770629551845813 25.123103409162784 0 0 0 +2009 3 -1.2 11.39950855969487 15.143689038691122 21.316412082348066 0 0 0 +2027 3 -1.2 7.787909899859873 10.151811454746007 23.342661096539466 0 0 0 +2034 3 -1.2 8.760978099401962 9.342735825340856 21.34568961539339 0 0 0 +2076 3 -1.2 6.846989164374955 11.074400642300104 18.91837643938713 0 0 0 +2079 3 -1.2 11.694917876075342 9.732654781363678 21.005116966531023 0 0 0 +2147 3 -1.2 8.389275813489611 13.586589134942585 21.1351335360098 0 0 0 +2199 3 -1.2 6.830471185623216 7.385053560554685 19.48091632144212 0 0 0 +2252 3 -1.2 10.709061162277186 13.536769549973151 23.71160415046079 0 0 0 +2345 3 -1.2 8.678000968739132 12.936854146695374 17.812741168023873 0 0 0 +2376 3 -1.2 11.69164572571711 14.59761315302274 19.025293745506865 0 0 0 +2382 3 -1.2 11.164965479837655 16.64431111152558 17.70335762926837 0 0 0 +2454 3 -1.2 6.681810084069554 13.61131812327023 18.877238532715246 0 0 0 +2468 3 -1.2 11.142760497865199 16.26518949131309 24.753891111762517 0 0 0 +2483 3 -1.2 6.273607479557771 14.916810565639901 21.637539603570648 0 0 0 +2519 3 -1.2 14.058176661816468 8.787565004695699 24.07620397870807 0 0 0 +2557 3 -1.2 15.089296592960691 17.02948098310898 25.673665781178922 0 0 0 +2624 3 -1.2 13.353427206852494 16.13346191422531 20.251323162449225 0 0 0 +2692 3 -1.2 14.18059938388966 13.139320376464049 27.139797398162322 0 0 0 +2727 3 -1.2 6.461230728096107 14.643170409203659 25.594313386025597 0 0 0 +2954 3 -1.2 5.894219780405039 12.159128350089027 20.809521620289477 0 0 0 +2997 3 -1.2 7.250802841083096 13.691505784986253 23.39664063222153 0 0 0 +3 1 3 17.271493066103062 15.398332152491678 20.63848309149186 0 0 0 +242 1 3 17.21968755519269 11.450382601326059 20.339355603532976 0 0 0 +522 1 3 16.337881746617555 16.743999923596242 24.910899693292187 0 0 0 +632 2 0.6 18.781379314786342 9.3686733903993 25.485289307740334 0 0 0 +820 2 0.6 15.686807967131637 13.671874511335824 25.661388999801552 0 0 0 +846 2 0.6 16.181230198232015 13.897541586246906 17.441789349980645 0 0 0 +890 2 0.6 20.206311608566057 10.85905293811428 21.631035004077717 0 0 0 +969 2 0.6 17.715251716092116 11.89434564488894 23.62854802090158 0 0 0 +1079 2 0.6 18.324250134609123 13.97650303816075 24.919221141543606 0 0 0 +1238 3 -1.2 18.234613870943093 14.28334113120135 20.78559099229109 0 0 0 +1263 3 -1.2 18.80367450915534 8.263678834661151 22.142962740485505 0 0 0 +1309 3 -1.2 17.278408993735955 11.996944979374181 25.826341173019223 0 0 0 +1450 3 -1.2 16.881967158872733 15.663608924957193 19.229231136678404 0 0 0 +1500 3 -1.2 15.432258240572015 9.483452607546253 25.955633245670818 0 0 0 +1556 3 -1.2 18.77925604673286 13.678975419048994 17.713640428963807 0 0 0 +1683 3 -1.2 15.959122081941782 13.718318599018223 23.43806075897238 0 0 0 +1754 3 -1.2 16.007618541335 12.450375943196674 20.471474412832652 0 0 0 +1857 3 -1.2 16.994547441798787 9.183487594275254 23.528660736800667 0 0 0 +1914 3 -1.2 17.86513594255614 16.5816642761278 21.341435576931932 0 0 0 +1980 3 -1.2 18.890356505604725 8.986941834655344 19.248804500596908 0 0 0 +1440 3 -1.2 19.51524961988651 10.350822994326302 34.25406814204658 0 0 -1 +2037 3 -1.2 20.558592077182173 16.182934409676925 18.234235100456694 0 0 0 +2163 3 -1.2 18.937354617743726 7.1900510274813065 17.36095188868996 0 0 0 +2408 3 -1.2 16.733514576821573 10.021852266727745 20.350195950863636 0 0 0 +2485 3 -1.2 17.77954513520705 11.756266299990243 18.914811532794744 0 0 0 +2591 3 -1.2 15.442282964169516 9.911466001124799 17.547701381410462 0 0 0 +2631 3 -1.2 15.881570492664524 15.066918469173189 21.402081603152443 0 0 0 +2665 3 -1.2 19.891076217837217 12.87360621224027 24.05390518142747 0 0 0 +2667 3 -1.2 18.164256501638512 11.523511544428725 21.471747275420725 0 0 0 +2820 3 -1.2 14.069809989339388 11.491978907916545 21.20063596095117 0 0 0 +2830 3 -1.2 16.881843100089938 15.474035078061487 25.499346207207545 0 0 0 +2903 3 -1.2 15.84015191091312 16.261154755186155 23.482152402505747 0 0 0 +102 1 3 21.25520064330375 13.302558961270494 23.577210275049467 0 0 0 +168 1 3 25.53174714908956 11.570554463660276 18.113448678019488 0 0 0 +215 1 3 26.95132172321146 16.42147458122586 22.66462271548364 0 0 0 +224 1 3 25.948738767989905 12.515218332735177 25.826883183589718 0 0 0 +235 1 3 19.077673946535576 12.286550551640557 18.11903657635141 0 0 0 +296 1 3 25.082739743423126 15.24452345371057 20.64260627011871 0 0 0 +612 2 0.6 24.170975842811917 12.247996122937968 22.66866924683049 0 0 0 +616 2 0.6 24.37460010946832 8.552024344195026 18.044106891727093 0 0 0 +790 2 0.6 23.019809760450606 16.33743701664732 25.836396805012797 0 0 0 +861 2 0.6 20.682791473438385 14.452183709634626 20.147481719095374 0 0 0 +990 2 0.6 21.347376378455145 10.472890145915372 24.607953749800835 0 0 0 +1008 2 0.6 24.554373027380837 9.405649582135439 20.76849133512861 0 0 0 +1188 2 0.6 21.409274620942128 10.315099607220006 19.1796666014826 0 0 0 +1201 3 -1.2 20.297831336149144 10.611780189187774 26.477552237192555 0 0 0 +1302 3 -1.2 24.879319372745005 8.414722975029806 25.20174204341542 0 0 0 +1411 3 -1.2 20.190168858444128 12.155007100977661 19.11301747012605 0 0 0 +1624 3 -1.2 19.866704526026933 15.757347652118114 25.88503288040903 0 0 0 +1155 2 0.6 14.72584495022626 5.721356615872393 33.87144581490754 0 0 -1 +1958 3 -1.2 21.027597860815742 8.946093837466691 17.331278080279294 0 0 0 +2126 3 -1.2 25.263867764981 13.001326598190152 18.512236838210498 0 0 0 +2132 3 -1.2 21.008234583621487 8.063338856591692 24.527818129015397 0 0 0 +2152 3 -1.2 23.54499123316827 8.609437227394471 23.04789732277151 0 0 0 +2208 3 -1.2 21.799541443255766 12.118752208744544 22.781120383522207 0 0 0 +2278 3 -1.2 25.38882346270601 14.010214633659324 21.389415530543584 0 0 0 +2336 3 -1.2 21.9198359704804 8.400271797222569 20.3409165457165 0 0 0 +2340 3 -1.2 22.19063965917105 13.536950612930283 24.74120170131761 0 0 0 +2451 3 -1.2 26.13314902021215 15.521520688091046 19.46286442005493 0 0 0 +2471 3 -1.2 23.70263851174537 15.56043595094322 20.31370338543585 0 0 0 +2604 3 -1.2 24.519425076976482 10.631696377698608 18.708579444986395 0 0 0 +2616 3 -1.2 21.127556743078458 14.536794464547095 22.724777659745005 0 0 0 +2770 3 -1.2 25.226128222668958 11.616966288418421 24.922875307268676 0 0 0 +2907 3 -1.2 26.11594421729083 13.94036080964063 25.512132455575625 0 0 0 +118 1 3 27.52858960931131 15.11391208208584 18.919597004681055 0 0 0 +334 1 3 29.183729590902043 13.377234512654924 20.762137359593957 0 0 0 +358 1 3 29.062260920448715 14.543794594739525 23.54405939877047 0 0 0 +381 1 3 27.27939527172993 11.45933570585795 21.99404036258282 0 0 0 +382 1 3 28.928353569523946 9.67426216549438 23.735236249786084 0 0 0 +411 1 3 28.94817732426363 12.174938612904672 25.472483112142466 0 0 0 +444 1 3 29.669303745160253 16.884324038282482 17.817277642389055 0 0 0 +1536 3 -1.2 20.00098217094066 0.7886282436516325 17.658720084521395 0 0 0 +794 2 0.6 30.05295605319384 13.425523600612912 17.34804304467306 0 0 0 +1092 2 0.6 28.858202325258457 10.195121039923356 18.93974052268653 0 0 0 +1306 3 -1.2 28.338858720765863 12.078042994727513 20.976560709217306 0 0 0 +1343 3 -1.2 30.091576966108413 9.052500278736373 22.941255426543297 0 0 0 +1392 3 -1.2 27.498439405457 11.922934932745433 25.94895372085665 0 0 0 +1553 3 -1.2 30.16068843358755 13.309405265306651 19.682119920657204 0 0 0 +1557 3 -1.2 27.670012721941177 14.320737411631054 17.705618435503645 0 0 0 +1614 3 -1.2 28.151593460595357 14.471261714396766 20.24429636829903 0 0 0 +2167 3 -1.2 32.06685456208432 12.048069587530447 21.68801877573871 0 0 0 +2180 3 -1.2 28.18579773631228 8.661054789432805 24.60911787219364 0 0 0 +825 2 0.6 12.567845801979209 12.546137004766377 17.28356897409477 0 0 0 +2320 3 -1.2 29.58598902580365 13.841583991007695 22.21799761346279 0 0 0 +2325 3 -1.2 29.337651675295515 11.013535176069837 24.464067048967003 0 0 0 +2439 3 -1.2 26.943525370158007 11.126058561341353 18.43050071694054 0 0 0 +2480 3 -1.2 30.380813251190418 9.593028349143378 26.69155132765892 0 0 0 +2569 3 -1.2 30.388966054373633 9.59261876547052 20.56039625448284 0 0 0 +2593 3 -1.2 27.634867302396383 15.103199526348664 23.134463540208444 0 0 0 +2700 3 -1.2 27.97961540420295 10.144507687669284 22.590881740197084 0 0 0 +2701 3 -1.2 29.815941673936607 15.791816413898104 23.767351620249265 0 0 0 +2761 3 -1.2 28.826503434924735 7.777502660816401 18.81315941724657 0 0 0 +2855 3 -1.2 29.18073518520093 13.574802630200766 24.811053250478192 0 0 0 +2925 3 -1.2 28.401338510054096 16.395883927892903 18.684356900351755 0 0 0 +2973 3 -1.2 25.973650288832626 11.083730107593754 21.49351460466115 0 0 0 +2990 3 -1.2 27.43924554588384 12.390159687515299 23.155708176147723 0 0 0 +2747 3 -1.2 21.783051456021195 14.63168315959776 31.79069780731133 0 0 0 +140 1 3 3.313059686004584 3.523235699890183 29.43760183317012 0 0 0 +201 1 3 1.0865283903826282 5.528209606188059 32.244040475167495 0 0 0 +2674 3 -1.2 23.844847464125895 16.21478723955496 28.244264183163324 0 0 0 +245 1 3 2.682543816474488 0.6455676954410057 29.382253680171097 0 0 0 +252 1 3 3.3212487378088618 6.879035536470827 33.794949357054136 0 0 0 +348 1 3 5.361827668138975 7.795337172152833 28.580573954550324 0 0 0 +425 1 3 5.433696512778608 3.852478053193791 27.445559996928818 0 0 0 +489 1 3 0.8048073113664798 5.020475735283631 29.25340029018692 0 0 0 +501 1 3 0.2794088984704516 1.0281258295351159 25.70854832017338 0 0 0 +608 2 0.6 2.182767934320409 1.9031199982378197 32.759439953449046 0 0 0 +645 2 0.6 33.524529990096845 2.762087790283853 30.97107487489776 -1 0 0 +715 2 0.6 4.244035381911046 6.83612544539374 31.063220449468815 0 0 0 +741 2 0.6 3.3714793445753384 7.021489304751608 26.40332980458696 0 0 0 +792 2 0.6 33.617647306902214 0.48459650426361023 28.747665898971277 -1 0 0 +897 2 0.6 33.155533115005724 3.8086908084737545 27.053418400634698 -1 0 0 +964 2 0.6 4.978532423577482 2.579316983774677 31.42442654011559 0 0 0 +1005 2 0.6 2.3644496623287017 3.442674928659214 26.36747900574856 0 0 0 +1265 3 -1.2 3.884997292723651 0.5380334754577593 32.174871752978405 0 0 0 +1346 3 -1.2 2.7308447780293634 2.1261137408953243 29.952752283067184 0 0 0 +1430 3 -1.2 2.2709924762352967 6.517658652841916 32.6014886284566 0 0 0 +1436 3 -1.2 4.492733439908251 3.027378027723264 28.54562747726883 0 0 0 +1578 3 -1.2 33.90601615920773 4.252123830790089 29.079756580876438 -1 0 0 +1753 3 -1.2 26.220085367558937 16.235585536848156 29.301901779423076 0 0 0 +1560 3 -1.2 28.37861468949431 4.047324237721972 17.55932027142159 0 0 0 +1662 3 -1.2 2.107601687573662 4.2194889114546275 28.788222008331157 0 0 0 +1700 3 -1.2 33.519536644866896 7.743778558973597 27.68576826429138 -1 0 0 +1903 3 -1.2 1.1085636156142424 5.490967845834019 26.878510509151525 0 0 0 +1604 3 -1.2 7.909302991286214 5.300689727537226 17.264196068467744 0 0 0 +2627 3 -1.2 25.8028334884223 11.946073227518259 29.76534702002311 0 0 0 +2598 3 -1.2 0.5492242187456303 6.562405590105626 29.406576447311082 0 0 0 +2636 3 -1.2 1.2443412947273755 4.320453039700346 33.225146991705536 0 0 0 +2745 3 -1.2 34.11744850782087 6.161553312904245 32.18770196112727 -1 0 0 +2816 3 -1.2 3.9311220581201747 4.384615806452529 30.454053826772135 0 0 0 +2931 3 -1.2 1.2261363391139128 4.806233094428257 30.842702296924045 0 0 0 +2955 3 -1.2 32.994473031770504 0.5958330733412871 31.532447780345464 -1 0 0 +50 1 3 10.118814615646986 7.356987077999757 32.59473065442866 0 0 0 +109 1 3 12.577001362911268 0.9379493960641098 32.34624181835411 0 0 0 +190 1 3 7.376600045457518 1.853010923113048 26.42137337580292 0 0 0 +229 1 3 11.109703242690575 2.070999506204912 30.695480147295722 0 0 0 +2618 3 -1.2 20.24252585423644 14.680528527066633 28.108191829151604 0 0 0 +2487 3 -1.2 24.0986016597478 16.049975913004822 33.32622323072822 0 0 0 +441 1 3 8.793702300530821 3.6436944534067557 29.950621105506716 0 0 0 +520 1 3 13.871745432897836 5.194962831730439 28.542256375977658 0 0 0 +541 1 3 10.18207698953313 3.1763550926617525 26.488917611745958 0 0 0 +563 1 3 7.375832764029703 3.5135620849373037 32.508712942931844 0 0 0 +579 1 3 11.354345635905265 0.8206644410613856 28.011898856656316 0 0 0 +624 2 0.6 7.469934844180763 6.47756991305228 31.240012475013078 0 0 0 +761 2 0.6 14.163549963312523 7.718875166141943 31.22225849786736 0 0 0 +773 2 0.6 13.879213533202067 2.8281729784964105 27.433701483596053 0 0 0 +2449 3 -1.2 25.283718045797784 9.367424372168436 27.60872506435826 0 0 0 +833 2 0.6 6.033441836036213 5.298920146022668 30.292688121329117 0 0 0 +878 2 0.6 9.19967721003776 6.384991027250001 28.419776135322422 0 0 0 +2395 3 -1.2 24.790441822588164 14.15961111976277 29.202135360201105 0 0 0 +1030 2 0.6 11.491917423052174 6.810460743611025 27.19897577706203 0 0 0 +1033 2 0.6 12.746370426700281 5.3172673754545245 31.285761569987205 0 0 0 +1927 3 -1.2 10.600844556016398 7.823820655882447 33.975690774215494 0 0 -1 +1221 3 -1.2 8.528132058861647 5.068478083968102 30.05894405762157 0 0 0 +2010 3 -1.2 25.320295849875492 12.45662850528572 27.29644961434895 0 0 0 +1383 3 -1.2 10.943147168213375 1.0863032114108502 29.525375820622596 0 0 0 +1388 3 -1.2 12.573623652841793 1.9777149779711207 31.15449853976996 0 0 0 +2693 3 -1.2 11.461760016033615 13.028654397022414 33.9329994158104 0 0 -1 +1523 3 -1.2 8.745837861007763 2.7886693758150543 28.753492260357863 0 0 0 +1592 3 -1.2 10.425452011778011 5.966483684431704 32.21161324942314 0 0 0 +1633 3 -1.2 6.347446140603318 4.456983871758823 28.40787249314736 0 0 0 +1702 3 -1.2 7.075246960849841 0.9984551350951079 27.6942293599569 0 0 0 +1777 3 -1.2 10.788064499742571 7.683957043628048 29.31854277685674 0 0 0 +1879 3 -1.2 11.117183654164235 2.247554177451501 27.410064535324384 0 0 0 +1893 3 -1.2 12.787294950763107 0.45511172809608774 28.081815206730685 0 0 0 +1156 2 0.6 27.88894299353334 14.89615150020681 33.212637723001016 0 0 -1 +1975 3 -1.2 5.502143801391736 6.96826319494804 27.371144825732074 0 0 0 +1984 3 -1.2 10.245653125707875 3.286498673411924 30.530624775460492 0 0 0 +2084 3 -1.2 10.895986657542796 1.3072787185866004 32.04429231152345 0 0 0 +2159 3 -1.2 13.289568010383825 4.108910824454039 29.434425887589423 0 0 0 +2187 3 -1.2 13.638773784987738 6.517928284519642 29.18708705214305 0 0 0 +2203 3 -1.2 6.53768948806029 4.713013852336823 32.37570984539546 0 0 0 +2378 3 -1.2 14.855558480654551 3.938740015058657 32.292839655428686 0 0 0 +2460 3 -1.2 9.992766542546699 4.47733534108122 27.1064681760878 0 0 0 +2493 3 -1.2 15.347429768026572 1.810067173834178 28.652713811783574 0 0 0 +2529 3 -1.2 8.097835833249231 6.687621883164748 26.622522186959095 0 0 0 +2588 3 -1.2 8.671813815892616 3.786086367879934 33.28422092649124 0 0 0 +2610 3 -1.2 6.193155291193569 7.372455909595251 29.76236940188695 0 0 0 +2711 3 -1.2 13.134487254007396 5.053891142229476 27.22770956683274 0 0 0 +2789 3 -1.2 7.808541526790428 3.0159360115677187 31.103670131376568 0 0 0 +1999 3 -1.2 21.98432475463758 9.152340398983188 29.917242827109995 0 0 0 +212 1 3 15.772226233579651 2.8204033039599574 32.00225535906353 0 0 0 +287 1 3 20.041844331008406 2.675678855238899 31.39228148753592 0 0 0 +361 1 3 17.189127569767965 7.387452674005599 32.22568799180218 0 0 0 +469 1 3 16.6122381445057 1.913005631346231 29.4207734563955 0 0 0 +595 1 3 17.519320900084725 1.8681024652245946 26.72168447265201 0 0 0 +1946 3 -1.2 23.37763462560928 12.801385501313366 34.257258938618456 0 0 0 +1141 2 0.6 17.46900941439382 5.035233388578442 27.877241491314166 0 0 0 +1144 2 0.6 17.249023077849646 6.245050548319348 29.3760414203378 0 0 0 +1262 3 -1.2 19.457913876164163 5.66628538233453 29.239915656006318 0 0 0 +1917 3 -1.2 29.55187418101472 1.5418403809184704 34.289842682193154 0 0 -1 +1581 3 -1.2 16.546370028568308 2.9168190611362443 30.58744486520064 0 0 0 +1136 2 0.6 24.105981005747715 1.8648247194762015 34.30617978815893 0 0 -1 +1824 3 -1.2 16.974738216854966 0.5325528003284592 29.794388045554257 0 0 0 +2045 3 -1.2 16.33926660261266 7.127041345718858 31.03933582590575 0 0 0 +2090 3 -1.2 17.32825894805324 0.2889130323143611 26.76544247896417 0 0 0 +2110 3 -1.2 19.382837219007683 3.7616835748090667 32.311661726057345 0 0 0 +2430 3 -1.2 15.041120664555871 1.5105636854589592 31.795229838556796 0 0 0 +2607 3 -1.2 19.18124945787331 1.4954533999895796 31.212789567209484 0 0 0 +2626 3 -1.2 16.690628196973226 7.758007656255181 27.86924150593336 0 0 0 +2793 3 -1.2 15.33604993667304 4.892908843615504 28.290143056687544 0 0 0 +2812 3 -1.2 18.204048050524882 7.035883505982366 25.71619607182213 0 0 0 +2873 3 -1.2 18.583807453734757 6.89090571808484 32.03181629162473 0 0 0 +2932 3 -1.2 17.61475768292412 2.2855580870985976 28.206153374640117 0 0 0 +131 1 3 20.64557159687188 4.58566540133898 26.643472676399323 0 0 0 +1772 3 -1.2 25.48108173868608 9.03442407267841 31.829777496148992 0 0 0 +180 1 3 20.643374577393743 4.834097376127286 29.501556239910016 0 0 0 +1489 3 -1.2 20.707450241308827 12.436344523367639 29.096613155995236 0 0 0 +392 1 3 24.668924973743696 2.743975943936049 30.074408084227667 0 0 0 +408 1 3 26.012617051505877 0.1853554748177217 29.749313584578328 0 0 0 +449 1 3 25.67871719396471 6.180934011121624 28.450176910244778 0 0 0 +1239 3 -1.2 24.26533889099547 16.192817982263517 30.727048785894148 0 0 0 +543 1 3 24.975136798605842 3.5840062231187613 27.239203964980284 0 0 0 +734 2 0.6 22.440450721139555 7.269994358365337 29.067125618812096 0 0 0 +1035 2 0.6 21.822318919031026 15.862519715841177 30.105380137065257 0 0 0 +817 2 0.6 24.19470885134761 7.000619442986073 31.401289430552108 0 0 0 +1026 2 0.6 20.426246285334496 9.276559785633205 28.201278623645862 0 0 0 +1107 2 0.6 20.279310933744465 7.798431139657887 30.69189663763794 0 0 0 +967 2 0.6 19.650297310265433 9.87836412567655 32.10207785923161 0 0 0 +1244 3 -1.2 21.079117108489406 6.05005550935738 26.126794342210488 0 0 0 +1482 3 -1.2 24.445418413456668 6.102206209611232 29.261230554992196 0 0 0 +1561 3 -1.2 21.789164276279667 0.5247585795244906 29.367942081456597 0 0 0 +1616 3 -1.2 24.253347014659866 6.021197644324863 33.53935058906819 0 0 0 +1765 3 -1.2 21.391249428273525 1.8305782245059294 27.33146894783165 0 0 0 +1783 3 -1.2 21.647144300871545 5.384356239210349 30.420911298339497 0 0 0 +1874 3 -1.2 24.35152228664535 2.963894642103233 28.596851398366404 0 0 0 +1978 3 -1.2 23.17195360112656 8.207619562129043 26.9913021865684 0 0 0 +2146 3 -1.2 21.28208393683489 4.58871609242119 28.05938774756145 0 0 0 +2564 3 -1.2 21.384425134647685 2.2698797655162792 31.857098487043228 0 0 0 +2574 3 -1.2 23.74921010118996 3.6226957158294915 32.94121205968159 0 0 0 +2702 3 -1.2 25.327412014200068 7.00246776498902 27.180306080974482 0 0 0 +955 2 0.6 14.754710576956217 0.9478008573993149 22.229267942557705 0 0 0 +2946 3 -1.2 24.94148985762147 1.2579999726679068 30.279966466292905 0 0 0 +2982 3 -1.2 20.20719030709946 3.41979052748516 30.01012792513597 0 0 0 +182 1 3 28.480945451720274 2.055099228754457 29.527967965352385 0 0 0 +300 1 3 29.304744265495835 1.1020830820658378 26.797502751501543 0 0 0 +940 2 0.6 20.017638687827915 13.520378571097948 32.046547464892704 0 0 0 +727 2 0.6 30.891090558556115 2.2206833844260827 32.24159219512899 0 0 0 +893 2 0.6 29.369809456637643 6.60515412632303 30.059886203309826 0 0 0 +894 2 0.6 27.243466276478795 5.236316760479707 31.141528400534014 0 0 0 +953 2 0.6 27.43401619456054 9.130211047009423 28.354114885223098 0 0 0 +996 2 0.6 31.635566342645394 7.493877832100393 26.403464849891385 0 0 0 +1043 2 0.6 28.57610844869786 5.503540495073878 27.890209055807407 0 0 0 +865 2 0.6 21.96687001972215 11.67627426969945 27.256760113470246 0 0 0 +1226 3 -1.2 30.046060083986678 4.360281361801379 26.623882341667365 0 0 0 +1360 3 -1.2 27.122147819392325 5.251094118008836 33.40434996869492 0 0 0 +1422 3 -1.2 26.867885726594732 6.576990137781546 29.227345413867063 0 0 0 +1424 3 -1.2 28.30565349361137 3.5130620803851067 29.530019679879913 0 0 0 +1591 3 -1.2 30.437206024375016 4.392629788777956 32.51874324780388 0 0 0 +800 2 0.6 21.40233903954552 11.103052724267107 30.704688871358005 0 0 0 +1826 3 -1.2 25.856726640846457 4.710269315503834 27.845001918859325 0 0 0 +2224 3 -1.2 28.912287795420607 1.5156277936828142 30.82530838865764 0 0 0 +2226 3 -1.2 25.624741949903637 3.5773631411569013 30.72507924047704 0 0 0 +2262 3 -1.2 27.08168248659151 1.301232011067699 29.250918008553842 0 0 0 +2300 3 -1.2 29.33178464836253 1.6692992687817172 28.23814923506021 0 0 0 +2644 3 -1.2 31.39626840598672 6.239529977762967 33.99665703631877 0 0 0 +636 2 0.6 24.09553429249469 9.809094643907395 29.91983934918673 0 0 0 +558 1 3 19.587517218211318 15.829883655091354 27.315718477897263 0 0 0 +27 1 3 3.486028120527345 15.574835437455759 28.238824375494314 0 0 0 +87 1 3 4.282925888094547 14.163999330066659 31.525575047687507 0 0 0 +94 1 3 31.731151836338945 9.449040835046747 29.88362836677257 -1 0 0 +117 1 3 31.329163889056776 15.061632380618184 32.42475145222316 -1 0 0 +128 1 3 34.19660839631388 7.913319021754574 28.966154198930756 -1 0 0 +286 1 3 33.05685556740721 15.323025984688933 27.49336211496187 -1 0 0 +386 1 3 1.374200258594284 10.376102061790874 28.68918328137386 0 0 0 +434 1 3 1.4634810159172922 13.93071216484566 27.109897314365323 0 0 0 +546 1 3 5.854044916808113 10.907159503816837 32.7586828180429 0 0 0 +654 2 0.6 6.164772273925916 13.065470312882857 29.819178414786396 0 0 0 +795 2 0.6 4.611174664375767 11.633584788612787 27.025472929136377 0 0 0 +824 2 0.6 6.336428399660301 16.455399531945126 29.54713034291567 0 0 0 +883 2 0.6 32.81568443252584 7.794650216081031 33.14088839229601 -1 0 0 +1020 2 0.6 4.381413076284131 10.609409626744853 29.895161636853857 0 0 0 +1022 2 0.6 2.60605822304082 16.09276941857029 33.3678962877646 0 0 0 +1049 2 0.6 2.3800599057295817 11.099053862888733 31.80896906936234 0 0 0 +1088 2 0.6 32.9669199408708 12.76341433604628 29.952119595038774 -1 0 0 +1140 2 0.6 1.305491951188798 13.854633023215431 32.3559395775974 0 0 0 +1478 3 -1.2 2.6423112340525807 16.545476229423823 27.353077972269244 0 0 0 +1812 3 -1.2 2.584165343506962 14.329778527178112 28.209175571435097 0 0 0 +1898 3 -1.2 3.9345534519006904 7.778802771441661 29.037604358427924 0 0 0 +1929 3 -1.2 3.0547339767524253 14.969875891494292 31.517479959330025 0 0 0 +1994 3 -1.2 2.7690436911224467 10.820063752998234 28.53939160120282 0 0 0 +2140 3 -1.2 33.11980337514176 8.648955092900028 29.878373242513284 -1 0 0 +2154 3 -1.2 0.5835015445702068 11.279952435236059 29.55829608239896 0 0 0 +2348 3 -1.2 0.7953020427773094 10.293220676527087 27.221784346347633 0 0 0 +2432 3 -1.2 32.49347378727712 14.135935676575064 28.129398000938647 -1 0 0 +2546 3 -1.2 4.1246065754025665 16.31822858776538 29.285684235364407 0 0 0 +2571 3 -1.2 1.0568935038098721 8.909684942485878 29.118588239074935 0 0 0 +2661 3 -1.2 5.202751152855206 10.001143710970563 31.801242640032086 0 0 0 +2695 3 -1.2 32.007339825801495 14.13814038289902 31.512939769005538 -1 0 0 +2729 3 -1.2 33.11145577357388 16.672674281797484 28.36255556999637 -1 0 0 +2880 3 -1.2 1.7019514423486402 9.859240950211689 33.73067059704844 0 0 0 +2901 3 -1.2 0.7660334978166092 12.595027170697339 26.8055561295295 0 0 0 +2992 3 -1.2 0.3239071985080663 14.902117300033957 27.551389716956944 0 0 0 +2994 3 -1.2 3.9854493236745236 12.8879599493198 30.822463148006932 0 0 0 +243 1 3 6.740729451049999 14.530497109886788 27.122058110898166 0 0 0 +246 1 3 14.569419365523485 13.3272659307442 30.44980191374401 0 0 0 +343 1 3 14.498596394180575 11.888790476485338 27.895482806883045 0 0 0 +394 1 3 9.946523002809553 10.484767142785392 28.096379892308065 0 0 0 +474 1 3 7.049399295960398 10.242257449204892 28.713531025652824 0 0 0 +497 1 3 10.346800309667305 16.11866998556751 28.201730751301955 0 0 0 +513 1 3 10.521740714817463 12.882229322023731 32.76865320060499 0 0 0 +539 1 3 11.195518134617208 8.81222717906596 30.190758000812277 0 0 0 +554 1 3 9.105762456554562 13.352359181373311 28.289353991026218 0 0 0 +640 2 0.6 6.984836457827197 8.57880438970503 31.603917296837352 0 0 0 +682 2 0.6 11.716949264985745 15.022458867337876 30.630238238600302 0 0 0 +709 2 0.6 7.749194355540071 13.748482176961259 31.745522682049316 0 0 0 +832 2 0.6 14.183226804733948 15.479087932439331 27.237360845953123 0 0 0 +1006 2 0.6 8.97204292358691 16.07850541628482 32.993502441931405 0 0 0 +1067 2 0.6 6.669096130701748 16.425541167341073 32.050289620096 0 0 0 +1076 2 0.6 12.326107582037885 13.877898163632352 27.86309570575462 0 0 0 +1133 2 0.6 12.815285139572733 10.259898072978293 32.44021690105916 0 0 0 +1149 2 0.6 13.937586811443504 8.682763366279605 28.486019075029077 0 0 0 +1213 3 -1.2 12.598641388406305 9.211868480264041 30.321036339177848 0 0 0 +1261 3 -1.2 11.062011334033576 11.968288248302025 31.741622058760925 0 0 0 +1294 3 -1.2 7.917648710988256 13.444967389860365 27.27848676078851 0 0 0 +1317 3 -1.2 14.065495516866212 13.284745377082556 31.93950075063557 0 0 0 +1529 3 -1.2 10.62226247296199 8.508004250440365 31.61416551150383 0 0 0 +1659 3 -1.2 13.045032934322538 16.51032953037179 31.65410489819142 0 0 0 +2675 3 -1.2 13.074917812249428 2.894524137840202 17.719392581640786 0 0 0 +1989 3 -1.2 14.874486419914021 9.397200505041186 32.994861630895876 0 0 0 +2072 3 -1.2 5.330882534282337 14.366961190341806 27.72141994730724 0 0 0 +2073 3 -1.2 6.3905004678751505 11.537252822510982 28.42366357269993 0 0 0 +2107 3 -1.2 7.4913174843395085 15.544242016349324 27.91959195491695 0 0 0 +2129 3 -1.2 6.925162395786599 8.556023159867566 25.636787626819675 0 0 0 +2182 3 -1.2 5.563079457359777 14.7640576074681 31.094778462736784 0 0 0 +2223 3 -1.2 11.821124573659153 16.332934368171053 28.154744124033073 0 0 0 +2259 3 -1.2 9.02306130335008 12.446359730375862 33.237052277372314 0 0 0 +2276 3 -1.2 8.402669100155492 10.140096705562819 27.908250230402746 0 0 0 +2377 3 -1.2 9.693083166610728 16.52217071731659 29.45981889415662 0 0 0 +2431 3 -1.2 14.200772157613295 12.181060509121771 29.46761608387795 0 0 0 +2526 3 -1.2 5.922579270578502 9.244314360388195 28.33308514673659 0 0 0 +2528 3 -1.2 10.295767487298034 14.274231764206933 32.22054669914134 0 0 0 +2537 3 -1.2 8.508656345573756 13.277862157471116 29.63101563698925 0 0 0 +2648 3 -1.2 13.596407660417306 10.81788191427567 27.485577518635232 0 0 0 +2764 3 -1.2 13.91335424496656 14.468838483926147 29.798055507684868 0 0 0 +2771 3 -1.2 5.986745500426602 12.329283692206467 32.354173701106674 0 0 0 +2829 3 -1.2 10.670222679653769 9.720285911672828 27.081400254380558 0 0 0 +2845 3 -1.2 10.1246285371423 14.53331148875963 28.158002980126675 0 0 0 +2859 3 -1.2 10.39159905280553 10.025768397789877 29.50367067871943 0 0 0 +2894 3 -1.2 8.619879037976768 7.554033977518538 32.561360829922194 0 0 0 +2939 3 -1.2 9.976193529782101 12.051202469178847 28.06223099592757 0 0 0 +2972 3 -1.2 7.491373402642222 10.1159674131798 30.114520072180422 0 0 0 +170 1 3 19.589352206616635 13.345319250297248 28.82429120171026 0 0 0 +288 1 3 17.210787967730454 12.069391099124658 30.968515524705023 0 0 0 +299 1 3 16.18661817858197 10.063765080311638 32.880712441986 0 0 0 +439 1 3 17.140272613953115 9.01585824059449 28.539757878174793 0 0 0 +504 1 3 17.127863990525434 17.033531072816423 28.623132826987156 0 0 0 +575 1 3 17.52003779468131 11.687476681479895 27.253690223399754 0 0 0 +1379 3 -1.2 16.089511034178642 12.026117934852872 27.90565122572332 0 0 0 +1393 3 -1.2 16.450931681456545 16.50728445015784 32.283522959375944 0 0 0 +1451 3 -1.2 18.028759109636702 16.92391148976442 29.95164580868725 0 0 0 +1474 3 -1.2 18.140327415456987 15.785015246119224 27.878423276004497 0 0 0 +1497 3 -1.2 18.812940560610198 16.775829483012455 32.340861340429164 0 0 0 +1629 3 -1.2 17.895828283005468 11.547773239537918 29.759929034676883 0 0 0 +1796 3 -1.2 18.50503468169807 14.693903106203054 33.44721611735006 0 0 0 +1892 3 -1.2 18.323256368155576 8.721101264587459 29.410873206352512 0 0 0 +1990 3 -1.2 16.134521325467947 13.210197613775229 30.575253073064992 0 0 0 +2007 3 -1.2 18.88360397566431 13.925840328178996 29.990109044665246 0 0 0 +2030 3 -1.2 16.164184694098513 11.08954997513237 31.66249601858508 0 0 0 +2105 3 -1.2 18.233970939365598 12.121392356179593 32.029393415312796 0 0 0 +2220 3 -1.2 17.686703267231334 10.164145167114235 27.514199084159 0 0 0 +2269 3 -1.2 15.946621454138354 9.636482667318745 29.18900610272903 0 0 0 +2374 3 -1.2 16.044575148729557 13.876866905574754 33.20642896338579 0 0 0 +2645 3 -1.2 18.595999383016075 12.811716142452076 27.694052033426985 0 0 0 +2760 3 -1.2 17.230289333863777 8.981149358685595 32.45585481552306 0 0 0 +2862 3 -1.2 15.79841690236342 16.420641790513233 28.60317784766403 0 0 0 +70 1 3 25.748360697089034 12.981423591598226 28.709501841243195 0 0 0 +420 1 3 24.7107601668958 15.732610765265699 29.312882907442713 0 0 0 +924 2 0.6 22.515518261857324 0.37773311194240944 31.37744164217953 0 0 0 +1059 2 0.6 31.070949277217007 0.041872127205349274 33.68346320891003 0 0 0 +2425 3 -1.2 9.788391818852872 10.535785182105354 34.14662927368698 0 0 -1 +2206 3 -1.2 4.1426304110843155 2.9365490692071754 33.44125722287365 0 0 -1 +2271 3 -1.2 4.6082034810848205 7.352050058316494 33.29020719323211 0 0 -1 +786 2 0.6 9.754876053624695 16.95960804786483 20.774190736540962 0 0 0 +494 1 3 21.28158589506092 0.522598007214199 28.012146285558384 0 0 0 +1275 3 -1.2 13.043383717292986 6.688794132487409 32.85092829116018 0 0 -1 +2424 3 -1.2 6.507598118512952 2.566825557125032 33.40844067455389 0 0 -1 +2068 3 -1.2 12.917928464647769 1.211147201278925 33.72082526433225 0 0 -1 +1665 3 -1.2 22.15356851019109 0.6351339004059141 22.044185958660723 0 0 0 +907 2 0.6 13.812717675052745 16.71745912479414 29.56451190566613 0 0 0 +1721 3 -1.2 16.75982437102793 2.654069625719049 33.10071046844172 0 0 -1 +1921 3 -1.2 16.539961044233415 6.827972085474075 33.434035227099635 0 0 -1 +566 1 3 24.018147685413286 4.632920504238966 34.018496993427604 0 0 -1 +1016 2 0.6 23.39251494587812 8.359296234171342 33.58923471064318 0 0 -1 +1259 3 -1.2 20.472220370428513 5.549430424216592 33.61428126470528 0 0 -1 +736 2 0.6 3.4334143828796293 0.19827876320573457 34.188865617819374 0 0 -1 +841 2 0.6 30.439223746127368 11.622634584734978 32.838784290614555 0 0 -1 +2633 3 -1.2 22.144171490026714 0.7933703577633646 24.541988243716425 0 0 0 +259 1 3 30.219635236739382 5.639244395761091 33.3237576698009 0 0 -1 +697 2 0.6 26.105823555193002 7.461617377710755 33.26912125276454 0 0 -1 +1146 2 0.6 14.165087164004522 0.1902977509145312 26.108437269849585 0 0 0 +622 2 0.6 9.829732467265734 0.8851331381856264 18.81486696343536 0 0 0 +1588 3 -1.2 3.1774140401048716 12.670862768203715 33.480371623226624 0 0 -1 +1775 3 -1.2 4.909993135744416 10.973401308536799 34.02546900129038 0 0 -1 +2144 3 -1.2 0.1626036246890109 15.415960868229599 33.34752865345025 0 0 -1 +1118 2 0.6 14.226339892100356 0.34740373488503706 29.967671761362933 0 0 0 +2482 3 -1.2 11.833506111109566 16.851709930014504 33.94894051294398 0 0 -1 +2657 3 -1.2 4.730147476564062 15.115258560374718 33.598321473476965 0 0 -1 +149 1 3 8.45248808868851 11.279172420872085 34.11624521947286 0 0 -1 +1078 2 0.6 12.424992313863989 5.07294165484066 34.15247358254637 0 0 -1 +490 1 3 14.572328529048901 13.733518779999725 33.37644227866917 0 0 -1 +239 1 3 33.72694904195132 16.688181409326535 33.383327533004724 -1 0 -1 +1859 3 -1.2 11.498933274519828 0.8335125400746392 24.897679400533594 0 0 0 +2176 3 -1.2 7.090189011380746 14.666720358504419 33.847272089472696 0 0 -1 +2750 3 -1.2 0.16994880145716149 9.456872698426984 18.202433702652563 0 0 0 +2543 3 -1.2 22.52651118140711 0.08921435491507544 19.61760476228494 0 0 0 +2060 3 -1.2 9.845304012604993 16.84379574638942 26.882122050433964 0 0 0 +292 1 3 17.714566139807957 15.83177774643547 33.05078218291427 0 0 -1 +729 2 0.6 18.15791980533503 12.568469864332643 34.18306839365437 0 0 -1 +123 1 3 24.97060155647633 16.38614966201065 32.18701131529122 0 0 -1 +744 2 0.6 21.838017037884914 16.13212067398983 33.345042240039625 0 0 -1 +840 2 0.6 25.197793810652293 13.93036790600229 33.88225993138086 0 0 -1 +886 2 0.6 24.823438595031362 11.034238483384486 32.61108232962029 0 0 -1 +2230 3 -1.2 21.09434057315934 7.995061521271341 32.986145494647175 0 0 -1 +1589 3 -1.2 0.9312238236597044 0.12159134857527422 32.40530221313234 0 0 0 +241 1 3 21.966167851445412 12.395299271085314 34.107120818460366 0 0 -1 +1337 3 -1.2 25.704399330075546 16.32536316173158 21.748382792738205 0 0 0 +2316 3 -1.2 2.9314398516516715 0.8882825544916345 27.868084074461294 0 0 0 +527 1 3 19.554872819122288 4.284525403320733 33.80879850311279 0 0 -1 +2266 3 -1.2 32.44818264138234 16.317771771145786 32.476181599659895 -1 0 -1 +2924 3 -1.2 6.494808810079515 16.753296617266283 19.815161086771877 0 0 0 +303 1 3 20.537471683721574 7.093261197448319 34.00878914198246 0 0 -1 +2828 3 -1.2 33.35253719959488 0.28237831782418626 25.839680673790944 -1 0 0 +1077 2 0.6 1.486664561373414 0.6983456969140216 17.852730964096516 0 0 0 +1816 3 -1.2 9.40620361923239 8.666224060137788 17.409310040845543 0 0 0 +2677 3 -1.2 0.40187115696642567 0.04311862412117693 19.945956901127243 0 0 0 +1333 3 -1.2 1.5355444158292673 0.10919525726776447 25.951937934455007 0 0 0 +1072 2 0.6 31.67355990153141 0.08742507847021834 17.426715540051664 0 0 0 +1845 3 -1.2 32.99218395896209 0.013237373675359196 21.838396263941146 -1 0 0 +427 1 3 2.3623749558355813 17.096591166090143 25.866581371746488 0 0 0 +1944 3 -1.2 0.17201718584182166 2.436549967684486 34.33733636577936 0 0 -1 +36 1 3 1.3498089937867224 18.726774117143034 3.3763786922540278 0 0 0 +114 1 3 2.233803137138909 21.362324501188407 4.333340435538291 0 0 0 +864 2 0.6 31.62038751553697 33.12879694031958 12.185458900829493 0 -1 0 +257 1 3 1.74951703380402 24.274434799947556 4.032104592265621 0 0 0 +380 1 3 0.3404094763117519 21.38903719521524 6.641079544501395 0 0 0 +430 1 3 3.9424813186991283 26.29873043768047 0.7052118789117154 0 0 0 +517 1 3 6.919187562656803 24.34157830136493 5.89920425745813 0 0 0 +547 1 3 34.06707619436282 22.538245397743708 1.2290676537686211 -1 0 0 +614 2 0.6 32.8591756279582 17.64354717695268 2.471575749239274 -1 0 0 +631 2 0.6 2.2715727324525625 17.306901549974203 7.306563274174705 0 0 0 +610 2 0.6 27.241077632667977 33.4925059681154 13.18849356435849 0 -1 0 +823 2 0.6 5.403697797605115 19.93551988666076 4.743252421676431 0 0 0 +852 2 0.6 32.416210657081976 23.750620951992854 4.827848366672209 -1 0 0 +107 1 3 12.455719702409489 17.194042743241194 16.902354895504672 0 0 0 +913 2 0.6 3.6875008421086646 23.498929297893874 6.331465192604442 0 0 0 +1254 3 -1.2 23.078163266547246 33.91572766573094 10.16050923353614 0 -1 0 +1068 2 0.6 3.5726806477168966 18.776730237252732 6.052206368976929 0 0 0 +1237 3 -1.2 5.705516375472605 23.80719433303504 5.278280379460973 0 0 0 +1316 3 -1.2 1.3505595085397446 25.056546691789375 2.700421494898955 0 0 0 +1413 3 -1.2 2.0078039807237036 20.263051821354903 3.2597014196315137 0 0 0 +1420 3 -1.2 1.29983285370107 22.338472204377815 7.229885406818122 0 0 0 +1431 3 -1.2 6.5450463029439305 25.23229420553078 7.089439211720117 0 0 0 +1491 3 -1.2 0.04782903797074484 25.930438823914134 0.6312955240624966 0 0 0 +193 1 3 29.235497501358793 32.509238179159595 15.784871898817737 0 -1 0 +1631 3 -1.2 33.25587895714078 21.77435915228642 6.597848836461803 -1 0 0 +1642 3 -1.2 33.151976978711645 25.74805915559653 6.3045479853761925 -1 0 0 +1743 3 -1.2 0.4063152662035253 23.939314364289583 4.540870526457979 0 0 0 +1747 3 -1.2 33.64473282642461 23.94615660392272 1.8142923959333639 -1 0 0 +1762 3 -1.2 34.2658805971693 18.768766315346088 3.8159725535218114 -1 0 0 +1991 3 -1.2 20.542050693765805 33.74825636681526 10.657487404960133 0 -1 0 +1818 3 -1.2 2.998505565464367 25.334332359922186 0.12198504433827988 0 0 0 +1996 3 -1.2 4.839866126995579 18.21709541850357 1.674975466221222 0 0 0 +2003 3 -1.2 2.7016761058764276 25.03548082831468 4.833946964698705 0 0 0 +2048 3 -1.2 2.217297716968873 18.143766979959967 4.4321132695300225 0 0 0 +2096 3 -1.2 33.54246906915524 26.290844259971127 2.886133811748532 -1 0 0 +2245 3 -1.2 5.716532408584004 17.969536199300865 5.698637164484103 0 0 0 +1476 3 -1.2 2.059587972561041 33.97496268812436 1.3380543772104463 0 -1 0 +565 1 3 7.362563204885096 20.627878920974034 16.821913017315307 0 0 0 +2396 3 -1.2 3.81185511781497 22.509650090411544 0.7309935371886873 0 0 0 +2413 3 -1.2 1.427343290275994 18.270766282116803 1.96507645279239 0 0 0 +2433 3 -1.2 0.924986607771829 21.239517819474678 5.155486805009471 0 0 0 +1503 3 -1.2 28.56184371692985 34.10104718884569 4.055054185498584 0 -1 0 +2570 3 -1.2 2.346282908224556 22.812007139043462 3.7591716707721834 0 0 0 +2578 3 -1.2 0.4755721958362519 19.949638937397573 7.231609483496666 0 0 0 +2817 3 -1.2 4.617328943649496 25.851898544761017 1.9257086258340947 0 0 0 +2912 3 -1.2 33.77730857492367 21.384723604665872 2.0735042988197954 -1 0 0 +2978 3 -1.2 1.3037714990353826 22.718852291592405 1.1093090616784016 0 0 0 +2984 3 -1.2 3.4378538715417895 21.010993796984067 5.077359871067423 0 0 0 +43 1 3 13.691138025703196 21.92197207559485 7.036953925396475 0 0 0 +44 1 3 10.866816275590093 21.25503684780917 7.722872385090752 0 0 0 +46 1 3 8.001959515146208 21.648200115860256 6.849304325250983 0 0 0 +97 1 3 7.052168215956742 25.86384531683402 8.48771391825406 0 0 0 +992 2 0.6 26.738039429544628 26.495312654608973 0.059064997432063227 0 0 0 +110 1 3 12.695172044698474 17.30398607787122 4.663795392961359 0 0 0 +1307 3 -1.2 15.497749276359864 34.108042807266706 14.635310406604102 0 -1 0 +195 1 3 7.298927438476653 21.760219061284424 3.257821510452901 0 0 0 +316 1 3 9.954092252060718 18.254914513146723 4.207897541584736 0 0 0 +347 1 3 7.904950160268187 18.912907947172567 7.9599509062182525 0 0 0 +385 1 3 8.322549054429324 24.665181606159038 3.3648443822073983 0 0 0 +442 1 3 10.908461718015356 23.774227451349617 4.469008963723328 0 0 0 +542 1 3 11.020085118587248 20.9310055933292 3.839647018927434 0 0 0 +440 1 3 21.374167105558794 34.26435371041075 14.536391794561142 0 -1 0 +2930 3 -1.2 20.315149271202277 33.795801572281995 7.023556036119862 0 -1 0 +2533 3 -1.2 18.138507771551737 27.79368500012216 17.01074908440512 0 0 0 +743 2 0.6 9.901710338457892 24.249662471293416 7.790521907983473 0 0 0 +831 2 0.6 12.342310373561471 19.089215907921037 1.5625665289072062 0 0 0 +1794 3 -1.2 12.306490345931811 17.211201028664995 15.455883320317444 0 0 0 +916 2 0.6 11.397655317816191 17.731185490321423 7.556210099702508 0 0 0 +920 2 0.6 6.638805086862401 17.668820165361634 3.8311161051759473 0 0 0 +1073 2 0.6 8.508374255320101 25.705185701138934 0.10909533381826893 0 0 0 +1087 2 0.6 10.621785467552394 22.249791728021492 0.6255807084354177 0 0 0 +1671 3 -1.2 20.98459801088306 32.76689264753724 15.210134323234177 0 -1 0 +1198 2 0.6 13.183128855564021 22.66947924136199 2.151811769125979 0 0 0 +1209 3 -1.2 13.951598573279888 25.438280068834906 5.113850421087373 0 0 0 +1223 3 -1.2 12.34172930010753 24.472625517014514 1.0374817754117616 0 0 0 +1247 3 -1.2 10.253979431025671 18.135507789373357 2.75598966543311 0 0 0 +1354 3 -1.2 13.69174951614245 17.8055553730454 5.633450972301872 0 0 0 +1358 3 -1.2 9.872382400603195 24.42546539292017 3.5016609856005094 0 0 0 +1382 3 -1.2 13.881173113634665 23.23061772293398 6.118129919204706 0 0 0 +1532 3 -1.2 7.249358871832327 18.427541792048213 1.85546604094325 0 0 0 +1403 3 -1.2 8.672988349247658 17.659398811305028 4.5714869632724096 0 0 0 +1590 3 -1.2 15.03735497383843 20.29730850409022 3.54007294492344 0 0 0 +1594 3 -1.2 8.920665122126918 17.921092325307438 7.523426512074867 0 0 0 +1798 3 -1.2 13.003442089674895 34.06547093066063 14.557935447236657 0 -1 0 +157 1 3 29.374587858905514 18.53178820939016 6.2701422889364995 0 0 0 +993 2 0.6 26.76557826306027 33.97433884247754 9.887178345239025 0 -1 0 +1673 3 -1.2 7.928707276981379 23.163828081516886 6.174986744304285 0 0 0 +1738 3 -1.2 14.359677758520299 20.733530850078292 1.1978330378389441 0 0 0 +1752 3 -1.2 10.933946166742041 24.193493899197872 5.855854945054058 0 0 0 +1755 3 -1.2 12.348210230196157 26.64258236954779 6.6736275645481 0 0 0 +1123 2 0.6 24.713785699923026 18.70729804026147 1.1345456884516447 0 0 0 +1890 3 -1.2 12.887367808752089 17.81654439545068 3.2667361448823122 0 0 0 +1902 3 -1.2 12.423925748642247 23.764677000096476 4.07023794770872 0 0 0 +706 2 0.6 3.715972719159568 34.03727581690156 8.213899809528122 0 -1 0 +1969 3 -1.2 9.982115452673511 26.349390999693576 7.356758997808628 0 0 0 +2054 3 -1.2 6.011129634053131 21.356318607404564 2.634547952100551 0 0 0 +2301 3 -1.2 7.812302642348424 25.037182881776424 4.775313301264765 0 0 0 +2310 3 -1.2 12.312850828732337 20.709132230644602 4.491851405491486 0 0 0 +2405 3 -1.2 9.577387014666757 21.407469132734498 6.778833720715627 0 0 0 +2466 3 -1.2 8.478987026664209 21.356941392176054 2.467814130285359 0 0 0 +2561 3 -1.2 11.184291182501843 26.489040406623698 0.6730618605062775 0 0 0 +2581 3 -1.2 11.291468508851148 21.1624820894513 2.4052922931673804 0 0 0 +2663 3 -1.2 7.324962371673984 21.299389086096877 4.686799229361912 0 0 0 +2668 3 -1.2 10.437462682048254 22.311860291054636 4.339859080117164 0 0 0 +2733 3 -1.2 11.208018249022421 17.89096954669512 5.048334911980358 0 0 0 +2810 3 -1.2 8.120069143411936 24.898337304537886 8.866862916345356 0 0 0 +309 1 3 21.990738774681496 33.07753864561532 10.646117748058105 0 -1 0 +2850 3 -1.2 15.081133083883236 26.264393919106436 2.738799003359535 0 0 0 +1565 3 -1.2 18.015842866229093 34.01851302965548 10.616698810184632 0 -1 0 +2983 3 -1.2 8.075521846066561 25.49647412946338 2.1902934627081447 0 0 0 +2986 3 -1.2 7.45460849348025 23.365288270440676 3.145789601410794 0 0 0 +2988 3 -1.2 10.008265458479059 19.848170031847204 4.308782815140457 0 0 0 +62 1 3 17.833624784928908 25.095215876747123 5.825637527279273 0 0 0 +143 1 3 18.022378797127924 21.307607041349645 2.9830630175172725 0 0 0 +230 1 3 15.433037270194859 20.00660481767552 2.177711831752602 0 0 0 +302 1 3 13.879332662613892 23.893958212824163 4.739940166645455 0 0 0 +2469 3 -1.2 5.251276085591793 34.17697535614374 3.151857946745702 0 -1 0 +387 1 3 18.061440773010567 18.86349134423653 7.712369217796451 0 0 0 +694 2 0.6 9.097733119690345 19.54738366303834 1.6391636713684075 0 0 0 +544 1 3 19.125176519623665 33.22554622468227 11.139352148413899 0 -1 0 +617 2 0.6 19.34986399468545 24.19584618597004 2.987925616959452 0 0 0 +1968 3 -1.2 27.845257820246577 20.903609633374735 0.31264488388649525 0 0 0 +816 2 0.6 17.06481917963246 21.945747787986296 6.483319462284232 0 0 0 +1675 3 -1.2 14.193843826014751 34.19536482078976 11.30066983169121 0 -1 0 +1121 2 0.6 15.518622412733894 19.277297461019078 5.574201242299989 0 0 0 +1031 2 0.6 10.560292695387089 34.15026879090013 13.56219260850728 0 -1 0 +1204 3 -1.2 16.470642873784904 17.76899664945133 4.043395466666307 0 0 0 +1340 3 -1.2 14.836317247563153 23.439967330511827 3.7445674391665875 0 0 0 +1460 3 -1.2 18.66411679629485 26.4769002790938 6.0959404085241315 0 0 0 +1472 3 -1.2 16.449421458401787 25.178075206992727 6.29377797157165 0 0 0 +1597 3 -1.2 15.58550146424288 18.66686952846369 1.5668283786566934 0 0 0 +1607 3 -1.2 17.556672183517197 26.28384902907316 1.897857722341517 0 0 0 +1736 3 -1.2 17.717569914166138 25.328752933471748 4.228204598366689 0 0 0 +1839 3 -1.2 17.59226704447353 21.822917596841748 4.275249553893029 0 0 0 +2067 3 -1.2 14.668607436489319 27.31735554252132 7.118958016263398 0 0 0 +933 2 0.6 3.0151972703832164 17.50278272798995 0.7496927499460581 0 0 0 +2241 3 -1.2 16.86439290767682 20.718840388405543 2.0442281842020416 0 0 0 +2314 3 -1.2 16.99708343184236 18.081683015499706 7.068728754744933 0 0 0 +129 1 3 2.4881089767987765 22.298568246511877 0.14071110297426617 0 0 0 +2720 3 -1.2 14.792125878842635 21.040186392392453 6.717413926275205 0 0 0 +2744 3 -1.2 18.628041801246354 23.976513945002438 6.296026989868159 0 0 0 +2831 3 -1.2 18.708603728295582 22.32880088268952 2.1446340237277393 0 0 0 +2837 3 -1.2 18.806269862475986 18.79066246277609 5.147585019760858 0 0 0 +576 1 3 10.283279242372226 34.23581279771061 5.7154026664664475 0 -1 0 +9 1 3 22.38332174944044 20.329884191416753 5.960101614966748 0 0 0 +67 1 3 21.17220571639666 25.915362239700595 1.1677286084464493 0 0 0 +75 1 3 26.120124388065665 25.009223066315556 3.660251738779113 0 0 0 +220 1 3 20.965884564132985 18.09382819486888 7.221453670524445 0 0 0 +258 1 3 21.600265245729183 23.19575841324573 5.596482407267206 0 0 0 +423 1 3 25.202735586100964 20.210617577131195 6.980461348673109 0 0 0 +431 1 3 21.31525774014175 19.34618652779484 1.8871185023114319 0 0 0 +526 1 3 19.88213523371541 19.28204495333436 4.3075473526356 0 0 0 +572 1 3 26.161937853837482 22.81378455005801 5.823738430229779 0 0 0 +668 2 0.6 23.9106335270542 21.340481140995323 3.3195643862380533 0 0 0 +813 2 0.6 21.930171516418042 23.01373617662229 2.4121790706477113 0 0 0 +1029 2 0.6 26.33411481846835 23.762062854631946 0.1407754687942112 0 0 0 +1108 2 0.6 26.23181228396212 21.920553421668004 1.7015800841219997 0 0 0 +912 2 0.6 11.649017084476913 33.7880068549494 16.447666116244324 0 -1 0 +1189 2 0.6 20.086641655725735 22.692098636780305 0.2778866443462816 0 0 0 +1222 3 -1.2 25.618916893172756 21.343459089124025 5.777840229210922 0 0 0 +1359 3 -1.2 20.475665550387923 19.871463980264195 0.5653437663207472 0 0 0 +646 2 0.6 6.147434250706071 33.37697942328319 13.031675874305225 0 -1 0 +1508 3 -1.2 20.782552653841087 18.651880123651367 3.119505544499079 0 0 0 +1566 3 -1.2 25.22450078423019 23.60663465130012 6.811457168025918 0 0 0 +1650 3 -1.2 23.701519419381036 20.63723447495143 6.992153251676929 0 0 0 +1679 3 -1.2 25.19491435859274 18.744064767898166 7.02073049067916 0 0 0 +1779 3 -1.2 20.130302660515344 24.91521934100389 0.8811574909082687 0 0 0 +1811 3 -1.2 23.122285333584085 19.46876169328366 5.005373146773697 0 0 0 +1814 3 -1.2 21.130656978042826 22.91229246041266 7.104055490802355 0 0 0 +1836 3 -1.2 20.785001081501722 23.390397258944407 4.388594518275993 0 0 0 +1852 3 -1.2 22.15719222463666 18.78717752731258 0.709482849606982 0 0 0 +1458 3 -1.2 19.462977822848433 31.882442573480525 0.3160132283536436 0 0 0 +2221 3 -1.2 26.31908093706623 18.1190937073623 4.448507501942142 0 0 0 +2347 3 -1.2 24.637982196851173 25.67810057495353 3.912761386449262 0 0 0 +847 2 0.6 17.122217565445688 23.74136580403516 1.1509654244939103 0 0 0 +2492 3 -1.2 22.464669052901897 21.88959556651625 5.4261043704273115 0 0 0 +2521 3 -1.2 20.77063355527904 20.28270795851312 5.068033772411946 0 0 0 +244 1 3 14.193007818227054 33.194940357726225 14.434666045063278 0 -1 0 +2650 3 -1.2 25.418141505230984 20.188007817752847 2.4553644395404732 0 0 0 +2683 3 -1.2 22.465078586306507 24.38155254552417 5.831021453567009 0 0 0 +2785 3 -1.2 1.765639731769691 33.56450072488384 14.183360877496689 0 -1 0 +2902 3 -1.2 21.86781739188567 20.6386158443169 2.3584139482446598 0 0 0 +2948 3 -1.2 22.496443301432567 25.324685063364626 1.3509018477549644 0 0 0 +2952 3 -1.2 19.053082034416114 20.1332853021764 3.1715590643504736 0 0 0 +83 1 3 27.6223365178546 18.250885501234617 3.8223017561292343 0 0 0 +177 1 3 29.190714822628447 25.862939471939665 3.3455504049727915 0 0 0 +2669 3 -1.2 33.249535449116046 32.8228332291927 14.685853917756216 -1 -1 0 +518 1 3 28.824140401585897 26.523550917283735 6.260929931006794 0 0 0 +685 2 0.6 29.58826117864143 23.062334303788877 2.3080961330491125 0 0 0 +714 2 0.6 31.99138970284488 20.777538996697174 5.048617725574444 0 0 0 +914 2 0.6 30.055249795404283 22.02317719056327 6.903865386115479 0 0 0 +1062 2 0.6 31.555800568145543 24.662041251397554 1.0237718157924345 0 0 0 +1091 2 0.6 28.742217956124147 21.61019748381839 4.446130279012953 0 0 0 +1178 2 0.6 30.555485338245667 20.181668783179195 3.186886147213997 0 0 0 +1242 3 -1.2 28.285520258300192 24.647646814531573 3.4330503033320445 0 0 0 +1279 3 -1.2 27.57664363652918 22.722664248519592 6.211244450641499 0 0 0 +1371 3 -1.2 29.83784453782084 19.807759205795037 5.6420781388339725 0 0 0 +1386 3 -1.2 31.947046087491387 24.866118153823702 8.270160335947539 0 0 0 +882 2 0.6 0.2215445801188871 19.47128982556612 0.5115701740519237 0 0 0 +1577 3 -1.2 30.35614971816901 18.130935634324093 1.910896888665999 0 0 0 +1795 3 -1.2 33.14232831502098 18.358121227572568 8.27456488191261 -1 0 0 +1734 3 -1.2 30.443525142970167 25.35167651362615 2.691091093394921 0 0 0 +1769 3 -1.2 28.13177089688301 17.288252782690297 2.63315210704639 0 0 0 +1926 3 -1.2 27.73273955404223 25.601925752459923 6.641966183464423 0 0 0 +1939 3 -1.2 30.43550513835004 17.56575549225396 6.61073256002416 0 0 0 +997 2 0.6 2.4813845030503052 33.02990132314969 9.37459048083841 0 -1 0 +2013 3 -1.2 28.450045993561776 18.85282391800747 7.496108661675112 0 0 0 +2028 3 -1.2 28.18576595127203 19.523478119768466 3.2842931545511282 0 0 0 +977 2 0.6 33.33010857126889 32.659864809836236 9.901161265815896 -1 -1 0 +2349 3 -1.2 26.10003424387711 24.7946028560895 2.1744536431393433 0 0 0 +2384 3 -1.2 28.452825954940145 18.36795776213157 0.3420842909240838 0 0 0 +2577 3 -1.2 26.006495693004485 23.59019048288949 4.4481961714671625 0 0 0 +2778 3 -1.2 28.5933989819049 17.844202984343788 5.042183192990173 0 0 0 +802 2 0.6 16.19023898144717 33.870083670042625 1.53980113187565 0 0 0 +2851 3 -1.2 26.2439942760059 20.707926023058963 7.924108343978106 0 0 0 +2893 3 -1.2 30.797673285476833 22.26119448806553 3.873539389798047 0 0 0 +37 1 3 2.4576416935600154 28.587329885549842 2.016881419657734 0 0 0 +96 1 3 0.08515725309801837 30.122638895331153 5.918197395601023 0 0 0 +207 1 3 2.9794177038813383 27.837886163492854 4.817801054308589 0 0 0 +254 1 3 33.38530778015186 28.660203093574722 8.366342073267226 -1 0 0 +402 1 3 2.9984936954221952 30.235950874032152 6.559839975540426 0 0 0 +472 1 3 34.30439481630605 25.39346173705183 2.0191595545840393 -1 0 0 +237 1 3 29.942516741875878 33.555431370676416 3.424573211612429 0 -1 0 +877 2 0.6 22.288767332774885 32.79769196997069 6.921041567299759 0 -1 0 +742 2 0.6 34.03490711015991 27.15710222791175 4.866098440981697 -1 0 0 +812 2 0.6 34.25893583088749 30.69586025003616 0.7991922628053829 -1 0 0 +1908 3 -1.2 23.781291800607864 22.597833454992617 1.164443444597765 0 0 0 +1152 2 0.6 1.0679977704900003 32.96794487688402 5.32694311818364 0 0 0 +1158 2 0.6 33.85805413061329 33.04131606049532 7.281797127489103 -1 0 0 +1183 2 0.6 33.74976910414303 31.346552305984783 3.111993225070038 -1 0 0 +1249 3 -1.2 4.500806001538905 27.560223443247413 4.608221926936781 0 0 0 +1278 3 -1.2 3.148066237517142 27.64831170661339 0.9166678410154129 0 0 0 +1504 3 -1.2 3.478934736220459 29.649653618877455 2.1700661376762764 0 0 0 +1559 3 -1.2 0.24390455148938897 29.541015164664362 4.557794506233271 0 0 0 +1369 3 -1.2 0.9377329112605206 18.737402020759422 17.08342984733646 0 0 0 +1691 3 -1.2 4.499208640977038 27.446478222865434 7.288536595644709 0 0 0 +673 2 0.6 5.426564074202171 30.88657127096908 1.9233601389312187 0 0 0 +1774 3 -1.2 3.8459563885597228 32.4918689347626 2.116429799564209 0 0 0 +1851 3 -1.2 1.9544277965015053 27.493604558350384 5.797794454163079 0 0 0 +1863 3 -1.2 3.1544272708318815 29.406512330295527 5.231007446408406 0 0 0 +1909 3 -1.2 4.022199688240552 31.400042386921395 6.574831242054772 0 0 0 +2971 3 -1.2 16.197632558919096 17.22041470067238 13.362850462907044 0 0 0 +2138 3 -1.2 2.403449412473143 27.7807081467153 3.3509672632678424 0 0 0 +2227 3 -1.2 33.57435718323204 31.329188832079502 5.812133972909283 -1 0 0 +2386 3 -1.2 1.5040358463499388 30.64614622973543 6.387882670735897 0 0 0 +2426 3 -1.2 1.155150800001662 28.90067677493561 1.4099895153761026 0 0 0 +2478 3 -1.2 5.684161044006066 29.46659391983706 5.772547252221167 0 0 0 +2553 3 -1.2 1.395504999117023 31.721092228243954 2.036277888449941 0 0 0 +2575 3 -1.2 5.111558442978478 31.98284369016774 4.407450078791144 0 0 0 +2640 3 -1.2 33.80872071000319 29.035947136012435 6.848896993807441 -1 0 0 +2690 3 -1.2 3.127704569936319 29.343660865519592 7.788517506986566 0 0 0 +2945 3 -1.2 1.6583682974904563 33.80192867497639 7.266798962474733 0 0 0 +13 1 3 11.096066005349735 27.30104072799263 7.417954646565474 0 0 0 +40 1 3 10.34839537211873 31.91824800139006 1.4787749754511426 0 0 0 +51 1 3 5.3991855599090135 32.057224676304976 6.014702056956468 0 0 0 +710 2 0.6 24.528166312898446 33.98329777324883 8.454513230845384 0 -1 0 +77 1 3 10.138372913071047 28.544619403514442 3.5120972996754722 0 0 0 +146 1 3 13.74633715328595 26.697704769520463 6.05249846801285 0 0 0 +185 1 3 14.272837705707722 27.358063468336113 3.3279615357054446 0 0 0 +227 1 3 8.034790508276084 31.593192071639475 8.855246253985161 0 0 0 +271 1 3 7.336630061014237 28.717112949149687 2.3032079703841837 0 0 0 +308 1 3 9.617290031101355 31.511560845681146 4.407670731512138 0 0 0 +390 1 3 12.046597380941325 27.480551104693415 1.5221259540776473 0 0 0 +397 1 3 5.861124486458819 28.32484635469699 4.834265020215776 0 0 0 +350 1 3 22.434732198652753 33.57011693885315 2.233547079891972 0 -1 0 +495 1 3 12.14840376797835 30.47542371195241 5.516239198214351 0 0 0 +506 1 3 14.02541897825082 32.21508986921673 3.9046840349692684 0 0 0 +822 2 0.6 7.389448070232741 31.7318323620767 0.32006310955271267 0 0 0 +876 2 0.6 6.576330928737912 29.08421630684139 7.747822803288795 0 0 0 +908 2 0.6 8.6076052381846 28.18184580016514 6.498414038981655 0 0 0 +1224 3 -1.2 8.752226047863912 28.207027479570808 2.5879058249691353 0 0 0 +1227 3 -1.2 14.54444145279013 28.725579814318255 2.6537480007775818 0 0 0 +1230 3 -1.2 10.688869065449706 31.15631257817214 5.567719808959551 0 0 0 +1235 3 -1.2 6.674767422383458 31.773197796148963 6.742673419842675 0 0 0 +1368 3 -1.2 13.930143677020133 27.639346528281006 4.829069724768938 0 0 0 +166 1 3 26.896936088961233 33.900470411140724 0.04773133843296157 0 -1 0 +1510 3 -1.2 6.228268207180499 28.827730079046326 3.3756817095527802 0 0 0 +1545 3 -1.2 6.722343864240926 27.833383839122973 1.1383419693705445 0 0 0 +1621 3 -1.2 7.057545719021941 27.549474906119464 5.147745390878802 0 0 0 +2621 3 -1.2 18.754553405097447 34.17162698043043 5.224174256438757 0 -1 0 +2438 3 -1.2 15.139964829461878 33.121521528538075 4.291483721017419 0 -1 0 +1709 3 -1.2 8.16074452913676 31.696998960189752 4.315664519575879 0 0 0 +2046 3 -1.2 21.012071662348276 17.794698160918387 5.765116023953728 0 0 0 +1809 3 -1.2 7.3934655622185605 30.020543100952334 1.6396568892928691 0 0 0 +1881 3 -1.2 10.371417294197162 31.390295476641718 2.9423940955376855 0 0 0 +1609 3 -1.2 17.922478683076843 33.497779263221815 7.525537783473412 0 -1 0 +1885 3 -1.2 13.002985352827675 31.763114896036093 5.034827202436288 0 0 0 +1501 3 -1.2 18.442789231836795 33.38797305446711 1.9889740833631167 0 -1 0 +2082 3 -1.2 11.629673050142209 32.06418469963643 0.7244430570380471 0 0 0 +2092 3 -1.2 9.709987773330637 33.35066462129923 1.639808071020712 0 0 0 +2198 3 -1.2 10.417152566153117 27.281839934093426 4.207878666248615 0 0 0 +2261 3 -1.2 12.803435895614433 26.9591910248607 2.774751489964722 0 0 0 +2290 3 -1.2 12.849140801465776 29.923932395088936 6.678727824317214 0 0 0 +2372 3 -1.2 15.121942129338791 30.98308932531081 1.0474013373064015 0 0 0 +2602 3 -1.2 11.926939503922505 29.53944438208216 4.349618528042914 0 0 0 +2681 3 -1.2 11.068254289462462 28.525855445818053 2.1445898654527387 0 0 0 +2682 3 -1.2 9.411680034271672 29.655576359162605 4.253004615827798 0 0 0 +1214 3 -1.2 15.474710147277756 33.1980461150073 7.262183524815294 0 -1 0 +2853 3 -1.2 10.689288792374647 28.620722658073838 6.93300373330027 0 0 0 +2857 3 -1.2 6.855838895938178 32.91568561608463 2.0770970590598923 0 0 0 +353 1 3 19.63568880012566 33.233983416948675 1.1460565437370587 0 -1 0 +219 1 3 15.579858079756038 29.93892236817613 2.2631646590619496 0 0 0 +231 1 3 19.96720331246162 28.079180628726707 2.8003704867552006 0 0 0 +267 1 3 18.613454612854902 27.83741670710806 6.8393479759594475 0 0 0 +301 1 3 20.61274073586692 29.332046506361273 5.4199223159730865 0 0 0 +319 1 3 15.660796690407995 28.513280054498054 7.415450296095331 0 0 0 +417 1 3 16.840627423427506 32.346759429879825 7.28901814825822 0 0 0 +556 1 3 17.398839522605446 26.60312686149947 3.3369493251638596 0 0 0 +665 2 0.6 17.12871762291724 29.94353794530891 4.919654021268482 0 0 0 +708 2 0.6 18.10178703885918 30.262884066998932 1.0658127637269503 0 0 0 +1372 3 -1.2 13.222896196058139 32.99280100628113 2.915557088191149 0 -1 0 +2436 3 -1.2 32.9294118845545 32.34079558247237 17.116785910118843 -1 0 0 +363 1 3 6.80082526643073 34.252553946579354 2.734555907483354 0 -1 0 +859 2 0.6 17.4365040626301 32.59731356554975 3.9072572397049874 0 0 0 +57 1 3 16.792572480209998 27.15297165465314 16.876971455634312 0 0 0 +1315 3 -1.2 14.556630277491584 30.8790645546838 3.4057470966920156 0 0 0 +1321 3 -1.2 17.304867112329333 31.8192040562699 5.991761576731573 0 0 0 +1399 3 -1.2 18.72156179705532 27.530235961563413 3.550068158091458 0 0 0 +407 1 3 4.299844359349198 33.01496010506185 3.5341187649595436 0 -1 0 +1493 3 -1.2 16.45876584441525 27.47821167657932 4.1227028570669315 0 0 0 +1803 3 -1.2 16.843456264378652 30.46184577767362 2.9088506351888586 0 0 0 +2134 3 -1.2 16.30931958029147 29.022210012002574 1.1938664281520015 0 0 0 +2355 3 -1.2 19.108034761631078 28.984539114937444 5.933651183858886 0 0 0 +2461 3 -1.2 15.629398634308448 29.537598590374227 6.392779962869467 0 0 0 +92 1 3 24.13784808547917 27.08526980358906 4.410611727628751 0 0 0 +181 1 3 25.779143863613783 29.023224424057123 2.7854845544859503 0 0 0 +283 1 3 26.62501411974542 32.274755373278 6.389575501367854 0 0 0 +783 2 0.6 9.8673370552313 28.84555221514449 0.20178423382755373 0 0 1 +663 2 0.6 23.89927111972361 30.54737378274873 5.049123571233144 0 0 0 +680 2 0.6 20.6254668589534 32.710325641711215 4.798780619007041 0 0 0 +932 2 0.6 26.64406723431371 31.80263214006293 2.8939543480696543 0 0 0 +952 2 0.6 23.603889660593396 27.21611435370656 8.086848022430345 0 0 0 +2849 3 -1.2 5.159822152484734 33.53564690224564 6.079804742381208 0 -1 0 +1009 2 0.6 22.048274601421863 26.35620002957 6.9009271765548545 0 0 0 +1046 2 0.6 24.49214369482718 26.16488165472564 1.2623057103889574 0 0 0 +1142 2 0.6 26.162616105762876 28.109345062523204 7.234674836381518 0 0 0 +1212 3 -1.2 20.52200469081284 29.09706188182625 3.8345954170144787 0 0 0 +1485 3 -1.2 24.137650269382483 27.12525569397124 5.8865296585578974 0 0 0 +1526 3 -1.2 19.575980495187487 28.754615766290268 1.5557409608099813 0 0 0 +1610 3 -1.2 22.947056602399616 27.402904353535853 3.5846117937869604 0 0 0 +59 1 3 10.604185035500848 33.084828664900286 8.41743713198535 0 -1 0 +1699 3 -1.2 19.80521489037572 30.526485851608825 8.334530546403885 0 0 0 +2870 3 -1.2 20.96308037144482 33.03687174872061 1.984047524444236 0 -1 0 +2243 3 -1.2 2.976368458997996 33.12527947189332 4.186928785092021 0 -1 0 +2141 3 -1.2 21.20080806765662 30.66522199563813 5.606860466078896 0 0 0 +2565 3 -1.2 10.79689452380848 34.216319919809045 9.313436298901943 0 -1 0 +611 2 0.6 26.324244668581745 30.42168540101249 0.1978005507837586 0 0 0 +2563 3 -1.2 21.273436496140675 28.1637291090727 6.012053781089484 0 0 0 +2741 3 -1.2 23.47496153396965 32.90014793204543 1.1926079374169452 0 0 0 +2772 3 -1.2 25.983458232279467 32.03143024667309 5.071218641185134 0 0 0 +2882 3 -1.2 25.0259254678235 28.3797642741743 4.007267459427122 0 0 0 +2943 3 -1.2 20.664173453234877 26.752262919198238 2.3947585247161594 0 0 0 +189 1 3 29.232637154099017 31.177694460446425 7.403491901156483 0 0 0 +205 1 3 30.098444009829887 31.78949319821279 1.036742183551995 0 0 0 +766 2 0.6 28.13327269572489 28.480197015963277 0.7885278415236259 0 0 0 +828 2 0.6 31.620089012607338 30.948886591807646 4.9788575960129675 0 0 0 +853 2 0.6 29.17285380826269 29.34971485428244 3.7990754031485756 0 0 0 +483 1 3 6.1323738129901 18.163890855228363 0.9484457369054923 0 0 0 +1287 3 -1.2 30.177363608294197 32.32666597501825 4.19839621691354 0 0 0 +1270 3 -1.2 33.52244855060315 33.56639363177557 3.2504006253462125 -1 -1 0 +1658 3 -1.2 25.90544548313775 28.01340424107205 1.6828531671571514 0 0 0 +1689 3 -1.2 27.800846247575752 31.26591117844008 6.691313574600017 0 0 0 +1728 3 -1.2 30.041375441573578 25.989030646523375 7.164993647292175 0 0 0 +1805 3 -1.2 26.954933633651283 32.60403293232569 0.7178366224487485 0 0 0 +1911 3 -1.2 31.49826871507294 31.421628562111458 1.4203211716488002 0 0 0 +1936 3 -1.2 29.211353064509897 30.61159510968332 1.1977109725070743 0 0 0 +1961 3 -1.2 29.462286784021785 26.390473343632102 4.826300526998384 0 0 0 +2122 3 -1.2 29.668662455329173 33.049594057519336 1.9622619522494296 0 0 0 +2139 3 -1.2 26.765062510874813 26.23368181747588 4.240384076589654 0 0 0 +2186 3 -1.2 28.81120361490502 27.069463887621314 2.544063280636243 0 0 0 +2258 3 -1.2 29.39702949602895 32.75595265032692 7.621059105496488 0 0 0 +2434 3 -1.2 30.214582891160457 30.55870590341734 6.537112088972969 0 0 0 +1192 2 0.6 17.987853466836242 18.803882450717335 0.9615701316029672 0 0 0 +2781 3 -1.2 25.00850488208048 30.199249705407727 2.2487446993197557 0 0 0 +2860 3 -1.2 28.49129602744802 27.92032384498955 6.60367841369948 0 0 0 +2969 3 -1.2 27.082050023026838 29.5585228837867 3.2766662817913317 0 0 0 +150 1 3 2.0186654171512304 24.41521727975935 15.170727754583455 0 0 0 +153 1 3 4.038163023009941 23.24299741096793 11.570292011261287 0 0 0 +226 1 3 34.19359412438972 25.781450756126194 16.69634925097033 -1 0 0 +400 1 3 5.204158362478479 21.42255588593193 14.89864715133319 0 0 0 +413 1 3 1.225473887821399 22.993567044925264 12.700723636502442 0 0 0 +415 1 3 33.22588336980432 25.69802928042882 7.775819897175921 -1 0 0 +530 1 3 4.032483006952495 20.986223611893795 8.664346493013445 0 0 0 +540 1 3 0.01814959894524307 19.158642709152886 8.578374986717986 0 0 0 +574 1 3 5.574579541384823 20.672088903428122 11.216942244157135 0 0 0 +581 1 3 6.052625967572951 24.03121977084802 13.71697633243751 0 0 0 +675 2 0.6 3.056317089142878 19.761431069522654 12.87415540178645 0 0 0 +797 2 0.6 3.4948351052412345 17.773387243122457 10.257890222118066 0 0 0 +837 2 0.6 4.665541379781225 25.866000455205686 16.040311776463582 0 0 0 +839 2 0.6 1.540993466764139 25.661872222682348 10.029245571190316 0 0 0 +848 2 0.6 32.36361259778244 26.379633144022343 12.16357147531322 -1 0 0 +926 2 0.6 0.8328146595783317 22.464484986149404 9.544064384791307 0 0 0 +981 2 0.6 0.7743249555771244 20.389629143122033 14.99084633486614 0 0 0 +1002 2 0.6 3.897240995381803 18.56445349068994 15.450855865827556 0 0 0 +1038 2 0.6 33.61560871618256 19.55763986931213 11.742241111534364 -1 0 0 +1047 2 0.6 33.39876513344457 18.623115363419394 15.810538552467392 -1 0 0 +1186 2 0.6 3.8871024736325284 25.001141762125634 8.390416977718484 0 0 0 +1211 3 -1.2 2.383570221808476 23.333161804860094 16.083266328049188 0 0 0 +1300 3 -1.2 2.1472735621235657 17.967555085223704 14.166091960980456 0 0 0 +1325 3 -1.2 0.24579617843664417 23.28219867721964 11.652355548431336 0 0 0 +2822 3 -1.2 20.198712622669863 17.434073563125708 10.60620653784113 0 0 0 +1512 3 -1.2 2.67114409211708 23.526146950244364 12.264588507210414 0 0 0 +1568 3 -1.2 3.84505254458674 19.69562919566003 7.938914185391893 0 0 0 +1571 3 -1.2 1.1681690911595783 25.479686262594083 15.964909656143538 0 0 0 +1655 3 -1.2 4.458765035392586 21.781037972975206 11.772346696879739 0 0 0 +2202 3 -1.2 11.007452055681556 33.48351728360234 6.953996598397097 0 -1 0 +1862 3 -1.2 1.06084919837497 23.855116254411445 14.03734716318042 0 0 0 +1941 3 -1.2 1.3131017871056614 21.57316992008834 13.061954442222905 0 0 0 +2052 3 -1.2 5.263432500276588 20.795354882085256 9.657553331053622 0 0 0 +2083 3 -1.2 0.10086130234398252 25.192143001350487 8.41158795909712 0 0 0 +2136 3 -1.2 33.3896823141791 24.55807209160174 16.68578428149882 -1 0 0 +2218 3 -1.2 1.2885636697079965 18.38663086122997 11.924535079498014 0 0 0 +2710 3 -1.2 29.71568037852819 33.619923621266096 16.664359324656882 0 -1 0 +2527 3 -1.2 3.807362892433879 20.963760146747298 14.815941097041943 0 0 0 +2532 3 -1.2 5.87236016582431 21.137294718566416 16.287603097789102 0 0 0 +2535 3 -1.2 2.8656802496173936 21.247660983556468 9.56761307901548 0 0 0 +2576 3 -1.2 1.1262827078256161 18.23789774413873 8.935275095386249 0 0 0 +2601 3 -1.2 34.06198187225639 20.29509660076477 9.503698448984785 -1 0 0 +2647 3 -1.2 33.058745908583624 20.73992822576984 16.131547454593196 -1 0 0 +2792 3 -1.2 5.2002516192866635 23.03016551772582 14.61164264792913 0 0 0 +2886 3 -1.2 4.932833841971598 19.394688466572447 11.56083126670176 0 0 0 +2913 3 -1.2 31.897416739036625 17.959760409580017 11.320429065470696 -1 0 0 +2941 3 -1.2 34.09478686405407 18.14148483549178 13.808107534537815 -1 0 0 +2996 3 -1.2 3.1669078230397454 25.13587278112606 14.580655170925898 0 0 0 +15 1 3 13.560585390717792 24.84256907861524 14.720580873113915 0 0 0 +156 1 3 12.610763656472772 21.939075466436627 15.141013039588497 0 0 0 +268 1 3 14.530605203548873 21.08674571671296 13.069822923019595 0 0 0 +317 1 3 13.009138079498664 20.011381883958364 10.651662946161366 0 0 0 +364 1 3 11.386150280640155 24.796156863093234 12.590102489879268 0 0 0 +424 1 3 14.622417474311492 23.525608009141465 9.382041754167401 0 0 0 +479 1 3 9.905961441856949 19.414806627742294 14.22363763843653 0 0 0 +510 1 3 13.844483391905317 17.604221301726046 12.040826245089724 0 0 0 +691 2 0.6 9.374487955200012 20.772836383127125 10.945835351280168 0 0 0 +740 2 0.6 11.73099177825919 23.41513419594144 10.212344891416462 0 0 0 +767 2 0.6 14.147502245147143 25.45417222805562 11.378843718757569 0 0 0 +785 2 0.6 9.556030910907934 18.582813372645486 10.65505908648185 0 0 0 +801 2 0.6 10.606277608334317 24.39169316420927 16.222460406885986 0 0 0 +889 2 0.6 6.935802879312055 23.662670531723233 10.483347855507015 0 0 0 +922 2 0.6 8.818877051080392 22.929029633053535 9.943581387090402 0 0 0 +978 2 0.6 9.566280688814382 26.06903722718661 10.190583469074756 0 0 0 +1019 2 0.6 9.207781744538137 22.71290135910659 14.559233598465976 0 0 0 +1086 2 0.6 9.041621671333504 22.338936129560764 12.516222497744804 0 0 0 +1268 3 -1.2 4.412293011145404 22.099915142205653 7.751275338012647 0 0 0 +1277 3 -1.2 6.033089841057571 20.897383137392985 13.812812244951214 0 0 0 +1296 3 -1.2 13.393994694560684 21.22842539800248 16.200333231768887 0 0 0 +1327 3 -1.2 10.051077987501515 20.423842015302032 13.137344152335006 0 0 0 +1350 3 -1.2 5.279959800957119 17.784432488885592 13.946139180279136 0 0 0 +1394 3 -1.2 8.47738500281742 19.081558904963167 14.406081957876136 0 0 0 +1466 3 -1.2 5.209478868380173 23.949409939867834 12.323212628821258 0 0 0 +1697 3 -1.2 7.228452420364287 18.023619115563537 10.678826324597225 0 0 0 +1719 3 -1.2 14.243809534938128 24.890111082319745 8.880444944275862 0 0 0 +1735 3 -1.2 6.565896569772386 18.092926308951363 7.951742076459127 0 0 0 +1790 3 -1.2 11.220316282981587 22.37228976446005 15.118342607209534 0 0 0 +1792 3 -1.2 6.171377681565011 25.509436796847847 13.776819913486833 0 0 0 +1815 3 -1.2 10.488875046727452 18.04460125106999 13.631642885281249 0 0 0 +1828 3 -1.2 13.32304130159666 23.405992506947246 15.257366166898523 0 0 0 +1861 3 -1.2 8.20425319763121 21.552721324366214 16.056638487579686 0 0 0 +1866 3 -1.2 6.851133091230826 24.547535235735864 16.215323985386426 0 0 0 +2811 3 -1.2 22.765502448159285 33.2772337699081 3.636900816217262 0 -1 0 +488 1 3 30.309041570283235 34.06237486033504 7.525851704607923 0 -1 0 +1918 3 -1.2 14.29474663240655 18.397367881804428 13.259718436701084 0 0 0 +1923 3 -1.2 7.1066897124788735 19.177735525315658 16.8173435939257 0 0 0 +2099 3 -1.2 11.7282791291133 20.709644940746546 10.668387172229629 0 0 0 +2119 3 -1.2 7.500906717998897 22.160965133424398 8.146809788418116 0 0 0 +2149 3 -1.2 11.627172082599472 25.522030588533287 11.30626799175434 0 0 0 +2190 3 -1.2 15.180458085897477 22.379907607254772 13.335393156592005 0 0 0 +2192 3 -1.2 12.829397369159762 18.546961345965016 11.319970853700056 0 0 0 +2255 3 -1.2 10.639284764067076 19.664173650201963 15.48665391132168 0 0 0 +2274 3 -1.2 12.954247754885479 25.044056108612445 13.352214168966007 0 0 0 +2285 3 -1.2 8.479285506072895 19.744422608282058 9.04687757415906 0 0 0 +2338 3 -1.2 10.593875204970063 22.348841393800704 8.685137404694263 0 0 0 +2361 3 -1.2 13.111560592161798 25.835213750323362 15.729779314769644 0 0 0 +2379 3 -1.2 14.103827503411019 20.579035582770096 11.669773089308169 0 0 0 +2839 3 -1.2 14.985309609622437 17.513725587871853 10.988560755421421 0 0 0 +2475 3 -1.2 11.427961122279221 23.32775134890117 12.519352371082812 0 0 0 +2538 3 -1.2 6.895580519096005 21.35147747490986 11.307462451459791 0 0 0 +2555 3 -1.2 3.9677747915184236 23.706231935533026 10.192193875899497 0 0 0 +2559 3 -1.2 7.384986977380932 23.422850242498978 13.577531975375907 0 0 0 +2635 3 -1.2 13.173563734999096 21.188283619791896 13.86051570479948 0 0 0 +2646 3 -1.2 7.591511545170519 20.107710079660432 6.911173667422263 0 0 0 +2704 3 -1.2 9.202668971964528 24.440232510292 11.571157503594588 0 0 0 +2707 3 -1.2 12.152938847602876 21.64960554989462 6.889915500833477 0 0 0 +2714 3 -1.2 13.628323707438016 19.811517373190533 9.336551401023097 0 0 0 +2737 3 -1.2 5.981815693253238 25.797974849853006 9.515322950220707 0 0 0 +2832 3 -1.2 11.047155292632421 19.842555530888472 8.039093965891661 0 0 0 +2843 3 -1.2 13.934808537429596 23.270215854937884 10.68076250761867 0 0 0 +2865 3 -1.2 10.642498065122664 25.396593910943647 13.740546865787183 0 0 0 +2888 3 -1.2 15.41327316949871 18.163834200669175 15.551504545974202 0 0 0 +84 1 3 18.03629214521448 19.220692814838653 15.956938258241642 0 0 0 +148 1 3 17.912369877254218 19.61582729650581 10.577042368572153 0 0 0 +217 1 3 15.814872763003283 18.494990395709703 14.052384004068141 0 0 0 +414 1 3 16.041012312877456 17.32209898007112 16.806762062957443 0 0 0 +564 1 3 17.50696953717914 24.308681919855555 11.97562114376629 0 0 0 +605 2 0.6 15.661142840721201 22.11968282670964 16.050686281350604 0 0 0 +787 2 0.6 18.10949823662102 22.398081844221196 9.13669273141473 0 0 0 +1093 2 0.6 17.652642279773602 21.686276716211186 13.646667559956617 0 0 0 +1250 3 -1.2 17.121685096980844 27.913590843248027 7.342674837692555 0 0 0 +1251 3 -1.2 17.342867435001395 24.592613278511557 13.58196527377536 0 0 0 +1276 3 -1.2 16.13080705371667 24.58221556420234 11.546731031837918 0 0 0 +1486 3 -1.2 17.469295754571945 18.87505570361723 14.552791417821044 0 0 0 +1569 3 -1.2 15.990282386774163 23.06741132510045 9.035564023727112 0 0 0 +1739 3 -1.2 18.251894940242277 20.30950183061247 7.470277511015246 0 0 0 +1894 3 -1.2 17.61338006919593 18.82934646677438 9.270064777955575 0 0 0 +1904 3 -1.2 19.4971089043527 18.145701771273004 7.780154612131346 0 0 0 +2004 3 -1.2 13.717642397743214 22.524253897332315 8.448423209256463 0 0 0 +2191 3 -1.2 15.571770463934216 20.10639353335508 13.784458042072645 0 0 0 +2237 3 -1.2 17.600318089763302 23.17832735839501 15.876752955840852 0 0 0 +2270 3 -1.2 19.468534728799906 19.45358884358574 16.14952773812526 0 0 0 +2393 3 -1.2 19.142069290272637 20.390485082569022 10.27156082704347 0 0 0 +2427 3 -1.2 18.561957762790847 25.320613094655556 11.646029798818176 0 0 0 +2536 3 -1.2 15.122712753460242 24.911843763208363 14.711959981497381 0 0 0 +2630 3 -1.2 18.356900532403227 18.571069034973807 11.687687180993457 0 0 0 +2782 3 -1.2 16.73602452932841 20.335871715630876 11.056406312103894 0 0 0 +2803 3 -1.2 19.42079897698736 26.358535299655916 14.232921207308495 0 0 0 +2823 3 -1.2 19.940718376934235 20.620519848685078 13.58374502528395 0 0 0 +2833 3 -1.2 18.02848261268218 22.947462543207628 11.728768912529047 0 0 0 +2872 3 -1.2 19.659943752735145 24.56088446484083 15.962539361350938 0 0 0 +454 1 3 18.988134096104925 34.32432193857271 6.690021320301295 0 -1 0 +2960 3 -1.2 18.25461962824466 25.959418165132586 9.098023945606164 0 0 0 +2993 3 -1.2 17.182473064009727 20.359542721738713 16.427401594995757 0 0 0 +78 1 3 18.71845281841068 23.594608145483452 16.714830504803995 0 0 0 +134 1 3 21.085295580635115 19.723372341110675 13.191326025712 0 0 0 +183 1 3 25.21652580950962 21.606442736739545 13.56047415151243 0 0 0 +187 1 3 24.633815418895885 23.802620425168275 8.280409321415068 0 0 0 +330 1 3 20.243403870919945 25.152410895930853 14.570996381805735 0 0 0 +333 1 3 24.373032723989134 19.663028760126934 11.0769977430999 0 0 0 +396 1 3 21.648768024390755 23.48671284272401 8.470126474295613 0 0 0 +509 1 3 24.21975366887572 21.078078391900956 16.373673512738446 0 0 0 +650 2 0.6 22.51271148355087 22.38449013349451 11.834140941866748 0 0 0 +2642 3 -1.2 19.888235781835 34.2894762102349 0.15346151327244983 0 -1 0 +702 2 0.6 21.691428370840764 19.14975996042305 16.504672133464975 0 0 0 +751 2 0.6 20.82040094326763 21.58658789964644 15.390182804989006 0 0 0 +927 2 0.6 19.982924866411594 22.078415047772285 11.619760905217557 0 0 0 +928 2 0.6 26.07046475026327 23.7406096634549 11.19166939578585 0 0 0 +1013 2 0.6 20.53212041077643 24.951717170453865 10.813060627293368 0 0 0 +1122 2 0.6 21.447005331231285 20.251816590388827 9.635039120083984 0 0 0 +1171 2 0.6 23.151898139483315 24.13614440971375 15.149398034455727 0 0 0 +1228 3 -1.2 23.929422716853317 20.38132281360781 9.873823244457565 0 0 0 +1355 3 -1.2 20.48444462764549 18.291841368193058 12.910865615373439 0 0 0 +1374 3 -1.2 26.31000119509168 22.936053719486534 13.627431782932582 0 0 0 +1378 3 -1.2 22.843904728418828 21.562477410318426 16.132328942909314 0 0 0 +1389 3 -1.2 21.60363798063101 20.28614080308455 11.905720420782007 0 0 0 +1456 3 -1.2 25.943074905149146 17.700466104588706 16.833326144396953 0 0 0 +1462 3 -1.2 24.354493170928734 19.619950111705567 16.99193805194609 0 0 0 +1464 3 -1.2 20.357787321107416 23.972123907343928 13.67987531255461 0 0 0 +1527 3 -1.2 21.159713347356096 22.842065928063406 9.710803518590799 0 0 0 +1628 3 -1.2 25.353573191460843 24.60522172633896 15.314470063755348 0 0 0 +1639 3 -1.2 24.362165605213022 20.695341897169794 12.29150141727492 0 0 0 +1922 3 -1.2 25.92204580590483 18.288926931509014 13.30940382161901 0 0 0 +2095 3 -1.2 21.425805634291272 24.943537566264443 8.564667305250387 0 0 0 +2100 3 -1.2 21.569789944787455 19.587493656723762 7.165500238465667 0 0 0 +757 2 0.6 24.644387572343742 33.917867803011774 4.668370733217359 0 -1 0 +2236 3 -1.2 25.020639833160345 20.962120205715603 15.007245486494753 0 0 0 +2583 3 -1.2 25.688202575041732 25.139456632959412 12.875179142739327 0 0 0 +2724 3 -1.2 23.70364972162812 18.351824651209416 11.251966770175406 0 0 0 +2746 3 -1.2 23.210023298234766 23.159820072944253 8.364185218661742 0 0 0 +2757 3 -1.2 24.46497139727186 25.211857243396015 8.676252118218866 0 0 0 +2877 3 -1.2 22.14181826353054 19.582839848754805 14.21909205281423 0 0 0 +2911 3 -1.2 26.516601645264856 20.69177901819488 13.047835851548397 0 0 0 +2927 3 -1.2 24.079647503600196 22.632165404190584 13.55547720044326 0 0 0 +49 1 3 26.171002911306612 24.43429500703488 14.099236921160964 0 0 0 +236 1 3 26.76345361524436 19.22594383233064 12.514287055801734 0 0 0 +263 1 3 29.52081771944719 19.249406050176976 16.038127204610667 0 0 0 +281 1 3 29.21431518388543 24.531393507658507 14.145656115671612 0 0 0 +446 1 3 28.78625193658796 19.536385516403413 9.092341346965746 0 0 0 +486 1 3 30.419810748149473 25.180607948668925 8.469457546295898 0 0 0 +601 2 0.6 28.59023568210651 23.27085125912408 10.816423763140854 0 0 0 +648 2 0.6 27.30683151616686 17.708716601506588 14.918123246158597 0 0 0 +756 2 0.6 29.43939260854153 26.168391941204476 11.527908831230826 0 0 0 +764 2 0.6 31.270529258594546 21.971226499052246 16.00226948635166 0 0 0 +838 2 0.6 27.380330146508662 24.57604789130707 8.477580645907674 0 0 0 +939 2 0.6 28.794384524480122 21.275360237003273 13.513509493770272 0 0 0 +1036 2 0.6 27.81817807549143 22.16231857568432 8.78066497223189 0 0 0 +1048 2 0.6 30.727860724500665 19.8538542077853 10.937192807695679 0 0 0 +1057 2 0.6 30.302068905011872 18.016283243536524 12.921214102321844 0 0 0 +1314 3 -1.2 29.920758944843225 20.325866042379346 8.504089635797014 0 0 0 +1518 3 -1.2 29.33223287943638 24.26703946684565 12.671910116214672 0 0 0 +1696 3 -1.2 30.579495211099264 18.803599722877564 15.087015189135569 0 0 0 +1853 3 -1.2 29.653527675310375 23.293938248476806 14.848044580001838 0 0 0 +1950 3 -1.2 25.933593236096872 19.311390448081738 11.160996492939232 0 0 0 +2049 3 -1.2 29.030839797202187 18.25929178992801 9.79081175000304 0 0 0 +2070 3 -1.2 28.19141200151757 18.901775287199182 12.534279185802113 0 0 0 +2094 3 -1.2 28.326591079966217 19.809691673096534 15.359438975530692 0 0 0 +2128 3 -1.2 29.629442726081123 23.928852441879588 8.551852897433266 0 0 0 +2166 3 -1.2 27.288315033711303 22.955681715693157 16.435884226394542 0 0 0 +2351 3 -1.2 25.609699693653113 23.1475548378275 9.180344718940809 0 0 0 +2352 3 -1.2 27.401267302392508 25.322497544237212 10.404645508507194 0 0 0 +2518 3 -1.2 30.020518856418825 25.726000582354715 14.555116166531517 0 0 0 +1104 2 0.6 24.2656184407075 17.964642023748958 3.679168034468613 0 0 0 +2755 3 -1.2 30.05239773015839 20.122736067514918 17.11640381967703 0 0 0 +2756 3 -1.2 27.671456454999596 24.930837033591327 14.347046707329334 0 0 0 +2926 3 -1.2 28.345853698520013 20.521573625550577 10.117143726620672 0 0 0 +81 1 3 1.0789705933571534 27.469999670758277 12.482279009160587 0 0 0 +133 1 3 3.82802814852091 28.055310966979025 8.502227047149152 0 0 0 +211 1 3 1.4062101994313707 30.919557404043186 10.70804508672627 0 0 0 +438 1 3 33.85981280722473 28.096825146365337 14.815859934627756 -1 0 0 +529 1 3 33.7563748225999 33.01396164214457 16.064363612426536 -1 0 0 +580 1 3 2.2810957319483816 32.86736184452982 15.365393255351927 0 0 0 +903 2 0.6 4.3915212177315714 26.63373938096663 13.208497959476068 0 0 0 +948 2 0.6 1.8746942730635214 30.15248115711007 16.77723622321247 0 0 0 +949 2 0.6 3.9036300666761954 31.150917460691794 12.912035200493525 0 0 0 +982 2 0.6 2.9648212550035034 27.93374038400416 15.812273036970419 0 0 0 +1181 2 0.6 4.086181243537955 28.661426647443303 11.516907477441539 0 0 0 +1185 2 0.6 0.3067713473349089 33.28305257873962 12.37269832564032 0 0 0 +1216 3 -1.2 0.2730830200987876 28.535623441474364 9.137341497442574 0 0 0 +1285 3 -1.2 34.331849574456776 31.15332452065158 11.192547836337226 -1 0 0 +1356 3 -1.2 2.221239561753198 31.98428647206673 11.449262966145438 0 0 0 +1439 3 -1.2 5.676694044915363 31.42568797891596 11.414325182951538 0 0 0 +1443 3 -1.2 33.539548165970366 26.993398708451213 15.995515364649355 -1 0 0 +1469 3 -1.2 34.3064543905065 29.354362799143377 15.417394193255749 -1 0 0 +1502 3 -1.2 32.834331178241335 27.163288319744755 8.256765810777468 -1 0 0 +1521 3 -1.2 4.651332991521537 32.214860250838925 9.240287076513535 0 0 0 +1674 3 -1.2 2.99956466055463 31.57619143603701 15.263267998002377 0 0 0 +1782 3 -1.2 32.32312937473441 29.59309011873684 8.750002951684582 -1 0 0 +1817 3 -1.2 2.3459126692171135 29.744872891768626 10.820525197494376 0 0 0 +1860 3 -1.2 3.1354912607544843 33.893444871166025 16.23189869600019 0 0 0 +1947 3 -1.2 0.951633592758569 32.565282558351335 16.196493064173897 0 0 0 +1952 3 -1.2 31.690844572823522 33.636184810677264 7.346331068657179 -1 0 0 +2168 3 -1.2 1.272217345897311 31.283159734973687 9.224961014249912 0 0 0 +2212 3 -1.2 0.25260016255263 26.421663391409517 11.822896621984967 0 0 0 +2293 3 -1.2 0.7205088812751796 27.33857268264373 14.111411564773071 0 0 0 +634 2 0.6 5.545457787575469 23.71942844721821 1.562437641065098 0 0 0 +2586 3 -1.2 5.3653003970751 29.140558297190434 13.337731686804325 0 0 0 +2600 3 -1.2 2.9653570552897173 27.026042345775554 9.098231169028344 0 0 0 +2620 3 -1.2 4.849964561121792 28.640159444380274 9.412515015912126 0 0 0 +2632 3 -1.2 0.5239730773712509 28.82595084795969 12.452081465586401 0 0 0 +2712 3 -1.2 2.5239611277401646 27.178507709928866 12.363432748919362 0 0 0 +2852 3 -1.2 32.67648530513671 27.94058705613951 13.939760557670649 -1 0 0 +80 1 3 14.447558860228176 29.287035454317444 12.928213257370285 0 0 0 +132 1 3 8.992384230251151 31.670023325495134 12.927133849945253 0 0 0 +173 1 3 9.076081731413604 28.481301380757447 14.68668296017622 0 0 0 +175 1 3 5.799526046121207 31.744659866088643 10.00505840714782 0 0 0 +188 1 3 11.921203822398809 31.144668416001224 10.31266237141095 0 0 0 +228 1 3 6.082224926088872 28.772602003546023 14.561339862016132 0 0 0 +280 1 3 9.950510036960047 29.026908393456306 11.82293244226106 0 0 0 +352 1 3 10.79876563992137 30.767965574984554 15.101194185669032 0 0 0 +419 1 3 13.737442836588832 32.72318253476729 11.523306567902731 0 0 0 +552 1 3 12.210547878772042 28.19582102312488 10.105452805971442 0 0 0 +593 1 3 15.161118570842973 28.11587714760656 10.299108566672166 0 0 0 +676 2 0.6 13.627112827694312 28.146099837702597 15.858835725123598 0 0 0 +750 2 0.6 6.878870758374109 28.339514220313145 10.40551934576736 0 0 0 +754 2 0.6 11.670232126678838 27.320812603931348 14.91831178552137 0 0 0 +874 2 0.6 13.628105141152316 30.37348495555502 16.512539502155914 0 0 0 +1148 2 0.6 8.426042845930624 25.622111097752708 13.272909442106535 0 0 0 +1260 3 -1.2 6.133013105376109 29.792848472004877 15.763826484362198 0 0 0 +1282 3 -1.2 6.681647607843433 30.738875747325636 9.145428030196367 0 0 0 +1407 3 -1.2 13.324667578663684 30.20051621283351 12.562396102235242 0 0 0 +1517 3 -1.2 8.907308373179012 30.17510364507044 12.43397473901263 0 0 0 +1823 3 -1.2 12.458740433413471 29.7150135156542 9.773812331306 0 0 0 +1877 3 -1.2 14.225855821659502 32.07271148025538 15.377053645723477 0 0 0 +1938 3 -1.2 9.370835134441164 33.31589177209753 16.272724359750246 0 0 0 +1957 3 -1.2 13.923285389831848 28.020359903228155 13.46000637818277 0 0 0 +1965 3 -1.2 10.760464897857963 30.476236207244526 11.124003318267391 0 0 0 +2000 3 -1.2 9.421020202944764 27.495520271435797 15.711712963443995 0 0 0 +2101 3 -1.2 5.364703183900465 27.667747634495377 15.236256738930003 0 0 0 +376 1 3 19.53620798663794 17.579606115370424 11.91246116467146 0 0 0 +2116 3 -1.2 9.002191299724739 30.495672892470342 9.01993891715792 0 0 0 +2137 3 -1.2 9.053924162785737 28.20770903981306 10.970187163936894 0 0 0 +2172 3 -1.2 14.224621573390209 32.598735810610286 12.985558931925546 0 0 0 +2305 3 -1.2 7.493472382312341 27.26491599106242 8.294341350807501 0 0 0 +2308 3 -1.2 12.233384198788185 32.38251791900822 11.310369156839435 0 0 0 +2319 3 -1.2 13.641752847987139 27.664257242981638 10.339411727441396 0 0 0 +2371 3 -1.2 14.018560119165215 31.791901342319964 10.391044804947636 0 0 0 +2402 3 -1.2 9.103503037120669 32.63454491384509 8.271637422258964 0 0 0 +2403 3 -1.2 11.370796494797816 28.29553726849535 11.374465405672074 0 0 0 +2444 3 -1.2 11.397359937227176 31.5843796845383 16.14889950890932 0 0 0 +2599 3 -1.2 7.588250162011821 28.388164432548084 14.251478000137396 0 0 0 +2721 3 -1.2 9.447820100718157 29.90357758571374 15.228663902335265 0 0 0 +2735 3 -1.2 7.842672914860055 31.921596299626255 13.785914115790428 0 0 0 +2739 3 -1.2 11.490088444353573 31.90780456746955 8.99617388162399 0 0 0 +2752 3 -1.2 9.913087659526125 28.355822443257274 13.356542334427328 0 0 0 +2780 3 -1.2 7.153373278552946 32.57585139307315 9.727070332125228 0 0 0 +2795 3 -1.2 9.176287238863628 32.584714162066696 11.792653141334236 0 0 0 +2804 3 -1.2 11.743853009498263 29.64683565912432 14.840457263090205 0 0 0 +2875 3 -1.2 10.347420246297128 31.596656752868494 13.828157154624309 0 0 0 +2876 3 -1.2 11.55876709080906 27.42341762054939 8.950833783611555 0 0 0 +320 1 3 16.995930875452867 30.744988911459288 13.45365080789057 0 0 0 +461 1 3 16.470725507450318 25.584165174139244 14.373539773655855 0 0 0 +487 1 3 18.738157397565143 27.24710419719132 9.596388532752982 0 0 0 +642 2 0.6 20.13543853709148 28.341295767095243 13.351737689173007 0 0 0 +1074 2 0.6 16.957057989892853 30.605428928101084 10.334435746772943 0 0 0 +1179 2 0.6 17.990876717443314 27.490689105024057 12.334313531714413 0 0 0 +1190 2 0.6 18.53110310102363 29.133798391381088 15.259733431950359 0 0 0 +1236 3 -1.2 19.138292977635754 33.10236828974016 12.614096110460968 0 0 0 +1288 3 -1.2 16.42780988684889 26.845262971970627 13.622648832741886 0 0 0 +1328 3 -1.2 15.794929047960219 28.06938940999117 16.27398183046021 0 0 0 +1405 3 -1.2 19.286811916386572 31.758361742006784 10.481269664978788 0 0 0 +1428 3 -1.2 20.032892636495745 27.325467502411467 10.501827611251647 0 0 0 +1540 3 -1.2 15.176031006053272 29.09489803429209 11.504093924884142 0 0 0 +1638 3 -1.2 16.975042125382917 25.952688301567253 15.826535613022164 0 0 0 +1745 3 -1.2 15.61569374842414 29.953067208043535 13.72536331746845 0 0 0 +1993 3 -1.2 18.024461146390866 28.483131666017588 10.035909427446844 0 0 0 +2121 3 -1.2 16.69938467731366 31.634337171779496 12.293454219701424 0 0 0 +2133 3 -1.2 16.058617195680405 27.019608191888494 10.519277685852447 0 0 0 +2294 3 -1.2 16.7804442642466 31.404126229138654 8.404162004690644 0 0 0 +2311 3 -1.2 17.38904677083303 31.43178149486721 14.711527274695886 0 0 0 +2501 3 -1.2 15.31953128019002 28.81537207495242 8.911970908212036 0 0 0 +2550 3 -1.2 19.045409155047626 33.09145735583664 16.69267099709899 0 0 0 +2719 3 -1.2 16.09441738637231 33.51269946432117 16.8679219048579 0 0 0 +2981 3 -1.2 18.071403288934032 29.746070125257468 13.108409036918642 0 0 0 +18 1 3 20.335824977217154 30.911398595534095 9.630607939233187 0 0 0 +111 1 3 26.374984793808945 31.52223957391413 15.788707839206042 0 0 0 +112 1 3 21.323269829038917 28.237843736951156 10.560772850482348 0 0 0 +144 1 3 20.242980812361598 32.13106956842044 16.426163915627303 0 0 0 +516 1 3 25.545277077841714 29.238426441072477 10.36062602267975 0 0 0 +834 2 0.6 22.79585800147831 27.42112670171778 13.906536602472077 0 0 0 +988 2 0.6 20.43767232873888 30.94457083099297 13.0548650650782 0 0 0 +1103 2 0.6 23.075592639044046 31.172095015329585 13.601707326735024 0 0 0 +1159 2 0.6 21.12322316678459 27.831369466270168 15.772041441793728 0 0 0 +1163 2 0.6 25.690796013665757 31.997148348347253 12.130884102734814 0 0 0 +1194 2 0.6 25.170246145075374 26.174386150757304 10.685241681029035 0 0 0 +1311 3 -1.2 21.984767952970753 27.888156846655 11.825209714827052 0 0 0 +1342 3 -1.2 21.5451508856882 31.899637836937593 9.577241630385187 0 0 0 +1414 3 -1.2 22.0667807342153 32.25114863606231 11.878454214854706 0 0 0 +1425 3 -1.2 25.3365714747723 31.812732317628072 17.00650462848808 0 0 0 +1449 3 -1.2 21.604387167188925 25.710078308003563 14.851081241760246 0 0 0 +1970 3 -1.2 21.87049374002598 17.261939741473476 8.01776427315882 0 0 0 +1834 3 -1.2 22.05045641638114 28.138284303375595 9.30228382331888 0 0 0 +1942 3 -1.2 25.253231843092472 28.409377438477215 11.716627652803814 0 0 0 +1962 3 -1.2 19.335321248904062 27.74239413931058 8.166523543178068 0 0 0 +2064 3 -1.2 25.66188839917045 32.292922030481265 7.492644887385316 0 0 0 +2135 3 -1.2 25.003066179160573 28.478041157154028 9.19210918303153 0 0 0 +2307 3 -1.2 24.83834911301971 27.664798879579198 14.174408821860075 0 0 0 +2388 3 -1.2 20.737778111733068 29.730883995333095 10.58698506073046 0 0 0 +2418 3 -1.2 19.859126264525788 30.727924405491756 16.541707537515144 0 0 0 +2464 3 -1.2 24.91987988452258 30.57395303668802 10.509296699015817 0 0 0 +2779 3 -1.2 24.837875330353945 29.996980909080555 13.496214915201882 0 0 0 +2956 3 -1.2 21.441277636959725 29.626973642993924 14.508095692979794 0 0 0 +171 1 3 25.486059373260204 28.682557701622272 13.31447376275508 0 0 0 +336 1 3 28.710719264381577 29.64869191969644 12.605173105884905 0 0 0 +583 1 3 29.204798876671966 31.486245262662184 10.308836676170188 0 0 0 +620 2 0.6 27.31173572825537 26.77032925976713 11.914574101125199 0 0 0 +626 2 0.6 28.11866210217609 28.006179766022715 15.249618303336367 0 0 0 +791 2 0.6 29.249867933027566 28.28823363649845 9.723763250874716 0 0 0 +963 2 0.6 30.618536494029822 28.04724340602419 14.443252430148062 0 0 0 +1255 3 -1.2 29.18158905323538 30.707772892993535 8.866234261214975 0 0 0 +1330 3 -1.2 29.522207329482143 30.459477845374813 11.398570339046325 0 0 0 +1390 3 -1.2 27.91710899031327 32.21492792260874 10.291063511408895 0 0 0 +1579 3 -1.2 30.28924496361322 26.122777745125124 9.597367641576291 0 0 0 +1730 3 -1.2 30.05181367147777 31.235659294298287 16.17042830600529 0 0 0 +1912 3 -1.2 26.48611333911686 30.05505633999689 15.812912561296214 0 0 0 +1934 3 -1.2 29.065117609209988 28.2589348467784 12.119337787542673 0 0 0 +2143 3 -1.2 29.165926212809524 32.88973282504234 14.371624780450516 0 0 0 +2238 3 -1.2 27.775455853815405 32.090131341788094 16.27831465961291 0 0 0 +2253 3 -1.2 25.976581703126964 32.33099204540939 14.639968571824 0 0 0 +2334 3 -1.2 31.395852894475283 29.305775382541093 17.035134062527877 0 0 0 +2404 3 -1.2 29.357760309101934 29.768900698621955 13.937949655643283 0 0 0 +2407 3 -1.2 26.962045250622047 28.422404120236536 13.436499378493817 0 0 0 +2410 3 -1.2 30.346566506218288 32.43709015643101 10.234519793322864 0 0 0 +2414 3 -1.2 27.55923206467198 30.613086258716088 12.557237303017828 0 0 0 +2551 3 -1.2 29.00546944251388 29.036330183380414 17.12133298601734 0 0 0 +2884 3 -1.2 27.03725907156928 29.1596297799791 10.207946729128322 0 0 0 +214 1 3 2.43427398074556 32.51623078420414 1.3562312063155624 0 -1 0 +777 2 0.6 4.1653030759635135 20.41481705504044 1.8352807309588273 0 0 0 +1507 3 -1.2 13.178156934751398 27.780332493456314 0.6341639725514285 0 0 0 +1806 3 -1.2 9.975164457791578 33.15746030792825 4.635326403450543 0 -1 0 +738 2 0.6 12.941597449293916 33.97354121224608 0.9817978016298794 0 -1 0 +1841 3 -1.2 17.513932588963566 17.979741286568064 16.781781100472315 0 0 0 +973 2 0.6 30.385531655465083 27.688338619881176 1.0511584237172154 0 0 0 +525 1 3 29.106276871217247 17.491165148655412 1.4848342671676147 0 0 0 +2383 3 -1.2 5.005125450906489 33.552495787545695 14.94027941163361 0 -1 0 +1935 3 -1.2 29.08460130584373 17.877521418996487 16.769355869174433 0 0 0 +521 1 3 1.052249383362647 17.625300225264418 13.203508884198845 0 0 0 +717 2 0.6 15.661238550346122 26.831065271126523 0.6713088342050317 0 0 0 +1819 3 -1.2 27.26813278199119 33.74377647132866 6.1990602921754965 0 -1 0 +2731 3 -1.2 9.511977819618078 31.067678835321768 0.602398130662102 0 0 0 +272 1 3 4.678861662282438 34.29886806423176 16.16787278956106 0 -1 0 +905 2 0.6 30.937387587565205 25.063551922164915 16.671769801107388 0 0 0 +76 1 3 5.329915021196723 17.34187018748662 20.434984041338375 0 0 0 +165 1 3 2.5346733604971203 19.98331759240903 20.563158209393183 0 0 0 +256 1 3 4.938146088960851 20.03131279067204 24.097097636569423 0 0 0 +2749 3 -1.2 25.7051746373569 33.74144729650093 28.566500260534543 0 -1 0 +335 1 3 1.2420622964520043 24.396734466457843 22.61401589481627 0 0 0 +1620 3 -1.2 22.783943911225737 25.822563511174078 17.810682650863114 0 0 0 +388 1 3 5.701392708711743 22.70649614117033 25.17967701553336 0 0 0 +418 1 3 4.080996885546088 25.146124649045785 18.993279724405085 0 0 0 +2933 3 -1.2 19.446923382805746 22.289065861267446 17.265532468469214 0 0 0 +533 1 3 0.29580442050334455 21.86117724797798 21.358391155817465 0 0 0 +587 1 3 3.744699346247368 24.67595838647935 24.228497966934327 0 0 0 +618 2 0.6 32.36894408057684 20.78504120563057 19.8630974787371 -1 0 0 +687 2 0.6 5.777419911034528 22.46731531713354 20.421727199849176 0 0 0 +745 2 0.6 33.9629937345083 24.559408488693688 19.582829385446846 -1 0 0 +765 2 0.6 2.030118242155379 23.11387923752548 18.336883004270476 0 0 0 +869 2 0.6 4.450339861956867 21.575168206236363 18.21254512033014 0 0 0 +871 2 0.6 5.031753728334439 26.06338340862565 21.772563720957027 0 0 0 +896 2 0.6 33.843305760495966 22.336083589122474 17.256379790239368 -1 0 0 +936 2 0.6 32.46075426378349 19.344676455978096 17.794286433412637 -1 0 0 +971 2 0.6 5.263333327893035 18.359797802210508 17.631551481567556 0 0 0 +980 2 0.6 34.04863215081426 25.14747045107404 25.74192025754754 -1 0 0 +983 2 0.6 33.71162179062362 18.847746461644586 22.472618873085125 -1 0 0 +1128 2 0.6 2.0187616100080734 21.459331641108193 23.71580447321445 0 0 0 +1352 3 -1.2 2.9626672173675916 25.426203853461995 18.042437599139692 0 0 0 +1395 3 -1.2 33.58687221751633 20.918559494829537 21.785217015463513 -1 0 0 +1522 3 -1.2 0.4902664432111146 25.33958789438636 23.47064024461713 0 0 0 +1617 3 -1.2 0.6697902697450582 20.793578800496622 27.074362881130988 0 0 0 +1680 3 -1.2 2.010053432737598 18.618906081359338 25.96353068247063 0 0 0 +1692 3 -1.2 5.424070873547335 25.193226768709415 18.080375921207327 0 0 0 +1756 3 -1.2 34.301869427691045 22.46997859507061 20.057238207495303 -1 0 0 +1971 3 -1.2 4.0776146059216725 20.98479579954977 23.29941922173677 0 0 0 +2051 3 -1.2 33.45138233077604 18.139323455589253 19.820912896743227 -1 0 0 +2268 3 -1.2 4.2331569417297885 17.736590104859108 19.52534023439901 0 0 0 +2296 3 -1.2 4.331220972413318 23.500548421945833 25.122518291145386 0 0 0 +2331 3 -1.2 2.4617438537515905 18.76635738966966 21.56323568224002 0 0 0 +2353 3 -1.2 1.6807829578247 21.11065073423773 21.30590117068365 0 0 0 +2358 3 -1.2 1.7483893094380836 19.524792470241962 19.344496998418748 0 0 0 +2369 3 -1.2 3.905855708226287 18.696196036200014 23.527017309430825 0 0 0 +2422 3 -1.2 33.50145681002191 17.41880182284146 24.109111890584895 -1 0 0 +2525 3 -1.2 3.9004627750279703 23.773143424810506 19.545643573049407 0 0 0 +2585 3 -1.2 33.846428128737514 23.101982825301494 26.789785052961975 -1 0 0 +2590 3 -1.2 0.5209670593620582 22.972318992633053 22.478072216143683 0 0 0 +2777 3 -1.2 3.8347988768318384 20.553601063259222 20.2298416019051 0 0 0 +2784 3 -1.2 2.587239289420995 24.04072454502661 23.36858361765513 0 0 0 +2806 3 -1.2 0.0414469114718591 26.24509654488016 18.185034288175043 0 0 0 +2861 3 -1.2 1.3899169508569018 24.810149649164284 21.218563200115195 0 0 0 +2897 3 -1.2 0.5602225988233688 20.105705022738444 24.798273643942583 0 0 0 +2935 3 -1.2 34.20332701781739 18.518898264916334 27.035904556728866 -1 0 0 +74 1 3 6.67578659833698 24.31768781095414 17.66615455679027 0 0 0 +2350 3 -1.2 30.515027885865802 17.633493278611333 18.76715774160179 0 0 0 +167 1 3 14.555470505658576 20.077502040327474 24.649548010769788 0 0 0 +249 1 3 8.126757639374802 26.304863012137716 23.742352941452012 0 0 0 +253 1 3 12.457996486568641 23.540920996480168 24.355030723441903 0 0 0 +264 1 3 12.101698738272736 19.57896078760928 18.650947283497384 0 0 0 +291 1 3 7.532854568193494 25.710519694010724 20.944581426030236 0 0 0 +295 1 3 9.228539411515474 19.897656283362526 19.066100550025237 0 0 0 +298 1 3 8.337653262928862 23.406807419419536 24.212017859864723 0 0 0 +337 1 3 13.095249065671359 23.566633153177467 21.47834231073248 0 0 0 +346 1 3 12.657077314100205 22.482195379383615 18.77477223278166 0 0 0 +462 1 3 9.430196983936709 18.8965543265671 23.21985874916419 0 0 0 +480 1 3 9.324042423160586 24.417084189207667 19.126023837087775 0 0 0 +519 1 3 12.682616731625316 21.464044708479538 26.446721221302447 0 0 0 +369 1 3 23.960979768351557 33.14600662024763 34.08200605054554 0 -1 0 +568 1 3 6.904919581917647 19.556475361737668 21.90486624402518 0 0 0 +585 1 3 10.44149761293367 17.42330138761801 25.499913364671894 0 0 0 +674 2 0.6 13.50367135697632 17.97329264213232 26.715184109472567 0 0 0 +696 2 0.6 11.017822645464852 26.234414392891573 20.81191299834608 0 0 0 +2497 3 -1.2 2.159739136908408 20.880650437139128 34.1497525681321 0 0 -1 +798 2 0.6 14.997188909749696 20.18729841862475 17.57892923306447 0 0 0 +821 2 0.6 12.798066418672153 17.9192771359213 21.987590047544206 0 0 0 +879 2 0.6 10.629961732673946 25.07997105617068 22.51066891775336 0 0 0 +944 2 0.6 14.73687074703225 25.928051292187412 25.662860941190797 0 0 0 +995 2 0.6 10.175254954269116 21.822043851888843 21.82393470937455 0 0 0 +1024 2 0.6 13.947521170218897 25.803581842786866 18.01033441713912 0 0 0 +1063 2 0.6 9.896398316513892 20.80910015418961 25.760632486376586 0 0 0 +1169 2 0.6 15.049586346176849 17.53050490330374 20.046709467311874 0 0 0 +1284 3 -1.2 9.392442090019678 23.06580144807643 19.643826395967338 0 0 0 +1299 3 -1.2 7.350699841571892 25.76180273989636 22.486690827848133 0 0 0 +1334 3 -1.2 12.927606286020007 20.91830581224698 18.838860462999087 0 0 0 +1387 3 -1.2 11.54519713697828 22.688064783187695 17.85321698440074 0 0 0 +1415 3 -1.2 10.643601402179822 20.00381229873446 18.34225991661117 0 0 0 +1417 3 -1.2 9.045639973436927 22.7836607362128 25.326933568916456 0 0 0 +1457 3 -1.2 5.824081895904068 18.68056105365422 21.209269575037162 0 0 0 +1570 3 -1.2 6.839254883480333 22.884454272280532 24.113090106672544 0 0 0 +1585 3 -1.2 12.152434065292736 18.848473203397425 19.922381825870577 0 0 0 +1593 3 -1.2 13.323336128985124 20.2856342280046 25.666540603201465 0 0 0 +1598 3 -1.2 8.19476782838287 24.991855107255184 24.598219839495165 0 0 0 +1643 3 -1.2 12.38219195803764 22.778505816125055 20.329522896798252 0 0 0 +1676 3 -1.2 8.941511259227642 18.445354793800025 19.130382191594656 0 0 0 +1788 3 -1.2 9.404738451510939 20.315168272451544 23.627063139325397 0 0 0 +1900 3 -1.2 12.657110272185074 24.98164980888141 21.376289787513 0 0 0 +1982 3 -1.2 7.0253510788548565 20.827211131751035 21.21514505404372 0 0 0 +1983 3 -1.2 10.49344787397184 25.06771087471848 18.525264223422628 0 0 0 +1986 3 -1.2 12.105660023243544 22.306551232805848 25.245962228920586 0 0 0 +2041 3 -1.2 9.314339084916046 18.020941467235215 24.59706121679781 0 0 0 +2055 3 -1.2 8.953799859619563 25.29214013661844 20.449867101539763 0 0 0 +2153 3 -1.2 11.365115632769646 24.53694360766084 24.521773528840765 0 0 0 +2216 3 -1.2 8.149846047467756 18.707368460821886 22.31855038543897 0 0 0 +2263 3 -1.2 9.040674810271536 23.489455681620402 22.918377660472235 0 0 0 +2286 3 -1.2 5.243151354562101 21.254686457726383 25.205131497476174 0 0 0 +2288 3 -1.2 6.609621892599168 24.672631979699524 20.464058638314356 0 0 0 +2443 3 -1.2 10.68917229443696 18.360514753131167 22.70799223837438 0 0 0 +2568 3 -1.2 5.2139998362024205 18.95721030288574 25.307624963815847 0 0 0 +2662 3 -1.2 4.972610426000081 24.920647656623565 23.464934285717867 0 0 0 +2678 3 -1.2 13.76795302386997 23.431275286026732 18.48767875900541 0 0 0 +2842 3 -1.2 12.484799432564381 23.082374679557056 22.853222129487158 0 0 0 +2898 3 -1.2 6.287655899999374 19.86803042228372 23.32109257036616 0 0 0 +467 1 3 6.176777979383377 27.950548210194242 33.99646729628139 0 0 -1 +2929 3 -1.2 9.585646823093862 20.321982249056784 20.44939572250645 0 0 0 +2963 3 -1.2 8.097950127154196 20.654621030266565 18.289825671367492 0 0 0 +2977 3 -1.2 13.75361475171355 24.075566120708526 24.84366129815154 0 0 0 +2989 3 -1.2 8.058902349378464 24.828244795698094 18.269496330064587 0 0 0 +14 1 3 17.171143758682756 20.513000868975237 20.02787747411553 0 0 0 +105 1 3 19.812464581789193 20.660384678133237 23.67076931647361 0 0 0 +196 1 3 18.69803723825935 24.160048010018883 19.614368704242843 0 0 0 +1856 3 -1.2 3.2857388796963503 19.59068655499363 17.398572407108777 0 0 0 +895 2 0.6 17.027740780672016 25.399757017497528 24.094763601623633 0 0 0 +915 2 0.6 15.7296571587481 23.562221113027586 19.205804496768884 0 0 0 +1027 2 0.6 16.461450371005192 22.812684498396223 22.102677248650686 0 0 0 +2980 3 -1.2 12.81271798296803 22.065422941576617 34.01523777840539 0 0 -1 +1131 2 0.6 16.886474049644125 22.108242679003094 24.10558069086662 0 0 0 +1160 2 0.6 17.066315488567803 18.64880862040166 22.534249399650843 0 0 0 +1203 3 -1.2 16.17102138740478 21.34137058118203 19.297642819848118 0 0 0 +1339 3 -1.2 19.439787402956938 22.725700781755986 19.62970082572791 0 0 0 +1471 3 -1.2 18.43940476741161 23.908228777444595 23.316984010972128 0 0 0 +1586 3 -1.2 20.63892495337611 24.718582593667325 18.423044312363576 0 0 0 +1606 3 -1.2 15.67170583775066 19.766891137440496 25.578157652891186 0 0 0 +1646 3 -1.2 18.503370646760846 20.54315461491597 24.276359593316027 0 0 0 +1787 3 -1.2 19.102296539890684 26.549873356528565 24.02200540642396 0 0 0 +1875 3 -1.2 17.60055703537106 21.077031551324026 21.352208062840926 0 0 0 +1953 3 -1.2 16.315268288030442 26.553405828049453 18.15785916216522 0 0 0 +1988 3 -1.2 19.172316967582162 25.437395411545587 20.223156262030773 0 0 0 +1997 3 -1.2 17.459284028678724 23.90868971456071 20.404264609289097 0 0 0 +2033 3 -1.2 16.73137303967964 19.12556227658319 20.276175332364375 0 0 0 +2040 3 -1.2 14.796164198131917 21.454313475476702 24.09423113942669 0 0 0 +2131 3 -1.2 18.199595454854826 24.168827025084333 18.08962068922613 0 0 0 +2194 3 -1.2 18.099380238414952 22.871841181726616 25.960807095992795 0 0 0 +2214 3 -1.2 14.264368050400988 19.109835397587005 23.571747863886046 0 0 0 +2217 3 -1.2 19.364797339303095 24.82850694276584 26.482203310550414 0 0 0 +2244 3 -1.2 14.544610665423777 23.4086986444906 21.44249251802766 0 0 0 +2279 3 -1.2 18.47669916090079 20.572020140940033 19.060400786872975 0 0 0 +2696 3 -1.2 15.417815315126 17.974605284608792 17.963758438319818 0 0 0 +2775 3 -1.2 20.0204925729776 18.97602174457852 26.001304256697434 0 0 0 +2995 3 -1.2 15.805514715948524 26.975654124285324 23.227604621213548 0 0 0 +20 1 3 21.65304756327557 19.543776529089612 21.69478839876396 0 0 0 +64 1 3 23.019563555457946 21.799356405432185 20.338196436270017 0 0 0 +304 1 3 19.852261077505126 23.567025407174903 23.19346515597964 0 0 0 +370 1 3 26.04915300430795 23.865425664632937 26.18357959350598 0 0 0 +395 1 3 24.551088663871035 22.49788972888495 22.741069144841347 0 0 0 +398 1 3 19.669587854804657 21.49908725472843 18.62821939916155 0 0 0 +443 1 3 21.41138315472932 19.661824080421365 25.908614999706387 0 0 0 +550 1 3 21.591915123096577 25.853077279685863 18.678477214417722 0 0 0 +705 2 0.6 24.23602822631818 24.20058031199405 17.4399492004917 0 0 0 +707 2 0.6 25.79086479557896 21.66753535846272 19.261029414686565 0 0 0 +724 2 0.6 22.417803238514157 17.453321820007563 18.987403838718084 0 0 0 +909 2 0.6 24.12580721101395 20.590301936760092 24.834317943565065 0 0 0 +1101 2 0.6 24.199933390944548 18.42994324997936 21.113073058852518 0 0 0 +1267 3 -1.2 21.692894292777527 25.55960306063526 26.20637109645728 0 0 0 +1295 3 -1.2 20.62268857754792 24.26252721149268 22.022342440039733 0 0 0 +1335 3 -1.2 20.306536800660204 19.65452489308897 22.600940984617452 0 0 0 +1336 3 -1.2 22.015788298690303 25.644162995757384 20.23844661470121 0 0 0 +433 1 3 3.2444628111350307 17.76953750236714 22.46564615007094 0 0 0 +1619 3 -1.2 24.77312262270597 18.07816749867242 18.97321892025578 0 0 0 +1647 3 -1.2 22.745809161865143 19.23543216857229 22.634690475798106 0 0 0 +1744 3 -1.2 20.67618032052663 24.037593084201337 24.47622637784018 0 0 0 +1837 3 -1.2 20.99893243996984 20.63581696286099 24.728451797492085 0 0 0 +1869 3 -1.2 25.552472057383923 19.055367326898 25.280068534056507 0 0 0 +1907 3 -1.2 23.897804485620952 22.718859876115424 21.296834502691834 0 0 0 +2075 3 -1.2 22.614927305789827 25.542528454954006 22.652566570053818 0 0 0 +2200 3 -1.2 19.979539809508935 22.0585100378717 23.02202812426552 0 0 0 +2265 3 -1.2 26.63086605597098 24.327973478206353 18.57998909512528 0 0 0 +2298 3 -1.2 25.438468038065846 26.42884826267568 23.546964584585545 0 0 0 +2329 3 -1.2 26.590694376434094 17.255046215189374 23.928918790337455 0 0 0 +2364 3 -1.2 25.94169856697716 25.462979595825768 21.141354588109117 0 0 0 +2397 3 -1.2 25.262975117827857 21.18536190581421 22.61121710045832 0 0 0 +2452 3 -1.2 22.49777057821333 22.74839900524663 19.357859893596878 0 0 0 +2477 3 -1.2 20.878012903334696 20.695251080352847 18.63278745776515 0 0 0 +2542 3 -1.2 23.906627820330332 20.675391557517557 19.981067250438993 0 0 0 +2594 3 -1.2 21.452691348454255 18.539155715992887 20.662022567312825 0 0 0 +2611 3 -1.2 23.3261929001662 22.4135492505171 23.595700983304486 0 0 0 +2800 3 -1.2 22.436476801349265 18.659392715935613 25.717535344613513 0 0 0 +2802 3 -1.2 25.50348331922547 23.549032000034273 23.244849941533218 0 0 0 +2938 3 -1.2 24.879364567059053 24.786112577394114 25.61110912919781 0 0 0 +2979 3 -1.2 21.90095789852314 21.02907369574277 21.190466888199357 0 0 0 +26 1 3 26.779842248950317 18.596121289561648 24.682459612438432 0 0 0 +311 1 3 25.416673032553977 18.726596908888233 17.789348004497732 0 0 0 +325 1 3 30.116583772423862 22.79511861044235 19.146682431397366 0 0 0 +373 1 3 29.46552865635124 19.22317518008564 25.688667639707187 0 0 0 +378 1 3 28.76963051751729 20.329906093685484 23.14592966552253 0 0 0 +470 1 3 26.828581585321054 24.66384525388304 20.103153907364117 0 0 0 +586 1 3 27.762564970895056 23.774341880786785 17.532040237707136 0 0 0 +2103 3 -1.2 2.722553972294047 32.022485784269584 34.30423525986318 0 0 -1 +958 2 0.6 26.89228638876904 18.691141020214186 20.44239406091206 0 0 0 +985 2 0.6 30.961247268511897 17.201273629523392 22.341193849536776 0 0 0 +1010 2 0.6 28.78876839925474 23.528311910803342 22.08881443728687 0 0 0 +1037 2 0.6 27.777005790336336 21.070174539984066 19.998032753653273 0 0 0 +1132 2 0.6 30.892230431181098 22.63980281918318 25.17622872459073 0 0 0 +1157 2 0.6 28.76416409414136 24.437434430050438 24.65801309410989 0 0 0 +1196 2 0.6 29.82524964438568 19.302291221189467 19.89232233955238 0 0 0 +1269 3 -1.2 29.717702981106086 19.45807476652025 24.143591300761194 0 0 0 +1495 3 -1.2 28.634876802525444 22.895930112098114 18.536016076430478 0 0 0 +1531 3 -1.2 28.0855018358123 18.43898862571475 25.584405308284275 0 0 0 +1584 3 -1.2 30.293923155440236 21.443251878228203 19.739441684234254 0 0 0 +1693 3 -1.2 26.79715259843608 22.50873449483682 25.754805808900624 0 0 0 +1725 3 -1.2 30.225875757493405 23.77984917955282 20.279680594078542 0 0 0 +1726 3 -1.2 29.03774456158848 21.75276987547467 23.460919326644927 0 0 0 +1767 3 -1.2 30.150955304413777 26.121618415415544 25.515537908654093 0 0 0 +1778 3 -1.2 28.758919712918672 19.968997321893326 21.732428725026395 0 0 0 +2228 3 -1.2 27.73236528514023 25.633605467179024 22.901890207089345 0 0 0 +2346 3 -1.2 31.069811847663473 23.148264283170466 18.075842553542586 0 0 0 +2021 3 -1.2 17.4498532574235 17.696683308887813 24.65213986796213 0 0 0 +2547 3 -1.2 27.078958090256236 24.932342995937887 25.914297252871673 0 0 0 +2562 3 -1.2 27.411295071558225 19.729878333902082 23.768303391309644 0 0 0 +2658 3 -1.2 26.995098450556984 23.297976831944805 20.68640814175502 0 0 0 +2715 3 -1.2 26.514555549416457 19.594972267865874 18.362317394121128 0 0 0 +2726 3 -1.2 28.008776888296254 25.57841049828267 20.10694722696575 0 0 0 +194 1 3 3.5028188187019706 29.102361560298323 22.203132808931347 0 0 0 +199 1 3 32.537605044644806 30.618056718929218 21.79450351440501 -1 0 0 +482 1 3 3.23995866910982 31.280033823927045 20.014680002852305 0 0 0 +545 1 3 0.6273600187271432 27.657637777360755 18.723677131917263 0 0 0 +662 2 0.6 1.8935189570119824 32.44703272602641 23.0166058117963 0 0 0 +667 2 0.6 0.6527439470847747 30.11721194244608 20.349182225226528 0 0 0 +747 2 0.6 3.416048273587304 28.165678458328983 19.07471283141046 0 0 0 +776 2 0.6 32.946997407207014 32.84883228153504 24.465496236779128 -1 0 0 +904 2 0.6 1.878322837753384 27.677182827670368 24.654962739283473 0 0 0 +1014 2 0.6 33.28840478689029 28.71449891263481 24.355170051708516 -1 0 0 +1080 2 0.6 0.35538671893168 27.568969735052352 21.98325197118565 0 0 0 +1126 2 0.6 33.1315788046584 30.378271464742628 18.03958453991867 -1 0 0 +1130 2 0.6 5.026507822299855 27.504085586952648 24.79531497640791 0 0 0 +1218 3 -1.2 33.16461784366832 29.33576057163748 22.220313979974737 -1 0 0 +1298 3 -1.2 4.617953768711638 31.989126746683223 21.566367578004524 0 0 0 +1419 3 -1.2 3.7844062791770163 33.36003079523817 26.51644698207349 0 0 0 +1479 3 -1.2 1.392130324438039 27.579273761828407 19.985178968414647 0 0 0 +1490 3 -1.2 4.132562926602499 30.22463505144766 23.119457666247776 0 0 0 +1509 3 -1.2 4.209610542750506 26.264285669092633 19.95448669065029 0 0 0 +1549 3 -1.2 32.27301279419546 31.517975853789064 22.941566225790993 -1 0 0 +1600 3 -1.2 2.1199142118803853 28.81924815616326 22.624419762578103 0 0 0 +1688 3 -1.2 31.9160739036743 27.75692858110295 25.96934626907734 -1 0 0 +1698 3 -1.2 2.192355627239646 31.68859378714723 20.997027371100046 0 0 0 +1780 3 -1.2 0.8416871083252269 29.267173432238437 25.90554112246787 0 0 0 +2014 3 -1.2 0.5603476575746341 31.29248838759657 24.500439521098627 0 0 0 +2114 3 -1.2 1.432523773486327 28.027092179624447 17.52939451454596 0 0 0 +2280 3 -1.2 33.7888481715495 28.517870431401153 19.0039500090544 -1 0 0 +2292 3 -1.2 4.086491096310809 32.263977573298746 19.12386131611903 0 0 0 +2421 3 -1.2 3.2586421530033363 25.905736204911165 24.87253800529351 0 0 0 +1799 3 -1.2 14.692473811197248 29.36025041616784 33.433090896297365 0 0 -1 +2500 3 -1.2 2.4446901840317787 30.581481527713304 18.926435563687686 0 0 0 +2507 3 -1.2 3.735540463159408 29.772082475718303 20.801335241897966 0 0 0 +2670 3 -1.2 33.030801393516704 31.246972574225985 20.56670895670377 -1 0 0 +2762 3 -1.2 6.965229155718771 28.725703079937144 17.774579119822647 0 0 0 +2869 3 -1.2 5.328511216024546 29.82472497610618 27.047121730461672 0 0 0 +2917 3 -1.2 4.396268415965376 27.949170448461157 22.50833023802579 0 0 0 +32 1 3 11.48722312164658 30.759263174897676 21.210286521119514 0 0 0 +232 1 3 9.466855548715452 30.940463934631726 23.306325627562053 0 0 0 +315 1 3 5.805364064330274 29.50486721314821 17.287962806684803 0 0 0 +321 1 3 12.645424369734487 28.016128115605508 23.634881811385597 0 0 0 +447 1 3 5.705413040167452 32.393349511223754 18.36079893118316 0 0 0 +473 1 3 10.092074202425804 28.713075011541974 25.033362362672946 0 0 0 +532 1 3 11.400680902635619 28.99835326101689 18.764643507936956 0 0 0 +535 1 3 5.286183828790969 31.290240637775906 22.69704965652989 0 0 0 +628 2 0.6 12.052088438803152 25.726846641114005 26.328143046722623 0 0 0 +683 2 0.6 6.624782559548993 28.355977455242414 22.230032830064843 0 0 0 +759 2 0.6 11.218365799466891 31.9637445472149 26.222187703185895 0 0 0 +808 2 0.6 13.132289969029946 26.98464798304629 20.408398831767386 0 0 0 +827 2 0.6 8.012952950311973 30.804476898347154 19.606754309937774 0 0 0 +906 2 0.6 14.26102811539332 31.798856419162707 22.363213994819844 0 0 0 +942 2 0.6 8.784862344271893 27.415669563625165 17.896965145226666 0 0 0 +961 2 0.6 12.869063953022197 30.755799851917494 24.64509055037088 0 0 0 +1100 2 0.6 11.46777124559261 31.860155597133627 18.20118091634953 0 0 0 +1120 2 0.6 9.33438661640957 28.234283876925723 20.88729863803963 0 0 0 +1164 2 0.6 6.9687513527518155 30.665445378688453 25.36574106120318 0 0 0 +1240 3 -1.2 5.582067999182461 31.94272697250043 23.99755683846547 0 0 0 +1271 3 -1.2 9.370713154826493 32.44302476036665 18.489380904442687 0 0 0 +1432 3 -1.2 14.08695792083846 28.76064269708635 23.527488036910118 0 0 0 +1448 3 -1.2 12.456800482231943 30.69360549172066 22.305836719639757 0 0 0 +1515 3 -1.2 11.9054753231004 29.88949951302841 20.02212494912601 0 0 0 +1516 3 -1.2 10.051697973823849 30.572418918390504 21.85812497515795 0 0 0 +1632 3 -1.2 9.280518563269782 29.495336878279446 23.90659272669259 0 0 0 +1742 3 -1.2 15.964899091725314 30.226281659206517 21.32828344433575 0 0 0 +1822 3 -1.2 11.046953577660101 27.711397956922404 19.40705498644844 0 0 0 +1842 3 -1.2 12.46251477582906 28.91831052555852 17.74342546711675 0 0 0 +1948 3 -1.2 10.131698897095385 29.654127173506097 18.375630109998767 0 0 0 +1976 3 -1.2 13.057386892014751 26.89520022531627 24.49700847454352 0 0 0 +2029 3 -1.2 5.616934447071082 30.78618381155337 18.169674361516847 0 0 0 +2047 3 -1.2 6.400641709204452 30.418904945193226 22.192500259006792 0 0 0 +2050 3 -1.2 9.868115412997371 27.30266638452255 25.405534660562555 0 0 0 +2142 3 -1.2 14.055197769986021 33.21006243272087 20.86508261641097 0 0 0 +2170 3 -1.2 7.400712466438167 27.129026176206004 20.53836083773503 0 0 0 +2232 3 -1.2 9.853884793813041 29.599740486923253 26.190264301214803 0 0 0 +2313 3 -1.2 9.310883487639675 26.80314647453513 22.975879087704495 0 0 0 +2357 3 -1.2 13.703674650840295 32.27671851506618 18.564378996238958 0 0 0 +2476 3 -1.2 13.562044743493134 32.609213157000724 25.253041397083326 0 0 0 +2484 3 -1.2 14.791423610533878 28.29128557929017 20.305701711803394 0 0 0 +2489 3 -1.2 8.346913286968523 31.855341278376166 23.451364725073898 0 0 0 +2558 3 -1.2 6.5185020091693096 32.59513649736243 19.582683734267604 0 0 0 +2652 3 -1.2 11.580587188499353 28.819385055596484 24.485976695405217 0 0 0 +2666 3 -1.2 12.033254118979393 27.806408079969028 22.32169578387812 0 0 0 +2773 3 -1.2 11.358374741780128 32.18478860094489 20.635314231974295 0 0 0 +2798 3 -1.2 7.296470879173948 27.33343276638428 24.413382525748226 0 0 0 +2959 3 -1.2 10.60092100909482 31.562615861027272 24.05430791308166 0 0 0 +989 2 0.6 18.783586456876705 33.66002194196101 30.006891382506613 0 -1 0 +192 1 3 16.7974830506818 30.681432229014632 22.5532709692856 0 0 0 +255 1 3 15.540965483051778 28.29012943206856 23.79727139789344 0 0 0 +365 1 3 16.045878103594813 29.061152897033715 20.185709002111196 0 0 0 +625 2 0.6 15.575864673803329 31.402988107325772 17.502792889325846 0 0 0 +666 2 0.6 16.777267027761486 25.877402007378844 21.40586409044202 0 0 0 +698 2 0.6 18.59893287328156 27.25397598869663 19.147069082898465 0 0 0 +772 2 0.6 15.623689549200627 32.42595399502328 25.492753172313247 0 0 0 +1066 2 0.6 19.13312396630547 29.411274300197785 20.97277770049768 0 0 0 +1145 2 0.6 18.08831738304429 30.028278656883938 17.621610104714573 0 0 0 +1172 2 0.6 19.624821540884387 30.292660842022883 24.845419121423213 0 0 0 +1364 3 -1.2 17.255862843053972 28.306360354787937 20.715378204190017 0 0 0 +1375 3 -1.2 15.665296850302797 28.333621143798652 25.36053021709244 0 0 0 +1397 3 -1.2 16.407328443031904 29.63299329531377 18.871877042520595 0 0 0 +1477 3 -1.2 18.392931661668296 32.58710214703114 26.183246523664035 0 0 0 +1558 3 -1.2 16.163371032712554 31.714964233618876 23.424026442091655 0 0 0 +1635 3 -1.2 18.188637152161977 31.081624405058193 22.228429651837715 0 0 0 +1781 3 -1.2 16.429038352707284 32.59976304564609 19.633094184986717 0 0 0 +2017 3 -1.2 18.878775789810017 32.339404043263926 19.402608416411276 0 0 0 +2020 3 -1.2 17.470956864015577 28.073879353533886 26.985203212773737 0 0 0 +2179 3 -1.2 16.985048995206363 30.425744270658733 26.396750699964784 0 0 0 +1789 3 -1.2 24.253068865834273 31.951060508136212 33.10819336852734 0 0 -1 +2664 3 -1.2 20.77241130125732 30.81222068972909 20.09911057890499 0 0 0 +2818 3 -1.2 16.63937890841009 29.347197037708014 23.429267425475647 0 0 0 +1 1 3 20.429625559394317 32.13363799348943 19.53417571318246 0 0 0 +233 1 3 22.15229523621067 26.927965321250774 25.622391725058943 0 0 0 +324 1 3 26.47926235838291 26.22456707006068 22.399435239795196 0 0 0 +328 1 3 25.245988053791127 31.316494074928723 18.47828737617018 0 0 0 +379 1 3 24.55736211876576 30.381758151118365 24.956786217858618 0 0 0 +534 1 3 24.69465849179944 28.65167636872479 19.407194095816095 0 0 0 +551 1 3 21.51411341669183 25.50170105360033 21.666408338115502 0 0 0 +594 1 3 20.085331622195362 27.454510179079765 23.427740671291136 0 0 0 +647 2 0.6 21.70735090830651 29.305765178201668 17.566419876877497 0 0 0 +677 2 0.6 20.901284742737865 30.953064309403068 22.778510345328908 0 0 0 +721 2 0.6 23.736849135127216 27.77875285474227 22.1877304213088 0 0 0 +857 2 0.6 21.34240527055265 28.614078840320182 20.34062756049048 0 0 0 +1116 2 0.6 24.557371482271325 31.358410611931866 21.625527984521806 0 0 0 +1274 3 -1.2 21.21199349655398 27.53496330495191 24.56698358936813 0 0 0 +1297 3 -1.2 25.76586293044749 27.76279102877876 18.909724174169593 0 0 0 +1326 3 -1.2 20.713988581461624 26.81106670678632 22.137551923939036 0 0 0 +1408 3 -1.2 25.733779135712858 31.340587733147284 25.0670642673981 0 0 0 +1612 3 -1.2 22.585363039657814 32.71179136873913 24.741530906710206 0 0 0 +1749 3 -1.2 23.364579925375956 28.097834719852166 19.778782163279104 0 0 0 +1760 3 -1.2 20.91047298995289 32.305904888953314 18.031438886883684 0 0 0 +2287 3 -1.2 19.75386365056283 28.85033111185811 23.110692133439297 0 0 0 +2315 3 -1.2 21.706453973576014 30.13325682997314 25.71938125638758 0 0 0 +2323 3 -1.2 20.883059894501972 27.188263713562314 18.592244978902194 0 0 0 +2467 3 -1.2 24.49412216583906 32.15864743023432 19.430063901094396 0 0 0 +2797 3 -1.2 25.102672453777174 29.400677035939786 20.654266859912877 0 0 0 +2826 3 -1.2 24.11751563414074 29.656892912504798 23.811035269443394 0 0 0 +2847 3 -1.2 23.49125493918403 26.755548425770264 24.942946013742514 0 0 0 +2920 3 -1.2 24.528245775727985 29.897225293730433 18.417292976704438 0 0 0 +151 1 3 30.126583781160143 29.092846972416393 22.226680579322206 0 0 0 +1313 3 -1.2 9.902853650143008 34.14952406326882 20.795746153236845 0 -1 0 +514 1 3 29.722627391834706 29.889431289701754 25.14264344135311 0 0 0 +524 1 3 27.187130402447472 29.06550957995981 22.476231291699914 0 0 0 +688 2 0.6 30.23562044113173 26.059694524775818 20.24796209704378 0 0 0 +770 2 0.6 30.512186533425197 33.00439038248371 22.49972876015713 0 0 0 +881 2 0.6 29.895281819141275 26.06649141303697 23.318004976905492 0 0 0 +919 2 0.6 27.493843529448554 27.11515682500524 17.515656937262285 0 0 0 +945 2 0.6 27.136908080027016 32.356613956804864 21.31842043756993 0 0 0 +1021 2 0.6 27.929260679928753 29.265524240313372 19.100457677427585 0 0 0 +1151 2 0.6 31.696266012259922 32.85244555639354 19.79242530725622 0 0 0 +1154 2 0.6 28.466542160098296 32.89750873236778 18.641825960726063 0 0 0 +1551 3 -1.2 29.94660979699794 30.754614007554956 18.540350285558418 0 0 0 +1761 3 -1.2 26.686329449643562 27.708728142059922 21.87223735284747 0 0 0 +2447 3 -1.2 30.43028697781129 27.683957025732784 22.005531716545338 0 0 0 +2512 3 -1.2 30.351231469433614 29.44375145887561 23.807211418748402 0 0 0 +2540 3 -1.2 27.465942711902827 28.531880750718578 23.851493836401783 0 0 0 +2672 3 -1.2 26.64857297117419 31.11894486807359 18.965556481456233 0 0 0 +2718 3 -1.2 30.98295728433116 30.118037538979124 21.52577786367783 0 0 0 +2728 3 -1.2 28.09570415686654 32.48126915745298 26.03294310413901 0 0 0 +2738 3 -1.2 28.64321672945263 29.32299297961528 21.853032441742254 0 0 0 +2844 3 -1.2 28.426629816352687 30.67909591594644 24.679092189643168 0 0 0 +2879 3 -1.2 26.591942848164855 30.412657549519167 22.59486855442752 0 0 0 +2915 3 -1.2 29.652393477938837 28.620923133889182 25.9879032551906 0 0 0 +56 1 3 5.062814771224198 23.9803966401609 29.00034508621962 0 0 0 +73 1 3 33.51931826927803 20.545945123279477 30.01455981969234 -1 0 0 +85 1 3 5.1123338350823975 19.745921553827298 28.80075811768067 0 0 0 +139 1 3 34.15330119900013 25.8884599682941 29.573651272745536 -1 0 0 +216 1 3 33.90893666000967 17.996842984475283 28.525796895046795 -1 0 0 +223 1 3 33.690582296338256 21.7298557443557 27.253892264900845 -1 0 0 +260 1 3 3.030249399873095 24.053583649960153 32.12864055906876 0 0 0 +339 1 3 5.187228147672384 19.383363707986998 32.79587557895108 0 0 0 +405 1 3 0.7183788911806179 19.51117351345996 26.127511328936812 0 0 0 +1640 3 -1.2 14.512217363966132 17.709975478014776 33.61928807801052 0 0 -1 +536 1 3 2.4890224401388505 25.310908784434933 28.358450511464426 0 0 0 +784 2 0.6 0.9183660911146063 22.936674482808105 30.029350753418772 0 0 0 +880 2 0.6 2.7326928016716114 21.436813957742636 29.26061495940404 0 0 0 +994 2 0.6 2.8253089941208356 20.96948576801095 31.586761281299186 0 0 0 +1028 2 0.6 2.859439164939645 17.87019333449566 30.579032003836126 0 0 0 +1084 2 0.6 2.952309681221388 22.313547907879112 26.63111063486972 0 0 0 +1147 2 0.6 1.813299227908711 19.218090893779134 32.714634181083504 0 0 0 +1231 3 -1.2 4.294619056097766 22.906391885849377 28.3154564684947 0 0 0 +1562 3 -1.2 4.768913139612112 20.79668823462223 32.66723639397746 0 0 0 +1681 3 -1.2 0.842803011360492 17.78321718400588 29.215547299029552 0 0 0 +1827 3 -1.2 1.1577682730033616 25.08331527645153 29.241268048758148 0 0 0 +1835 3 -1.2 4.287293683644166 20.11515143620788 29.9846484455356 0 0 0 +1855 3 -1.2 33.1987144213731 19.196038768520864 29.24669935791584 -1 0 0 +1906 3 -1.2 3.8287114696354596 25.07833355144474 29.0991709171214 0 0 0 +1973 3 -1.2 4.5484580558539935 24.256082118450987 32.43413174573001 0 0 0 +1979 3 -1.2 2.267783858464109 24.50542297616328 27.16753238985001 0 0 0 +2113 3 -1.2 33.547142988858575 25.479513106379382 30.847845933131733 -1 0 0 +2359 3 -1.2 4.178373757162765 19.25080926572018 27.794984945840927 0 0 0 +2365 3 -1.2 33.28609014217299 25.858590225157155 28.38912171091642 -1 0 0 +2441 3 -1.2 0.6161472354369302 20.625268766507574 30.39208866152199 0 0 0 +2495 3 -1.2 2.894214296372652 23.17035813815196 30.907677610370023 0 0 0 +2513 3 -1.2 2.3307036573009117 25.32134849958432 31.80696762789223 0 0 0 +2572 3 -1.2 3.984455850607295 18.48354696705779 32.85081363957089 0 0 0 +2615 3 -1.2 32.66721506271913 20.947644421760288 26.549517063876998 -1 0 0 +2896 3 -1.2 33.445863788197755 21.6597961816465 28.81573294620208 -1 0 0 +2923 3 -1.2 32.52972416908695 20.895015537369304 31.040669720828394 -1 0 0 +42 1 3 7.285978918732321 19.342476938782365 30.677228155056685 0 0 0 +136 1 3 10.054145402991093 18.447887673141388 30.94675438679345 0 0 0 +147 1 3 13.579152633799309 19.906887907911035 31.870920043593358 0 0 0 +164 1 3 14.242046373976757 25.971353086985356 29.293931452144623 0 0 0 +261 1 3 9.287841635391619 23.265897339363455 28.84107141387086 0 0 0 +262 1 3 12.88052491836046 24.63441605095089 31.62347449078708 0 0 0 +537 1 3 9.718140047175318 19.78255827635783 33.51684241196428 0 0 0 +538 1 3 6.005482910789704 24.112073551406542 31.785243605506288 0 0 0 +555 1 3 7.754141038123453 20.842101874903854 28.049673349170792 0 0 0 +630 2 0.6 10.747913712279951 26.324816841125195 30.172784521180542 0 0 0 +780 2 0.6 7.738028214106852 17.7971208524547 27.287563981394015 0 0 0 +799 2 0.6 11.973971157229157 19.122314134731443 28.06942159637689 0 0 0 +892 2 0.6 12.930426589253141 22.307535189634905 29.381495291045344 0 0 0 +901 2 0.6 14.888558946273788 23.939441877451618 26.866680690983145 0 0 0 +1977 3 -1.2 10.783953330945778 17.401170788089036 31.83442534085652 0 0 0 +1090 2 0.6 8.940165968748877 24.8535148852573 31.995950830844286 0 0 0 +1124 2 0.6 9.164915563970483 22.542727574035553 32.24962786655672 0 0 0 +1195 2 0.6 9.622996168187063 25.323415773901264 26.46860252681469 0 0 0 +1301 3 -1.2 14.587636930749353 19.14543786433231 30.941935390702852 0 0 0 +1365 3 -1.2 13.36136444352932 25.76129078690726 30.5825827736979 0 0 0 +1563 3 -1.2 6.888513265095686 23.486740543931038 32.78863350214448 0 0 0 +1687 3 -1.2 11.558115341985781 21.210116713997447 27.38594322584943 0 0 0 +1703 3 -1.2 6.605753281457967 25.411376228247054 31.414589923119724 0 0 0 +1746 3 -1.2 11.656277831188 24.093136605440915 31.003443072213983 0 0 0 +1793 3 -1.2 6.1828739070099505 20.8313435568951 28.2872855431704 0 0 0 +1807 3 -1.2 8.838342639159285 23.445061068964673 30.21473765681734 0 0 0 +1910 3 -1.2 12.595597746196812 18.85169364544782 32.39739410996944 0 0 0 +1919 3 -1.2 10.239829275025329 24.115216900187484 28.208522129738654 0 0 0 +1992 3 -1.2 8.461995143155118 18.315909320259088 30.892169802327306 0 0 0 +2023 3 -1.2 10.838100485598597 18.808834037077222 29.77245193241625 0 0 0 +2059 3 -1.2 12.927859135824392 20.912986180547957 31.02446194162546 0 0 0 +559 1 3 14.191723170121817 21.581544247222737 34.22386773152245 0 0 -1 +2130 3 -1.2 6.204878717020352 24.738394889374035 28.47824267688234 0 0 0 +2273 3 -1.2 8.055892105291647 19.986513499970613 26.898029546563876 0 0 0 +2297 3 -1.2 6.177474195267607 18.694501062915464 31.78977068474682 0 0 0 +2416 3 -1.2 11.306624731251457 18.505194939266637 25.953742844033897 0 0 0 +2440 3 -1.2 13.741296310324957 22.210457764143573 27.17234797179477 0 0 0 +2453 3 -1.2 15.617515554244928 20.92564144832407 29.671933703271456 0 0 0 +2517 3 -1.2 7.2476369746148865 20.634486899807747 31.403231252408705 0 0 0 +2637 3 -1.2 15.128702973949421 24.803400933062434 29.135700286281388 0 0 0 +2638 3 -1.2 14.03750196460705 23.736894477202544 31.76701931569772 0 0 0 +2722 3 -1.2 6.429945448358515 23.128903636889223 26.37489713388213 0 0 0 +2776 3 -1.2 5.570235116561181 23.467196911961388 30.40812580477107 0 0 0 +2814 3 -1.2 6.278960462208635 18.87898422284061 29.455127592492527 0 0 0 +2864 3 -1.2 14.168172504908677 19.186944716380516 28.53308015509865 0 0 0 +2918 3 -1.2 8.492427390721174 22.219976633212198 28.08536309649082 0 0 0 +2947 3 -1.2 10.019138093304557 19.706582390989254 31.953894687892813 0 0 0 +2964 3 -1.2 8.216803190159323 20.155602428805626 29.350813991636667 0 0 0 +39 1 3 19.01897648831991 17.58738877592785 30.99836290344355 0 0 0 +66 1 3 18.246585676482912 23.7077253426338 32.31583989275895 0 0 0 +106 1 3 17.938652581511498 24.10861845087755 26.7529602531946 0 0 0 +377 1 3 15.229244564200673 19.491859474762958 29.51295602549495 0 0 0 +528 1 3 19.01167369256002 18.66313034295453 27.126544192972457 0 0 0 +657 2 0.6 15.757582050076628 22.31032589568199 31.713418871348104 0 0 0 +746 2 0.6 17.1832518739758 24.83169607578171 30.000894318243866 0 0 0 +805 2 0.6 18.129346989803924 20.5557322478711 32.91776951566642 0 0 0 +1053 2 0.6 18.247436981098815 20.719161773270564 29.86424685185741 0 0 0 +1061 2 0.6 17.14583887989788 20.90252078476115 26.500800439054633 0 0 0 +1110 2 0.6 16.25549204639191 22.90359411347696 29.358362362670277 0 0 0 +1112 2 0.6 18.5863228097737 26.428723941215566 28.083552498620218 0 0 0 +1283 3 -1.2 17.661618337634458 17.963817371303065 27.389117287807142 0 0 0 +1391 3 -1.2 18.851982490250066 19.97594036036945 27.772055180216473 0 0 0 +2018 3 -1.2 17.9418690321619 23.8458415646597 28.20748377535388 0 0 0 +2115 3 -1.2 17.17172868287696 24.731744905049705 32.25467725956026 0 0 0 +2277 3 -1.2 16.814147058214754 24.976055175323193 26.332514889247943 0 0 0 +2366 3 -1.2 14.41709595483812 20.619017020623176 32.98425020398195 0 0 0 +2516 3 -1.2 16.490016106794823 18.6501650459837 29.322971422074485 0 0 0 +2531 3 -1.2 19.600807103016933 24.560337127331685 32.28117089523565 0 0 0 +2691 3 -1.2 18.685118210633927 18.99409533624604 31.298556204843717 0 0 0 +2827 3 -1.2 16.678876509799657 18.842354779549936 33.2902678481245 0 0 0 +2856 3 -1.2 18.162953957608774 22.87033451961006 31.07029430727399 0 0 0 +2968 3 -1.2 20.52301061131166 24.931055059409736 30.05338550349044 0 0 0 +204 1 3 26.749394201402 19.863339595182403 28.598270855495887 0 0 0 +310 1 3 20.730119696875942 24.32603479345907 25.994009931506145 0 0 0 +374 1 3 21.486785645288204 20.33294201969886 31.332803988252376 0 0 0 +389 1 3 20.44890164332875 25.47928957968169 31.401802437069183 0 0 0 +421 1 3 25.442582166783534 25.91678171986935 30.719657057568647 0 0 0 +465 1 3 23.49649665434828 22.280710539454 34.08039415972193 0 0 0 +468 1 3 22.299793957221613 22.116098689356544 27.358281034597077 0 0 0 +968 2 0.6 26.28939113926683 23.484531201942357 32.21893564614822 0 0 0 +974 2 0.6 22.88967654202907 23.317535591566436 30.98855441898369 0 0 0 +1173 2 0.6 24.59635847623816 22.260057265875545 29.802944946779125 0 0 0 +1182 2 0.6 25.090843230652904 20.15259817211073 31.768349604606975 0 0 0 +1197 2 0.6 19.786646525988232 22.636200891455193 29.31493680249891 0 0 0 +1208 3 -1.2 20.61573652022825 20.599962439864782 30.20181852640912 0 0 0 +1348 3 -1.2 22.857692966727857 20.857758610467187 31.142872920894902 0 0 0 +1373 3 -1.2 26.32230281816681 18.275397504736183 28.084544219467276 0 0 0 +1447 3 -1.2 25.605722368643008 20.248617561762924 29.422025307683416 0 0 0 +69 1 3 14.910116731215256 30.825027148635975 33.89283485998417 0 0 -1 +1886 3 -1.2 21.735356421070904 19.092352151757563 32.42016362644176 0 0 0 +1951 3 -1.2 21.846287347731106 25.80267680555297 32.11910578333631 0 0 0 +1967 3 -1.2 23.471522130689824 22.222987092980546 26.484846989775903 0 0 0 +1985 3 -1.2 24.878773816485165 24.52838813702854 30.649765622191772 0 0 0 +2056 3 -1.2 21.725436481942697 20.63320762641307 27.085171907256946 0 0 0 +2069 3 -1.2 25.459115885040415 17.792795428596996 32.18786771229647 0 0 0 +2291 3 -1.2 22.46181662781471 22.588495716648232 28.7349412545023 0 0 0 +2560 3 -1.2 19.82518144516487 17.390394991155787 27.67223726931699 0 0 0 +2609 3 -1.2 21.094621012586323 23.05008850094262 26.759049928520405 0 0 0 +2612 3 -1.2 25.5389525544741 27.196056486743966 26.00576564932363 0 0 0 +2687 3 -1.2 20.378529223829926 17.46827082047477 30.444304142483524 0 0 0 +2768 3 -1.2 25.876584551666646 23.57816350049934 27.6284286718385 0 0 0 +2889 3 -1.2 20.893833383085564 20.906205660739836 32.70319956828821 0 0 0 +103 1 3 27.28085566786133 17.329089133657774 28.898767485084964 0 0 0 +155 1 3 28.42328861631187 21.92961199699212 30.28794738063144 0 0 0 +265 1 3 29.60935060885451 19.800469655483447 31.852796324759176 0 0 0 +278 1 3 29.367510197666252 25.23559962453869 32.999467037733574 0 0 0 +511 1 3 27.84448564750646 21.691631592817394 26.617707103933 0 0 0 +1011 2 0.6 31.888650288412293 22.47599215609881 32.748018050217674 0 0 0 +1032 2 0.6 31.013046215758845 23.512876474727534 28.813334566692713 0 0 0 +1094 2 0.6 27.611517941161356 24.485553105113375 28.714086239921993 0 0 0 +1385 3 -1.2 29.062070040601842 23.227043236974293 29.99253999550057 0 0 0 +1644 3 -1.2 26.454870725768167 26.18259174268582 29.614130948785704 0 0 0 +1831 3 -1.2 28.978344832745137 20.725702157929295 26.003578671860286 0 0 0 +1864 3 -1.2 27.834720706485673 18.81885909245883 29.242088729191046 0 0 0 +1895 3 -1.2 28.69056941751706 22.78608490460375 27.147899256061805 0 0 0 +2026 3 -1.2 28.1976357750066 19.44912461949189 32.45712086517495 0 0 0 +2145 3 -1.2 29.554344565064707 20.930787354055433 30.863966896518082 0 0 0 +2209 3 -1.2 29.50358187524123 25.843586996499376 31.612212432439076 0 0 0 +2246 3 -1.2 27.383195725535714 21.887828298921875 31.319340461504442 0 0 0 +2247 3 -1.2 30.349183326375073 18.734393108058065 26.7125378259523 0 0 0 +2332 3 -1.2 26.94840435387362 20.53887570068314 27.175161574749918 0 0 0 +2392 3 -1.2 27.87399569513973 21.190349555544746 29.051254029398006 0 0 0 +2457 3 -1.2 30.204511851815642 18.489379037522706 31.334771139334862 0 0 0 +2566 3 -1.2 30.312489190517965 27.088704381957587 27.82799172413276 0 0 0 +1884 3 -1.2 6.386703004609487 22.954059006776212 18.121380683128077 0 0 0 +2808 3 -1.2 26.172456857484008 26.11588081663611 32.03009891886017 0 0 0 +35 1 3 5.4378259441220385 28.635006071630496 27.928424951764736 0 0 0 +48 1 3 0.40354470246208507 31.25630026489363 31.52090693059358 0 0 0 +82 1 3 1.7844416213468883 28.00584501595894 29.26964827780836 0 0 0 +108 1 3 0.33410764859725683 30.69802286470738 25.844384175593696 0 0 0 +135 1 3 3.411490926440193 31.409504645839164 31.004349121402896 0 0 0 +314 1 3 4.138126689255688 28.606983984468098 30.713811825109843 0 0 0 +604 2 0.6 33.563862343649774 28.25069840761351 27.313725551558896 -1 0 0 +635 2 0.6 33.5782609622456 31.32544538313196 28.428020605693234 -1 0 0 +771 2 0.6 1.9963872916640004 32.059765806011136 28.56057180618883 0 0 0 +872 2 0.6 0.4024311951841696 25.232428408159507 32.9459867225428 0 0 0 +875 2 0.6 3.212588941183427 30.711357442463743 26.44097876658801 0 0 0 +1095 2 0.6 4.973654682746035 31.94683166922409 27.725556768942894 0 0 0 +1220 3 -1.2 3.7337951705734924 29.957926732037706 31.439507582889746 0 0 0 +1232 3 -1.2 1.898223427219323 31.72178338349464 31.16579232648842 0 0 0 +1396 3 -1.2 33.87544406641854 32.56712525159822 31.585708749150715 -1 0 0 +1401 3 -1.2 1.7795442990878467 29.37340274222582 28.78557635503397 0 0 0 +1487 3 -1.2 0.41869791411855106 27.363992743021956 29.649235899270604 0 0 0 +1548 3 -1.2 4.404604981083629 28.74201994805622 29.160159167837833 0 0 0 +1663 3 -1.2 33.2086360290721 30.645443079321538 26.23864576069761 -1 0 0 +1710 3 -1.2 5.267591520452626 28.02736933893409 31.393027501029948 0 0 0 +1920 3 -1.2 4.342439156262358 32.46427157081074 31.67141620228885 0 0 0 +2066 3 -1.2 0.37520271410915096 30.531726993690725 32.807730281308515 0 0 0 +2295 3 -1.2 1.0174865058072668 31.563286665456435 26.869369814873647 0 0 0 +2499 3 -1.2 3.800132060967667 31.43327582054644 29.581206550641973 0 0 0 +2582 3 -1.2 2.306463487471301 26.88620194367533 28.286182619860483 0 0 0 +2867 3 -1.2 34.13617270411941 30.47209051667769 30.425002271783878 -1 0 0 +2887 3 -1.2 2.728618951842007 27.955539924667132 30.52335922826428 0 0 0 +24 1 3 9.577489246394926 30.771536180064388 31.86430843151707 0 0 0 +28 1 3 8.231281497578786 28.32482457938734 29.096649631085672 0 0 0 +65 1 3 8.520175719042848 28.060200862897442 32.11480967610419 0 0 0 +88 1 3 12.138117918801665 31.043784948438176 33.0057612156811 0 0 0 +172 1 3 13.965693529094626 30.20056145099191 27.995170394407765 0 0 0 +294 1 3 14.754971861595887 28.187582804074015 32.41476066299725 0 0 0 +399 1 3 12.693201086526782 29.353540614988272 30.531541383176066 0 0 0 +653 2 0.6 11.327532336431341 27.82254920289581 27.630773511392906 0 0 0 +678 2 0.6 13.407873050281509 32.498476144122336 30.23510822955759 0 0 0 +689 2 0.6 6.534756861772656 31.549478741418692 32.54401158985319 0 0 0 +720 2 0.6 10.68699049466995 30.261334614901493 28.013277549306924 0 0 0 +2240 3 -1.2 27.95801289393829 17.175948563215364 21.889742865923164 0 0 0 +975 2 0.6 6.9532073897204425 25.818444506749664 26.736620274188276 0 0 0 +1052 2 0.6 7.417497135343514 31.303238105682937 29.246829578079623 0 0 0 +1114 2 0.6 10.112369757963956 32.476406059756826 29.17313987111642 0 0 0 +1281 3 -1.2 8.10366767938888 27.93364047563142 30.636411267186336 0 0 0 +1427 3 -1.2 8.880497568962824 29.64009689338898 28.951365827354138 0 0 0 +1433 3 -1.2 13.553781492233089 31.498206023084883 33.50953344229263 0 0 0 +1437 3 -1.2 11.941272980403875 28.414504077435637 29.66124350998598 0 0 0 +1554 3 -1.2 14.668526419172961 31.500012376840044 27.81997528236919 0 0 0 +1627 3 -1.2 8.544365827688644 31.637127430771105 31.273579900420074 0 0 0 +1651 3 -1.2 10.733026672851024 31.603741603822957 32.53743228913392 0 0 0 +1672 3 -1.2 6.2561072970050535 33.235063992811995 28.891279520244133 0 0 0 +1757 3 -1.2 8.780237499018083 27.19752019215209 28.33764722400742 0 0 0 +1838 3 -1.2 12.086689308943724 31.547308124955755 28.844508302595727 0 0 0 +1889 3 -1.2 8.67263344036685 29.578043157996973 32.51147913607513 0 0 0 +1981 3 -1.2 5.309620417072707 27.376626591354526 27.197278124486665 0 0 0 +2183 3 -1.2 13.474219030821503 28.365337251026567 31.553020981514653 0 0 0 +2409 3 -1.2 7.4735686394681675 27.583199427843073 33.19897046219898 0 0 0 +2514 3 -1.2 13.421323583426645 26.169153929798604 28.07512907710118 0 0 0 +2579 3 -1.2 6.742923275515678 28.759263248673882 28.7660343720385 0 0 0 +2617 3 -1.2 12.916316600618236 29.810609182838796 27.020737503070734 0 0 0 +2654 3 -1.2 13.846017107669821 29.800718629343045 29.51442678097018 0 0 0 +2835 3 -1.2 7.8330216816137295 33.06045183643913 27.138788320107682 0 0 0 +2910 3 -1.2 12.700722536179294 30.59861436471634 31.508532722089864 0 0 0 +2962 3 -1.2 10.392853246698673 29.821300526469606 31.052584311063914 0 0 0 +95 1 3 18.094813367944905 31.336816893031987 27.136532165837345 0 0 0 +124 1 3 16.37603976015029 28.987894163544595 26.611903415495384 0 0 0 +508 1 3 16.5123605696535 27.983036490889493 30.083792879445983 0 0 0 +613 2 0.6 17.577259391830598 31.15297428317748 30.494469857984992 0 0 0 +758 2 0.6 15.846817649698037 33.118853266861954 28.891104764282762 0 0 0 +807 2 0.6 19.450540879018178 28.621392182088773 28.291751192338285 0 0 0 +1234 3 -1.2 17.5550812434303 26.942543720434145 29.99286946582158 0 0 0 +1410 3 -1.2 20.023055818591658 27.01574014089765 31.413413063338727 0 0 0 +1534 3 -1.2 15.157796768055883 27.262525170149978 29.558812743494386 0 0 0 +1537 3 -1.2 15.164437948804338 29.146653288099895 27.54585642826198 0 0 0 +1716 3 -1.2 17.68926199600375 31.948278383912 28.399410635047936 0 0 0 +1785 3 -1.2 20.51937693914022 31.717940324451618 32.29822879851375 0 0 0 +1858 3 -1.2 15.99705989615335 28.46587201807628 31.489911832731238 0 0 0 +1943 3 -1.2 16.04768558275259 31.38204055563345 33.05490682686678 0 0 0 +2158 3 -1.2 19.2726788763005 30.457376388231353 27.16141293065472 0 0 0 +2160 3 -1.2 17.02694189294542 29.216661892990672 29.444106436777798 0 0 0 +2796 3 -1.2 15.010419934547496 26.83855198753946 32.9127720961792 0 0 0 +2878 3 -1.2 17.75103500300357 32.918428985157746 32.09123577495 0 0 0 +68 1 3 24.003967054113527 31.593342267776652 31.54317374016656 0 0 0 +99 1 3 21.058223307992996 31.228756034527112 30.89886117357534 0 0 0 +282 1 3 24.998083330456595 26.222500793466196 25.04064738207444 0 0 0 +383 1 3 22.492335298683386 29.61581167949734 26.85448823796848 0 0 0 +460 1 3 22.35917789593926 26.988107708841085 33.049353550692345 0 0 0 +500 1 3 20.892096122835298 28.27600617096763 30.91735079091225 0 0 0 +866 2 0.6 25.31322843718415 28.441730848230026 32.49932497594597 0 0 0 +900 2 0.6 24.263565730084558 33.01540074368455 27.155647680432935 0 0 0 +1004 2 0.6 23.14185349509386 26.837802389250772 28.801847106888335 0 0 0 +1206 3 -1.2 23.98106669204635 32.92625792973866 30.9057904530496 0 0 0 +1494 3 -1.2 21.266297436822487 27.794631642371982 29.58029134766115 0 0 0 +1506 3 -1.2 23.973490886644214 29.95534648654398 26.27216433193969 0 0 0 +1544 3 -1.2 20.659669840685925 32.156288850638965 29.860866313058576 0 0 0 +1587 3 -1.2 25.029577532770634 30.61664486752802 31.15503546320949 0 0 0 +1652 3 -1.2 22.561800172522208 30.97433363504557 31.266937191858034 0 0 0 +1715 3 -1.2 21.922391166345317 28.18325080713488 32.08959116724188 0 0 0 +1804 3 -1.2 22.48867306553968 30.147853460266514 28.211351207005134 0 0 0 +1821 3 -1.2 24.3375861525184 26.941081399500174 30.59664340744477 0 0 0 +1832 3 -1.2 22.32479691283591 28.008277884077774 26.736411597100492 0 0 0 +2256 3 -1.2 20.45459173675879 29.756120311379586 30.74495574121877 0 0 0 +2210 3 -1.2 15.23142751604431 22.627919796235314 34.29889705309525 0 0 -1 +41 1 3 27.244619672513455 31.250597116510754 25.57053494835312 0 0 0 +101 1 3 28.30565734528095 30.151382748734846 31.829109252836695 0 0 0 +198 1 3 27.884004672574488 33.09336068365173 31.657702780548178 0 0 0 +428 1 3 30.554377815951288 27.28018528129299 26.36362904359084 0 0 0 +600 1 3 29.678616163118917 32.694182366134235 25.932354381435935 0 0 0 +789 2 0.6 31.053181736108563 32.05378568619356 31.022261095137267 0 0 0 +954 2 0.6 25.967763046368084 29.52300119574905 29.27485830289994 0 0 0 +1097 2 0.6 27.902579497845572 27.35254586668317 31.133493329918664 0 0 0 +1129 2 0.6 30.253659080422512 29.05267325845398 29.580749068350435 0 0 0 +1161 2 0.6 31.842959675575155 26.283521703085185 32.092010910850185 0 0 0 +1162 2 0.6 29.892304252784886 25.654197185263133 29.494618371284716 0 0 0 +1167 2 0.6 32.36026560254228 31.439403165786477 33.67193851169547 0 0 0 +1174 2 0.6 27.35523821945234 26.988316512977377 27.352692936099224 0 0 0 +1759 3 -1.2 27.68652475660505 31.6264404029151 32.09397975672502 0 0 0 +1773 3 -1.2 27.125321622059406 30.25451628366027 26.640073032732122 0 0 0 +1974 3 -1.2 27.974197022136682 29.68119145679377 30.44519962035491 0 0 0 +2112 3 -1.2 29.799581034830577 30.20200196658729 31.873619099131226 0 0 0 +2919 3 -1.2 30.15889275240846 31.167156234011653 26.0509168026761 0 0 0 +104 1 3 11.56708316290257 25.09613761479259 34.28542387499927 0 0 -1 +1357 3 -1.2 19.806196211590787 34.27072340920564 27.70477028663223 0 -1 0 +2385 3 -1.2 5.228858933885665 33.67719188212676 17.507618957073625 0 -1 0 +2109 3 -1.2 24.847020823894933 21.987920039299883 17.361837390980373 0 0 0 +2362 3 -1.2 21.350272654465616 26.876273537839396 34.24397953613884 0 0 -1 +121 1 3 13.935559999107541 33.47126201429554 19.401380570346824 0 -1 0 +197 1 3 11.410674623447768 33.75617242891952 20.76238755257348 0 -1 0 +731 2 0.6 18.234612503282783 27.838667904992334 34.210608688110646 0 0 -1 +664 2 0.6 12.161119810104168 33.30804331986568 23.875302937499587 0 -1 0 +960 2 0.6 9.594826493049219 33.887315755894086 25.105474036167948 0 -1 0 +1111 2 0.6 12.935409836803062 32.797822580728834 27.264268044514054 0 -1 0 +1438 3 -1.2 12.297468623458593 34.037561948706205 19.541835781332306 0 -1 0 +1706 3 -1.2 5.068279688889488 26.845375962605722 34.02894632310891 0 0 -1 +1878 3 -1.2 12.647882679077654 18.639351296327327 17.537241950200364 0 0 0 +340 1 3 17.65180911872046 33.39543444027544 19.725278500436055 0 -1 0 +357 1 3 18.944257417375898 34.085988439576035 26.361539883313025 0 -1 0 +806 2 0.6 18.39822968655497 33.71499372023323 23.08814877718653 0 -1 0 +1682 3 -1.2 8.593031281859455 33.8338003831565 33.855695029417866 0 0 -1 +1446 3 -1.2 20.785536866299836 33.242972234869924 20.590415462976704 0 -1 0 +2554 3 -1.2 4.472099360449758 28.86206446500614 17.364661435700782 0 0 0 +2373 3 -1.2 6.11192988870178 34.30234656597993 31.488116385694337 0 -1 -1 +2111 3 -1.2 7.165466325472427 32.353452650579605 17.305011379365467 0 0 0 +2275 3 -1.2 33.5597431391052 22.44089713245788 34.18003151915722 -1 0 -1 +2694 3 -1.2 28.562308549373064 24.97594829907748 17.20239048476152 0 0 0 +2399 3 -1.2 30.163439147126848 33.15524331285155 24.644149032624078 0 -1 0 +1455 3 -1.2 8.501337170475972 34.07282513935247 29.35559699981984 0 -1 0 +234 1 3 33.86900928169079 34.00379284622691 32.323281042542646 -1 -1 0 +1808 3 -1.2 2.2695726629781516 23.1415589492344 33.17079144610138 0 0 -1 +251 1 3 7.458414888201889 33.91215328295214 28.325315004886416 0 -1 0 +349 1 3 4.699061945518513 33.976178640122455 31.33843158932629 0 -1 0 +796 2 0.6 5.939233566619419 33.25626250641655 25.62558843841134 0 -1 0 +2552 3 -1.2 30.10086356271143 32.35847710609882 33.983091829174604 0 0 -1 +1229 3 -1.2 15.850208441372686 33.6733204915767 33.586229855903646 0 -1 -1 +33 1 3 16.298583199405865 32.907001008986335 32.39342735829258 0 -1 0 +1668 3 -1.2 33.234903621301335 33.64188256516464 33.628655019016016 -1 0 -1 +158 1 3 21.875930136943595 33.833211698179454 25.379447077641217 0 -1 0 +2400 3 -1.2 17.875371915094064 34.025983134917496 21.031393182638272 0 -1 0 +1685 3 -1.2 15.445473955927982 32.78648378910371 31.17913543071298 0 -1 0 +804 2 0.6 19.685737790968826 34.036925856103075 32.27897454085586 0 -1 0 +1353 3 -1.2 27.650553064225534 29.277430098895945 32.84531201512487 0 0 -1 +2544 3 -1.2 19.40523515843861 29.792981748344697 33.25990872136978 0 0 -1 +22 1 3 20.242886535067235 30.94615805029593 33.67637375068205 0 0 -1 +1018 2 0.6 0.30403145133282017 28.04593294325651 33.898112798471125 0 0 -1 +1718 3 -1.2 29.021706445534964 33.08009133011165 30.729991787389086 0 -1 0 +2653 3 -1.2 26.62241849158856 33.699911548417674 30.918818094343695 0 -1 0 +2868 3 -1.2 29.855526050650404 33.97530473333052 26.85445577382759 0 -1 0 +2006 3 -1.2 23.717510731781537 27.086055676507684 33.535734490582136 0 0 -1 +2328 3 -1.2 20.279908594793074 33.72710809477708 25.41233714429977 0 -1 0 +1546 3 -1.2 0.17704332974644446 17.838838514056796 32.84139891179603 0 0 -1 +1916 3 -1.2 12.465134408840337 25.30200446553804 33.003566163026505 0 0 -1 +332 1 3 1.8466997652927999 19.689164720122598 17.738069562692164 0 0 0 +1015 2 0.6 8.426738888861683 34.0620529807857 31.615367234805042 0 -1 0 +1153 2 0.6 6.855682335738527 21.627929018536523 33.971924677715144 0 0 -1 +1636 3 -1.2 10.314036310473009 24.426161388883507 33.871187721060416 0 0 -1 +1653 3 -1.2 10.962309410813132 19.661852691990315 34.29465332001776 0 0 -1 +1770 3 -1.2 8.901719042863208 18.529726830698273 33.705411218861805 0 0 -1 +2486 3 -1.2 1.4198841158830184 34.247971981230165 29.472581247538916 0 -1 0 +2841 3 -1.2 9.015390726100787 21.04190499136452 33.83168209528647 0 0 -1 +2335 3 -1.2 1.399710698024451 21.113318142772282 17.657544627508 0 0 0 +305 1 3 15.953834929889657 17.557448997426206 33.451839814841385 0 0 -1 +436 1 3 21.63820161661879 19.832047714915404 33.796567682647435 0 0 -1 +1661 3 -1.2 29.161759260213003 26.406779227583048 33.93255265719385 0 0 -1 +633 2 0.6 15.299236015026862 24.74668291739524 33.6225565663343 0 0 -1 +2071 3 -1.2 11.704141536050303 29.73605256040667 33.56356896485159 0 0 -1 +1670 3 -1.2 9.710044430756625 27.2220620136525 32.34255639183257 0 0 -1 +1883 3 -1.2 5.682586886412662 29.3235119204162 33.777458258057415 0 0 -1 +2709 3 -1.2 18.171029949092127 22.801282204779955 33.47660144061498 0 0 -1 +1667 3 -1.2 21.595697030653596 30.739994521826453 34.21080271534359 0 0 -1 +1473 3 -1.2 22.934072072854793 20.766057946471268 33.996334432268156 0 0 -1 +1367 3 -1.2 12.702563352200938 33.91285341700243 31.803377513941175 0 -1 0 +2534 3 -1.2 22.418453499538828 23.12950388187328 33.49027277943619 0 0 -1 +2890 3 -1.2 24.76201986619286 22.35652665133654 33.29663690413609 0 0 -1 +238 1 3 28.405914984138658 19.754126737840178 34.003334792322995 0 0 -1 +1511 3 -1.2 29.88002139167545 20.084608027022924 33.357290959798924 0 0 -1 +959 2 0.6 7.096093254489137 33.673423284997575 23.76058036605051 0 -1 0 +2161 3 -1.2 28.279363686538346 24.23143644583978 33.18781359401508 0 0 -1 +2805 3 -1.2 30.71842946004303 24.597040626946416 33.30428222135357 0 0 -1 +661 2 0.6 3.421493796505887 29.947819494859825 33.97908471707138 0 0 -1 +1896 3 -1.2 10.561593469686441 34.10499025265973 27.3614370699776 0 -1 0 +375 1 3 5.224656670463271 17.426043482911233 25.39408370389685 0 0 0 +2679 3 -1.2 22.101466988074794 33.95690895099397 26.91878608156411 0 0 0 +1583 3 -1.2 5.9613408827543735 19.286802462504024 34.16995256208061 0 0 -1 +496 1 3 30.125865938169714 30.04269438962636 17.217808946534966 0 0 0 +331 1 3 12.287448105569322 17.306090698451357 32.62556565238202 0 0 -1 +499 1 3 8.491509694657099 33.1522187971544 17.475626266348527 0 -1 0 +1595 3 -1.2 3.9079040572850428 34.23599371196148 29.961138887380294 0 -1 0 +1972 3 -1.2 22.911775545911496 33.96008405548226 33.44799501327432 0 -1 -1 +1290 3 -1.2 27.27102834431296 33.895869062299674 23.224007440382554 0 -1 0 +2892 3 -1.2 27.667619691278315 33.954693961843695 33.03681972939866 0 -1 -1 +723 2 0.6 18.683722598085268 17.22824250883071 18.837125755611094 0 0 0 +2520 3 -1.2 25.320373801055684 34.043120645271124 34.091131224227844 0 -1 -1 +2786 3 -1.2 11.91358867497534 34.30053717766199 22.014181864087526 0 -1 0 + +Velocities + +8 -4.906937371491656 -0.9692017044987202 9.2982584269095 +17 8.283401704991448 3.0124777353239613 1.0430409686638944 +34 -9.346485256217596 1.889903417184633 6.827404836783306 +122 13.080740890058186 13.662551707079936 14.225893491088785 +2961 -14.913707403493136 -12.675235364215089 15.918125204535135 +1707 -3.1820793583934694 -19.299243123467306 -5.596178928674329 +318 -9.5266248745913 -11.68781276069103 -0.8791213479480671 +2958 -1.3461353882989202 -7.497702223954132 -12.98551973215651 +458 8.614872977431984 -3.3116432364194464 -8.73055724590433 +582 -2.06263412890504 1.3012080392320102 -0.23444521686995343 +2928 -17.474910611306743 14.314257981185605 8.289528385024994 +2807 -1.2117592027804132 16.960561158736724 0.6264138114928075 +782 -4.064007958308133 -0.8706443455211429 -14.134209003087703 +2651 -1.2309297830731438 8.30479875801477 7.727533630149389 +2619 7.426149148221799 -15.862414292712579 -13.329292153035455 +1081 13.07860754974467 -1.2045631213212127 -2.612235566836085 +2596 -13.867370438958972 14.636015125817625 7.424743224039422 +584 2.812258501467079 -8.527177152371458 -5.855992297550492 +2592 10.937770260415009 18.454646875074943 -11.00242060106704 +1418 -17.985167919344978 -17.501397433997237 -7.024079326375344 +1468 -2.825569117306523 15.228947819889088 17.816799093280963 +289 13.138418140540105 -2.8531867705476164 6.548423509456814 +2450 -4.681072808551039 -11.768645867871276 6.882009591047051 +1547 2.14685837489391 -11.899337698706637 5.153672795586491 +1576 -2.740258972814682 -1.1052888845576188 -3.7693954460531804 +1664 -13.733827542684422 -14.103836387015452 -8.449450691768478 +1686 -12.303583083249961 -1.3080435538794966 -1.6741589399393544 +1704 17.06078477167367 7.082262474410307 -2.295956971988685 +1932 -15.682419614646438 1.276080674598199 3.8327388643807354 +569 -4.628225020898561 7.379283390143609 -13.149483471761528 +191 5.229066446755509 -8.204278572164906 12.74961189591163 +2086 10.011376137135505 8.178578159644173 2.7611557251466343 +2157 -13.675184862330557 -8.321871989697048 9.523218056630316 +6 2.2194798216452276 0.2884000487500194 -8.728011371809654 +2225 -10.957161721693213 13.621755855030218 9.733998094545727 +2398 -13.382281448248156 15.377986943142224 14.36389897508097 +2088 6.465491648805453 -14.107707154076227 4.880612462608531 +2317 -2.8709040089235645 -2.0471467121157905 0.4072160337574496 +2318 -1.1093412968529164 13.805312896561457 -1.471588109650163 +2333 9.92352440387252 -18.203667612541945 -12.97917583460034 +2891 16.984311457213984 15.165011239718403 1.4463056194017725 +2541 10.568410012230956 3.1145220850850532 18.41573786494483 +2548 12.373531916654766 6.39889869766154 -4.035339074962509 +2656 -6.041728436026699 8.417405430853727 19.04280055923228 +1363 -16.702429234591225 -14.674737598242055 -1.2955775390436777 +2906 -10.918834522872867 -8.494397302215996 10.173960908339968 +2916 3.5158801840373006 -9.054041425115747 10.560604708445414 +2998 -11.059228685422807 -16.517732934994633 -14.030370142844722 +11 -9.501529972356671 -12.445199757807622 1.8768715967663412 +2148 -3.444921066358367 -8.068278208181583 -0.3655564046967043 +203 -5.819694635003162 10.148658838974534 -2.608276816283115 +222 -3.555247265703014 13.080303834957718 2.8532982344945226 +225 2.7040384948948 3.5712774236396996 12.680925920667686 +342 -7.5318362690340575 -5.783488286380358 -4.501774576499363 +2124 9.343976498128749 0.39730107979224594 9.953598755895356 +1940 4.1742190389991825 3.21472850217034 17.285019204173643 +505 9.427922693446137 -0.10461914984209345 5.394389944887571 +549 0.8992636533009057 8.188470510546022 9.644377939293438 +2219 -1.8596303110379642 -15.341902770848243 -5.13617782457346 +573 -3.9928091871135134 10.95400475755494 11.963493419581914 +1966 13.642225120454766 8.321295578159935 10.63843180310241 +588 4.834219922076892 3.374747132312193 5.3101086445992 +596 -3.6806859412945925 -10.698966483670864 -0.7511584150401532 +623 5.06710346955251 -8.83652174502126 -6.92425035825292 +649 -15.436623710237477 -0.19088499382386723 -0.2879627566727976 +684 -4.016060041338036 -12.407509397081501 5.159090381412875 +716 -6.891834687580734 11.68444060652071 12.534442744388949 +735 6.887875740210256 -10.47957726734983 6.277274064902867 +2503 -16.072895855398613 -16.223328056266148 -4.288417475713153 +2840 16.46593904202134 3.730840169953399 -9.277191439011668 +815 11.836566133265917 -16.21030778355435 12.011544352242314 +845 13.694457508530652 -15.214676407894265 5.287161037967109 +1001 -1.1551987367858747 7.115108810893529 -14.251323412229324 +1023 14.273797112480771 11.063681033556312 9.420470979826838 +1041 12.354144515563963 -14.379895744148918 8.90458105864647 +1666 -5.132533382301637 3.9798701515888513 -17.483705338846775 +1089 -1.692703393261826 -2.6571911093572433 6.906635884339151 +1135 15.281926258121228 -14.481983779603883 -6.702219251412939 +1082 5.475536198435329 -10.446694182959467 3.112969627495644 +1202 13.1212579522795 -7.529866298137869 -4.8647985246167025 +1273 14.674911585107889 2.173707429514394 0.9319183664904781 +2790 -14.479170770396182 0.6797586297276698 14.861909260019013 +1308 -6.558481012705894 -14.985162315767623 -5.9318028619172996 +1344 -0.4178166402609711 -4.067487765734669 -14.307324439489287 +2496 -8.788171707716138 18.325928434797227 -18.757004866595697 +1599 -2.3433193838492383 7.444545549484206 11.67718707291225 +1453 14.721099677453513 -5.40347596561309 -10.659065810346434 +1645 -14.332517667174532 -3.681957585215882 -1.5503049063824446 +560 5.058999630590357 6.6691223509247735 -5.384646001223826 +2763 -11.144257149022119 4.550714530218634 13.600258626052483 +1888 -10.90699428903104 -5.460699984625873 7.402410951847029 +1915 -8.122075093784098 4.207263083931951 2.5861190287209395 +1998 -11.65840528161114 -14.271983965269227 -12.608173190070575 +2684 18.816154391502067 -2.76653408769428 -18.885453014401055 +2085 12.09091383379653 -1.2074886401865301 3.0523048845063445 +2580 -12.420033858915923 1.154898448366806 5.160236358247142 +2164 -2.737175028783504 11.533535875038991 -9.224003319152159 +2173 5.94399501034554 0.335346467995682 -12.298974826540967 +2188 0.7741647127786205 1.9285782737987263 -3.6864316446289522 +2387 11.37236414587427 -6.421141250064334 12.791362556827957 +2204 19.688808896074676 5.747282186218481 18.292273373759972 +2215 9.536493762494683 -16.985910231253627 -4.888651315158156 +2234 -6.812649580927938 -14.756828031943646 -9.233706727656466 +2302 -18.55608800176783 -10.664692476596565 -16.466042572988453 +2446 -14.010447760753259 0.7098446457420797 11.008286973046445 +2330 -3.0998672474526336 -9.316084574868082 -3.9800850701328003 +2455 -12.575145035945637 -19.05916411157516 -7.469551014667834 +693 -1.7188495636205692 15.646726789337626 5.1295636652176135 +2523 -11.322686390114717 -15.639825010598697 4.391627956923875 +2549 -4.425053129282815 19.114643201438728 -10.0695513943913 +1930 12.919410980196837 9.821037707439789 15.690884555810499 +2957 15.57661880732168 -10.532744342410275 6.376984641555096 +213 -6.8640399572800295 6.808541756609664 -0.14769031703099272 +1498 -5.174302493860307 7.440818488225414 -11.77050893120244 +464 -11.281246849123585 -9.206200678375865 -9.964354781235862 +512 14.307218942269438 7.741623120363307 -7.700325174540903 +1199 -5.798573630496881 11.027101845523456 15.856161943317023 +615 4.658831046958369 -4.532081513289401 14.471431699836597 +619 5.948317567682026 -9.513975374934557 -14.714130804033994 +779 -10.244907765530343 -8.378696743922676 4.203990766174721 +835 15.724206908493825 -3.040443525070138 6.67562887380089 +1045 -7.5469141027988815 -12.412816130542616 14.05652176863953 +1191 8.33115462407806 -13.649341360277573 -6.3263729588315325 +1467 -11.533373221841313 9.91164824898817 10.054376035792458 +1345 -0.41864330451049736 -17.961233807520422 -14.468562367563617 +1351 6.29149540501694 1.0141164225067678 -9.381917927363615 +1406 3.2850212845683973 -8.990330131256933 -16.04831143367508 +1293 17.98292761960366 -14.899831036996035 17.282186845674637 +1137 -14.918879738501152 4.422588734754307 16.385565384696125 +2401 -11.751551571715192 -12.060778848028752 -3.8691663655709196 +1905 -11.571894626076807 -10.429231578588327 -17.57000956101481 +2267 -2.250270114324731 3.602715551834568 -7.051406680109752 +1995 -7.688561648187334 0.3655447621525599 -14.265538373055069 +2008 -11.194717194730162 18.715222907948444 18.073458367396842 +2015 15.261296850113947 -19.09083185869706 8.99293912115023 +2356 3.876358924540825 13.786674067887539 -1.1902010529602642 +2381 -15.577328751600998 3.8522001212418995 -7.61766389799763 +917 -1.9602924693985777 12.007436995786316 13.615320159704025 +2473 6.286966463923035 3.2822486020538966 15.497683347460658 +910 -15.102733024959072 -12.184975827696274 -14.747734573976125 +2673 12.212249219678698 0.03916811658545903 -12.65466028319774 +2734 18.41782780611381 4.565405172475413 -13.845274971064638 +2922 16.438303562168713 9.57760115567223 0.32710652814159774 +2951 12.626157390444808 19.42879886761651 18.079705353877507 +38 4.031455883693432 4.028143442915346 1.2292707339425826 +63 -9.403753230778538 -2.884151624991841 -6.84499450919499 +868 2.504674329420785 -15.082486615098917 3.6797934043604035 +285 -3.430627889621083 -5.0788866287031835 6.970838076826451 +1654 -4.998036760589673 -8.730717934693876 -3.171629334904263 +703 3.29118396668342 -5.358703121346137 -15.496240475964944 +372 7.471468624124938 -9.595753348481232 6.083002964960533 +2205 -17.43375819000067 0.48859656911156496 15.829007422061649 +629 10.597021286641104 10.743797089316384 -4.741343334358719 +672 -13.178347426357785 -5.28154040716037 6.237388158101003 +660 -0.8644939932089583 -11.39529930003914 15.506075557389948 +719 7.35458699894123 -13.47950522890519 3.5661676400817583 +752 -8.223597549986465 -7.258235505296441 2.9575000698929186 +627 -7.800027074969303 -16.015510445081027 16.380389801236973 +603 11.216418172413064 -9.044914789403855 -10.924823465342548 +1871 11.22464312275204 19.185067768231708 -2.2345344768244026 +934 -1.8938377554949382 -15.444694220989122 -2.505997366151849 +762 14.004702902040094 0.4315168926315569 -2.267528371168284 +1538 0.41933787730041383 -4.306614603496641 3.5692382523557775 +1626 0.8464035242576065 1.0625830566684997 -17.856671591573267 +1657 7.8966226894500515 13.588856077952947 5.489760770450134 +1741 -7.151553561687264 11.465262916628951 19.103061855304475 +692 16.045463421090723 1.494226941956182 6.738749022017296 +1987 -18.22914275647241 -2.719114932678974 -5.772166120168252 +2087 15.795276328624446 19.493116959862967 1.6692497128563102 +2104 0.36227502998401084 16.463674859767803 -2.427805037732982 +2222 4.416095596211218 -7.640321964866108 -19.221128323289516 +2282 -3.7931532765298788 18.146351299353412 -19.04718219585003 +2309 18.710988353933086 -6.606111751494743 0.24092823561969592 +1758 13.773297824592333 16.450969963774526 19.199143437705242 +1724 3.312281986843722 18.05704471366409 8.504912447304484 +2659 10.64149519868669 16.473551102148758 6.790110369453212 +2699 -8.987809709549516 -5.583049724682331 -10.892496412197513 +891 -8.323547873904912 13.063481978868879 8.689529890719848 +1695 7.6853977731209895 -9.0962811485375 6.111979462269582 +2846 10.917694063459827 -5.421814771467757 -5.3351952305101396 +2151 6.993865688504989 8.651676713471469 -2.055032296896054 +2908 -12.314412083782644 12.654057355338306 10.729681318975553 +2242 -14.665449808604656 5.329769251955718 16.70342767928117 +2940 -3.4098733310328293 -6.916329177872368 -0.9113547637612095 +145 -4.19016121770842 -10.22778438566414 3.0595702424103877 +159 12.57918475249194 6.388230798216201 5.9780067965638075 +531 -6.0028878594229935 1.5859736911412776 -2.822100595867575 +1573 9.333118625030822 13.874140784945467 18.721077360852693 +284 -4.673176140800453 12.435147137187824 4.5748394156478875 +2456 8.097125389936222 12.837801922538246 2.6758390286630593 +656 11.256213717563934 5.880808106870987 2.7533855088515677 +658 -8.313389031902421 -12.372261821577279 9.038887871911156 +1572 11.359331759798351 9.701681406325353 8.513682917888326 +811 -4.143920513799271 -3.4290553534880264 14.45667319858255 +836 16.385526713032192 -4.844564373944003 -6.0839716866704805 +972 -1.462962420251215 0.48311599885991396 14.86524421809316 +998 -9.076232747229774 16.00220220101286 -3.7449330671499497 +1125 -6.424038830209195 -5.782538225825118 -11.186592900975452 +1184 -4.651914151276621 -7.648162305082974 -11.362179398123459 +1461 6.975980685643247 -17.590408377028915 -13.696141108566126 +2753 14.457001501881624 -15.289962121013762 5.583827350758015 +1791 -12.336581669472766 -7.212966186954623 -8.975699714316157 +1543 10.200196636360412 7.049880268178652 2.1586189062339063 +2002 17.56299048490076 -18.039190956475732 7.868402602217279 +2080 4.775925780786471 4.300114041639805 -4.588737671435462 +2423 8.944296972074161 -15.009633439122279 13.905275212796708 +2264 11.538015068514698 -5.0306870729302435 -16.07975807388931 +2429 5.646656226371513 19.66929348384225 -16.00162726977705 +1319 2.806694095332192 -13.665772282023495 -14.194281703311907 +2463 -2.572581915170624 -4.8546062737326965 3.8335411092293157 +2494 14.062823513554594 -16.618597197600934 15.236961418704372 +2698 -3.036990082368745 -10.751180464794594 19.265197534001043 +2825 17.493066132563044 -17.46710352448387 -18.541680721276826 +2834 -10.4707509259648 -2.613717969340057 1.9485809589477026 +163 11.777359050185748 -5.356252364188299 -6.913580821646564 +2966 5.913664818572335 0.08510677697836767 14.768976064777029 +12 3.099457221467548 1.609248953838011 -5.993675382736332 +53 10.883995578429126 -6.3088608800034915 10.468136421036188 +126 -10.835994680116737 9.496114056293882 -12.384303035789365 +209 10.926095500359263 -2.9478210910273543 -6.534941069902131 +2391 8.41866745038278 8.358096856431906 2.0691545617241185 +1253 0.06715751721310897 -5.255518158254775 6.9073803995953185 +426 -9.514820841270831 -10.47688220902552 13.578047629365853 +548 -8.125628983008298 14.157710839177795 -1.5087747362682233 +718 11.126247734895898 12.167852327453064 -4.0439190030901635 +774 4.162072872111417 -16.09216937212784 3.113911611547354 +557 -12.512190195812572 6.172005391934762 5.6133195734118155 +873 -14.044666727108623 -15.83442901558936 -13.598645668100053 +923 12.638153925171407 -14.635180989093893 1.4883984449084964 +1347 3.5236435094628327 3.845101284582482 -9.34874391566854 +976 1.1994086851559234 -13.73312032866613 -8.47578508829603 +1170 -11.433867885875808 -14.03640330748467 -5.192375346958857 +1187 8.393445728887588 -12.991549953638534 -2.0404768562603763 +1404 14.59236826094704 -13.376151707810468 -6.47608988272144 +1421 14.019126473865603 -6.367314374888142 16.020134477886263 +1435 -11.41248171058576 3.698104156168125 -10.769059114515947 +1499 -6.168954299736258 -13.444467026033363 -18.05398865527634 +1533 3.7584093853284415 -8.940102854636834 5.068052699909098 +1539 -2.7405214905001913 -5.517423624927336 -5.319269857198334 +1042 8.883242174178312 12.346350144536675 -12.053927769242069 +1622 12.347118392385816 -6.40995539411558 4.826930625533475 +1722 10.27582541916136 -15.226912085551872 7.054163903878077 +1763 18.409794991245548 -12.863046601203573 -5.18352906883322 +1766 7.259307533401149 1.9281906294967055 -10.201569428656537 +1025 -7.771781682417551 0.9621990541424024 -9.07320066127099 +1813 -13.201364567374844 -1.007756866393464 -10.65571420193986 +1825 18.565675434157093 -18.912954937732145 -19.292388296404553 +1012 -15.269703512040836 -6.61053305692307 1.1577757150017218 +2156 3.758063407313688 -14.754955348601564 -16.95254036967674 +690 14.083467917851884 16.399128732492244 -2.5643639281931074 +2251 16.21560623606858 -9.959214231191206 4.214011089803567 +2281 7.195404570970779 -13.877289482886306 -2.59882251612085 +2303 10.744589018301818 -14.51463838443024 -14.82664849954258 +686 -8.816821164516991 -5.317956989897085 15.405986333835111 +2419 -9.146439160134863 -6.5426907893476285 7.94542958735448 +2498 14.917289232807503 -0.2595152127451602 -15.918487075594864 +2515 -11.16951777825535 11.118567303649721 -7.242764771208339 +2597 10.665225417705907 -15.815906138308364 -15.527192529401557 +621 8.927398038201021 2.4682516516846307 -3.473966155264952 +2736 5.6980821342147445 -17.454992560153524 -10.957816083146913 +2743 0.9179654547632724 -11.17975067901234 -11.391262074254962 +2751 -7.107214682317791 12.001379603741112 15.221030497187865 +2949 -11.56421138460595 1.123940104918138 -5.647348542311667 +2991 12.652312850192542 -11.292660021018179 11.399532881195269 +93 13.786002082463344 8.051470609997965 -11.264942757443663 +113 7.771772817684559 -4.543584522729863 -10.124722392935594 +125 -4.680531669373936 1.4847540972201485 14.258313713498525 +498 4.58753908539273 -1.8214682439828334 -5.150557475718824 +176 14.348473265150746 -3.109320304345654 11.491691282065394 +248 6.976621558030407 11.38380819685397 -3.6330406559790855 +493 -2.992274489809466 10.349789936270696 -2.4171953959647947 +354 7.188547678296896 -4.172616785983542 -0.507128020992491 +356 13.699496824933465 -9.249202589239594 -0.3166286534181401 +459 2.4409411448118514 4.1476605903431825 9.990898975464857 +475 1.9585755120886499 9.554721418508395 -13.267653623689048 +515 -1.2109015553266724 6.775658964000798 10.561092778448211 +452 14.028290778051325 -4.234041569953654 9.360802967867814 +1768 -9.19458261137286 7.363798274088034 -12.87950304895322 +643 15.84824146712953 -10.929230788984368 1.7034874018187305 +651 -3.0779818815089905 -5.551784501963505 8.975017760054548 +307 -5.3946400267599035 -0.7559970200016961 -12.937831456966505 +819 -7.410822483256034 -13.833982064404577 -3.4721660628709383 +842 4.998032622181581 7.342154509769311 8.981311757356767 +888 -3.436289853082656 -11.588221759862394 9.952415357336372 +941 15.985054700962252 -0.22222535285448367 -3.8909734207283644 +943 -11.337565173290095 2.424176207247519 7.755744312781134 +970 -13.78315796238164 -1.9072500938282582 -9.452202090380919 +1166 -2.1905189592901473 0.707047669287659 -14.239596738487561 +1217 -8.28817445371948 -4.72007670955533 -8.323382961037884 +1400 16.31208471586276 4.640670201105761 -3.042661097660364 +1641 -6.055371051616853 14.284100641539728 10.944414397987211 +1442 13.922225034716469 11.117145886456965 8.06049904255704 +2091 5.276216560362665 -13.812606687434235 -12.879711380389544 +1596 -16.32627955341311 -2.8036801941885834 -16.111703705763688 +1603 10.949169594489975 14.078141811001299 -1.619664090118439 +1634 11.28575763780349 -11.874887216863542 -15.030327163954974 +1678 -15.928181192695131 -13.971391487751166 -16.450315383738587 +1714 -15.824712376494618 0.5360092086364845 -10.360234103041455 +1732 -7.925215720467376 -18.584168235996753 19.602547634180418 +1786 -17.05536984472772 10.79185884259039 -11.208709659289118 +1840 3.602821135697277 2.0206979452759946 16.041006550205022 +1868 -13.212620013141093 5.787079002259909 -18.3170457211868 +670 -2.234052294722165 -11.647916036777247 -12.452290068945869 +1956 -3.8786104301955806 -7.183217753645221 -18.503074524412934 +2016 -9.570523066831656 -0.9908024653659926 -0.05425414004430295 +2063 -6.397472751105037 -13.237867085841387 5.2852197799724845 +2102 14.242289849160478 -18.190632744374447 10.132740594529025 +2123 -9.526906603865518 -12.596338269080752 9.378835665685905 +10 1.0761881562888613 -4.101763676243097 7.244342593982432 +2177 -9.695818940084804 9.58467467864771 1.6327394598216265 +2942 13.129027884448787 5.480315953830509 -0.6046211171665804 +2178 -19.26699251912384 -4.965031096822968 -10.004399666138099 +2470 17.27629490960468 -15.789948552361121 -10.38129381053296 +2472 -16.614703595230434 9.588247959732831 -16.69717048738258 +2937 10.286677452043811 10.391114280241611 -5.322686602258104 +2883 -7.495716875488081 -11.513233990777728 -11.64305506183068 +2505 -18.580568779728686 9.010120631650844 -13.41357560589782 +2556 -18.332541307580513 -16.04557022094486 4.617805266666948 +2628 7.755411225246016 -8.170868455217557 -0.10684515262372103 +2660 4.892978080395476 11.946984950116907 2.4496062003716457 +2689 -1.2925944099208033 -9.073997788149693 -11.301808223882352 +1649 14.55765418443174 -8.92029711441007 -14.794074460483314 +2759 -12.571534067220044 2.437364687068747 3.407895401160337 +2815 19.09966628283709 -19.330930252804308 10.540554317942352 +2858 -18.65581413413316 -1.4618285274793386 0.4012795459825351 +2863 -11.717476524276679 11.936227437471748 17.6132040352032 +2936 0.7911070866123512 12.327897290511887 15.980631917451309 +2967 -12.83452336838035 11.18773076716468 18.589911925043822 +60 -1.529942537489781 -3.332282760611064 10.571380672848035 +89 3.593813174820674 0.5440494873894316 6.361027448155004 +154 8.460600562673434 -4.6666771089057075 5.526732098669178 +200 4.350014449670986 6.028116336935724 9.760449637216803 +218 -0.38922262602400476 14.171401172514027 3.2367062566548546 +277 -0.5612991204919751 -4.731861139824604 8.549987466571302 +2871 16.098065858702093 13.383814562758587 8.34300127014083 +491 -1.2377758148623736 5.795881725629903 -6.154501117979941 +669 14.566433022327589 -7.685515801874805 14.755604476000931 +1475 -2.2506566818370226 -2.89432462723738 -11.044809633247494 +788 -1.1768968453587638 2.0899004762819002 13.278372281705158 +851 14.481915646237015 10.450554043571232 3.8037204577530304 +911 1.1693125306946541 3.5752152043357284 -2.7047634766430004 +999 -2.757421952948523 -12.724601935179127 5.216538878215177 +1200 -11.044225173375857 -4.491378865054372 11.946935908809765 +1320 18.225540153469332 -13.38532188639142 -3.827191003152686 +1323 3.1045974821370668 15.682583052623073 -0.5752459648792689 +946 16.620148174384934 14.930309854975489 -3.5985701978423075 +1434 17.925903828728238 6.526880029743878 -8.669332249231685 +1623 10.25602798299097 4.774781350345834 16.961137553408616 +1723 14.02918047780502 5.8382395453125895 18.484727344790713 +1802 17.30341026351742 8.8145563626166 -8.04834918275026 +1955 -2.1329161310852025 16.319983238559125 12.514516796937825 +2058 -2.032324570040143 -17.530643462770577 10.947208521325543 +2175 9.270520622246543 -19.1919051280146 -4.445527685496574 +2193 11.604434324282945 13.873112596760778 1.4403185407603252 +755 -3.2253867645308563 1.902763476354832 6.8732358886745075 +2504 14.125725846317039 -17.630699914072924 14.598402096002316 +2081 -16.64891439117735 -16.6902835064455 -13.804154159924815 +2725 -14.243744731174047 -1.0100799763539012 -10.507200734580639 +2767 -18.946334101529022 14.896901000372644 2.515108761318716 +2987 16.324221942912054 12.665932356712872 14.347716559285663 +23 9.773903323276027 12.082078132258026 14.096291447599468 +2676 15.743850585037272 17.427141083061162 3.8306874521945087 +1618 2.2160699106824797 14.741289700141035 13.088498119554199 +322 -1.9407025001426204 -5.6939637761675055 7.206490618218681 +412 1.3545494703395178 -1.6531497503508186 6.92897263397981 +437 8.731402916952018 11.580969545952076 14.343964570487904 +570 13.866339789806089 6.199609585014801 -9.307404032165113 +590 9.56618057768758 13.779139558054078 1.9233301590330274 +652 15.660474721859858 4.777403067594477 -3.5996833285357686 +681 -11.902851386142991 16.16576160047683 -1.2577249847609608 +699 -1.4778410941272142 11.98444594673088 -13.14033886507297 +700 9.855408098308942 3.5889256474651963 -1.144647358672546 +2608 -10.337241592678543 7.275359945932804 -9.927626602619263 +810 0.7126312781968859 11.669956813820809 -2.0233596037985233 +2567 17.746176453741384 3.7116267005782895 -18.65379064728846 +2502 5.722041052421746 -6.7076799790736175 17.67672050312397 +1070 7.600559802035687 0.9019683167772178 -7.798296653541256 +1525 -11.754758306276688 12.429678521699465 2.124791301424713 +1207 11.813513764455317 0.49923205775468393 -1.3854478150301843 +1241 13.091916636740583 8.839936880523089 -12.601233024765284 +1370 -8.589993558993598 17.699155360445218 -10.008993524877122 +1882 3.0580248298532213 16.79646756605351 -13.783018347125426 +1937 3.895052030717296 14.417528996588318 19.47249107278313 +2031 17.062067173487495 -10.557432813033893 -16.631915405566176 +359 -8.207026830678107 -1.8082066128107346 -7.610273755356012 +2089 11.047144538245735 14.636073473220335 8.40538802138105 +2127 -10.15854278914052 -7.196587065401913 -8.04296178473385 +2488 16.692564059032435 10.89431155255197 -13.779006520610306 +2321 0.34740334104757165 1.6733343394013764 17.661245903193308 +2367 4.082474966379519 -10.200019692885496 -6.122058648846709 +2909 -18.94622065534346 16.80359104112196 -11.63784058894429 +2974 19.848232670716367 -19.13589490653451 -3.714277007225139 +16 -4.321810152364724 2.4595908130312294 4.275532794434336 +61 -6.432976894665468 12.38249674520931 -7.096986934605509 +2097 13.205210210172527 -7.493080496436901 -13.694190494848826 +327 -1.2992069605664027 -12.611602871085534 -6.17935482523877 +362 9.515064163718627 -0.2796123091147618 -6.192269892757637 +401 -7.824943754379502 -2.5545578510754 11.612754671876429 +451 -12.439040631297921 -3.8169964502965725 4.683142059176201 +466 6.820391067157145 5.287882987982708 -9.035625892839501 +2038 -0.8481907145315856 13.344621862255819 15.912667650930356 +725 -9.80076016884469 1.7447099713893148 -1.1641040263191615 +749 10.141701472868142 9.024339123912798 -0.495570986898071 +778 -8.978322937075319 -5.918529891831526 -8.085507880186398 +2370 -3.2527515138211553 7.8975403478395565 -17.478638586910503 +898 10.762570408551843 13.976370111840833 -15.472723928613973 +1054 14.678180954264462 6.795663565998454 11.65598238521984 +1058 -5.357413434146158 3.637171354415373 -7.676556215075709 +2257 7.256315828273099 -9.160374885256427 -12.899844117930774 +1426 19.260289272723465 15.134125844211129 -8.13524323017972 +1602 -11.74970175646682 19.029066031345057 1.776786020125669 +1751 -12.054514537941714 -8.866417805049334 -10.684041199805835 +1776 8.167750403874642 -15.151288558944852 -15.310969301161295 +1876 -1.3013331060823405 0.8268261144878005 17.464703562323404 +1880 -6.617157383802766 17.8596555415506 -16.801007182405872 +2001 -7.304663333375736 -14.304202645467635 -5.405215271128249 +2012 -19.213528102320442 -7.828097047270682 -0.5221099324415083 +2162 -0.17400578543361545 17.587201787952203 -10.347602939768526 +2341 -1.0912616323091895 4.126054303758697 9.465940690899327 +2508 14.994753558830256 8.313667362469234 0.01007840673545136 +2606 -9.878890349448788 -10.240741854567268 14.934976268804084 +2622 6.73226610311783 1.56597322034553 16.12195626207003 +2643 11.094848221258614 -6.661600149722324 8.27996096228784 +2791 -18.627213832433725 8.907171266115302 -19.19056897606169 +2 -0.8993669207402951 3.398392661039866 8.36159503968532 +90 -10.582888138018191 10.015184637597141 7.570334524675865 +152 -4.106825913811972 10.13246594380217 6.92267325817234 +404 10.58785773032106 2.325750451236744 8.300086005370986 +422 -1.908216089466191 5.103755913491793 -5.125035261719642 +456 -2.043188616909261 -9.899998931334315 -8.87510786876281 +477 4.943242425311092 4.763853953211878 0.34698481172707973 +732 -8.032357857050476 2.70906184320311 -10.46870492156576 +753 7.660045051973881 -12.902342876374927 -6.748539531999267 +885 -1.9584465034317855 10.336686776932341 -13.601217024210044 +119 -3.0061635191155345 2.2648257782543584 -1.595111558694543 +98 -12.50968238718558 -8.01624286147247 -9.97401186708766 +1105 -12.041659366743435 4.628947462035413 -13.804629032930686 +1176 3.007033023477383 -7.482173067882387 -0.7325886991631455 +1264 10.298289826228828 9.595174345779737 -17.86446791421622 +2885 -5.653768379108361 -16.37268753358865 -6.219708201347258 +1384 -5.0131007568712365 12.439854567891594 16.38150936295277 +1412 18.634078118353326 -5.866696251234686 3.409085655324405 +1459 1.7609170432058252 7.626447638206463 11.849831580578863 +1463 -14.484305414837326 -7.232165347801824 -18.111815494029972 +1513 -10.314946716115852 -9.944875388913982 10.048797808735467 +1601 14.9891420242944 -7.613348436935998 2.999707301684518 +1613 -6.300111540992795 16.198065802202382 1.4853377139790338 +1677 13.074317348170185 -12.600148115393875 -15.460228746543148 +1737 -2.324764946288907 5.744797046780017 15.717557403897116 +1846 14.166373307992778 -0.7501952607363376 6.949709113300342 +1891 5.316805400875596 2.0826520825550516 -0.9074176555027967 +1931 0.43756933269441695 -11.434724375689349 14.498300839296887 +2062 12.251711847640358 -2.9938274626142367 1.9110068011605759 +2065 5.134246452168691 -9.129838187114235 -9.178851883303661 +2098 -3.2413722737375537 3.183315570949797 -1.1628223783323883 +1492 -12.637854659848143 -14.808203586179099 -10.456150170085586 +2171 -18.04040246895689 -5.195931023805568 -10.630237794995574 +2201 -6.4907545159573905 -13.303586063273077 -1.849001887216732 +2229 0.7067367605448243 5.264639680019964 19.475344182297732 +2306 -16.78594657893825 -7.401931432269893 -10.279749363581464 +2339 2.9421855794993 -9.655707084637317 10.165688808893375 +2375 14.251642351968227 -17.775208344167513 15.812616985091461 +1867 10.829569829393003 2.8090410187039905 18.48141218297883 +2445 18.616740617441504 16.286106502937265 -8.149462786055912 +2458 -19.066980341985378 -13.960311157195736 13.004709971715963 +2459 4.263337861761055 11.69992490966183 4.571898946467222 +2614 1.5166333681839128 17.218091646995784 17.708847017421945 +2697 -16.028967944691704 16.598660891536397 -6.912878302147367 +2723 -9.909056175657774 -7.728489507780797 -11.718164339214631 +2754 -6.313047198499945 -5.246417058472466 3.097474151262708 +2819 3.2296683428384454 1.3253199510163294 8.343783603504782 +2904 16.702733206470036 -14.157940325663818 -16.334828389631056 +47 12.451393389645123 -0.5956663719435671 5.7324477106483736 +142 -2.047659249996697 -0.5324474609561145 -2.1500844213952304 +208 -10.591703927189663 2.6906856508417176 1.0343104136099337 +2774 -0.12190759578674858 -8.238043982388206 7.47172428989156 +273 -1.2813399456006265 5.994378422352615 6.097197711652991 +293 -7.924590806378253 12.787074624064335 4.036387385665241 +313 14.194078023018184 -6.528713851900126 5.471941750570807 +355 -9.183759041505928 4.48548348351117 -2.2555081245451225 +367 -7.0954110386292575 5.406938981844947 -8.024605628290006 +453 13.2086422912263 -5.672630980382679 -0.4436316334704483 +2740 -17.989335460605144 -9.15921824883268 6.539744256021584 +561 12.857358913512646 5.691363749752089 11.826995492632335 +591 -4.789316624151984 4.0881241788712215 -4.740281306534139 +639 -4.839525173047331 10.67571639857741 -4.617004789080437 +2708 15.448438469897107 -9.24343395519556 2.0751800215316267 +775 -11.899092402362571 13.951201552536888 -13.43399725468317 +803 16.160584940940858 7.283497922607622 4.017058012506802 +829 13.45069983719096 7.6335694487248595 2.407157375106682 +855 -12.05903302705101 6.892940677118599 11.79737784543295 +2587 15.814855121728066 -4.183310499229205 -1.2888776621037552 +937 -11.517464989071255 -13.129207136363618 5.764168896445849 +2465 8.048775377577217 -15.920404347238009 -8.142574251905538 +2411 -13.479577704213936 -12.966261605289766 -15.425109559831434 +984 -4.749347792832125 -10.420364792363477 -12.111565743844983 +947 4.970805796512961 7.4834986153322465 -2.2490223050450644 +1040 -9.31654722097325 -1.3674306108897598 6.529485963174271 +1106 -5.567467138403847 4.421787949346457 2.926765034960051 +1109 8.628843082421659 -12.872156055758367 10.162851229715637 +2944 -4.580408701079399 -5.206962205297655 -0.06619227049799584 +1168 -5.011094055687807 4.356725459552341 -11.613793584904611 +1205 15.117049331645614 -13.491475267138128 14.931977117401305 +1252 -19.069928957273646 14.868356837744441 -6.910361662046695 +1304 -12.661931148892885 11.661493335240577 -14.259211193115691 +1331 15.398964562822346 -17.69791614024515 -17.700079153392874 +1416 -16.372819062474147 -1.1327575350051267 4.881267351520459 +1514 -18.19278611935534 -18.761476064465175 18.259590067919337 +1520 -4.189373186692993 -17.500864076319168 1.9400631689364323 +1272 -10.9471176461201 -13.532578849642304 -9.614550299514253 +1605 11.222127431686383 16.096870600136167 -14.00245279959283 +1865 -17.631679460495764 5.4327220121165025 -16.65554805648565 +1727 -19.11953293689739 4.227745321867892 -5.906111133528792 +1740 12.362447607452548 16.070026797992252 5.150035436387231 +1901 -14.532132618407461 11.98949826938289 11.496556800613273 +1928 9.803136994465653 -3.5176837488826385 15.88848227836839 +2053 5.117520294062174 -15.89521947654986 -15.983700892638815 +2093 -6.734149237181623 11.22870442312526 1.7597413512677944 +2165 -5.829781632563828 4.042277142825819 12.372009498424372 +2284 -7.70383738878114 17.97733060888643 1.312720910834566 +2342 -16.01672249114942 -12.750136857682916 11.225446807592514 +2363 -8.418708562235725 -3.7975744876163424 14.927545069132233 +1784 -3.413130455703453 16.72722162774567 -1.8088263149512085 +2412 -13.575348714906257 -15.675712842669347 -10.879827068515931 +2490 7.662275392777795 -5.78390185256052 -16.014268434418977 +2522 -17.39092376838771 14.932314314936118 9.811348043598581 +2539 7.400616456200888 -13.867120791715537 11.534279701388227 +1963 -7.386392878262444 -16.176873522340244 -7.387517231056331 +2649 -7.4138430042764965 -7.214870571716321 -1.7896718317523765 +1098 -4.356145957948988 -6.448970901162074 2.773209104179551 +2769 -16.882954967033236 8.285037896193785 -10.849090415996482 +2787 -13.83879720300812 -14.64290168941588 -14.931773911112675 +2799 -3.4316272576373366 19.39565210417675 9.684368235467169 +2836 16.61930653146823 -5.361254474614017 -6.5168728921481724 +2953 6.071243121625912 -16.62188872479083 -0.8907134894576699 +3000 -5.726480138536617 15.737494072548454 -18.318275816570797 +116 -12.32149568696919 -0.03369177177703573 -13.77440563200925 +276 12.181024630163146 -9.555885280212841 0.10177218452906026 +279 -7.313907636386912 -4.9611694584644965 13.648743623954019 +463 -11.305072696936113 12.880183991014789 -8.510142001665267 +19 -0.5478511888934423 -4.0604261523757375 -2.2082418581765877 +1701 -5.411651752539041 16.000130259680724 6.189593206555079 +577 -13.22803629033112 2.893600211052798 3.0315591213482818 +641 8.46578884036599 -6.8691835768139216 2.573217531358711 +1690 5.609018921254583 14.187467542040906 -6.254163410311717 +712 -8.22817090006651 13.96517036756481 -7.531424639355101 +713 16.596457633277005 9.114188126691003 5.5852084612046315 +763 11.795034365497933 5.075076239822221 -3.079411773182564 +814 14.285712167807665 15.144614576286573 1.6718563782086522 +856 9.315206508149728 13.88106175804641 -15.221115238135434 +884 -3.8442280365320234 -1.6662242219141634 -12.822000447632345 +1625 -4.38242857216274 -9.161854157083713 1.4310568533031833 +1444 -11.923673690358422 -4.633556527169508 -4.320512781359698 +1484 14.778240217886378 14.32504535193237 -6.372244336121571 +1542 9.002194240176264 17.437209815293976 16.28377979950024 +1850 2.369772445990787 11.28031084837863 6.86243399181127 +2239 5.047851542404767 -11.027251410598199 4.117474956132267 +2181 8.332689349496889 13.465990446112821 17.717282770656496 +2337 -6.302984744498765 7.1011570497699195 1.7209905178175766 +2368 1.8342708978239877 -13.692040111167064 14.638584749529098 +2417 -12.509684926064784 -16.275729371346735 16.442199130083274 +2474 6.325734106243411 -11.431370650204668 -7.521680084454015 +2545 11.290204012851147 -15.530706935720502 -3.7329484681030105 +2605 12.776739900140718 2.7225721207102884 15.340478781696005 +2742 17.33793891319145 1.242232848042931 -16.34536603641433 +2821 -1.5552184421046182 5.815443979777128 -11.903139458065402 +2854 14.380907162654113 -0.8377766285242719 -14.888504119686877 +2976 17.174278591493646 -5.88521385893619 5.727833595324623 +54 4.78750616901979 6.974529363402458 0.9251186095516816 +138 5.584592773067259 -4.594024061327044 -12.807229886701522 +178 13.241012537953104 3.1727212079519647 -9.920331241489972 +290 12.279888637977086 -9.889647445829272 -3.9086545273472315 +306 10.737478563292415 10.007130997265879 13.055271095391964 +1483 -8.48384081702046 -1.0707486274553368 -11.146632913986476 +371 -13.25654283962011 2.648423012810055 -5.061498893651252 +1322 17.872334817315846 7.63202438695891 -12.000819854203916 +1289 14.182824446702536 1.3929350274040144 8.152717851691964 +704 8.952203552253426 -5.672176564938712 12.691429144485928 +728 -11.230088081636543 10.517143378825853 11.310070509640815 +781 -4.101992174856327 14.646632583433147 2.2389595073181336 +929 10.554144660407442 9.42614488004147 -15.397573835598328 +935 -7.25353715128785 13.988574507153478 -6.528853245295371 +1096 15.054727972140773 -7.583250194737362 0.6509518307923962 +1056 13.256918918845454 -12.348203134770785 -11.653465866714885 +1165 11.502060653806033 -14.549062757772726 10.257902460079235 +1071 10.61684571935591 -15.721864722849698 14.603109712255119 +1248 8.220032724564966 1.3111786905288247 5.829754024397863 +1175 -9.87140524254519 -8.534635694903683 -0.9899405538906149 +1465 -2.037736551713561 9.089248269290977 -16.0781372498395 +1528 -10.000796214878628 18.117574203381206 6.805459240495145 +1564 19.43712276619144 8.504935057982705 0.8183859647470352 +1615 -7.063650763040234 -0.4872579739950892 -2.67486330787274 +1630 8.606027421221931 -17.317701614345822 -15.897221664763999 +1044 3.334057243369783 -4.09734675352194 -2.8231107780192297 +1034 14.518375803539044 2.0143135870732793 -14.66626618421513 +962 8.9738135068315 -2.1285724212346 -1.8839334185684455 +2078 10.347926602312588 -18.406026607265527 -4.233836354959299 +957 -9.197788336360075 0.16322949678386642 0.6604403522543286 +2326 -12.965382174626214 6.6530382473129555 -4.751388475387418 +2415 -2.8173691080196743 -3.725586385637208 9.847875288010156 +2481 -18.564566917844857 3.602255306353952 -14.786752472840803 +2634 -10.337374457580554 5.042299537848022 5.941719076564419 +2703 -16.187502546527636 17.233142758301955 -3.6782832664970186 +2899 -17.152364891580483 -12.489968143337308 -5.7374992946462635 +2905 -17.940917920754732 -18.45910000339234 5.201114106919247 +2921 1.986720907670749 0.9888081772667563 -3.614347379851922 +2965 5.815582378350527 -2.279517990133439 14.245403631231289 +2985 -10.981598807542065 -5.1621202826185515 8.924573321564838 +120 -13.570520760422891 -6.870128199645219 13.693759620424885 +793 8.31837989221172 0.5170417211983156 -3.471344449368975 +312 -8.897406458350353 0.40088763760348317 -5.43819839525291 +429 3.368433981100611 -12.82587359854934 -1.8602490840521744 +492 3.241122542213691 -11.743688774753993 -10.42699022420824 +769 16.048069277537888 12.594956026762707 13.885806518128152 +862 -6.170202508074384 9.977498940184146 -1.7296480477375595 +602 8.02477772932049 3.0264236392279114 -6.000735436295618 +1060 -15.305846589015392 7.154876463450534 0.20560865887408972 +1083 4.964881863286401 6.007653544698971 9.411144606904601 +1119 15.092005403758492 -2.2835612274486605 8.891218359427473 +1127 -14.935315464664207 -10.245459105929166 -15.102713887245976 +1143 13.800598815946662 3.123665306047551 -6.455052334706464 +1332 3.4007229613465824 15.149645432051605 17.544334170270474 +1552 5.744315086715471 14.91481124391563 -10.011608590859185 +2189 -19.29125737336826 18.338811913629257 1.8105110013986028 +1567 2.001973469909394 -17.012536284613773 17.923540729731183 +1810 -5.383226219287634 -15.761225825144837 2.0453116447969464 +1899 -1.3150299626737008 5.781892817917215 12.097821748350704 +2155 11.508830069993051 13.966336214967829 0.5287668505878785 +2197 -16.688917786590462 16.44705608862329 -7.388333656678107 +2233 8.771536134615593 -18.31735824762336 -3.3195736002629497 +2248 17.087695791047548 -10.940505777644447 11.909492831012559 +2322 -1.8033388831828494 -9.88441654755341 7.16195767339643 +2420 -17.396122563945692 5.942202516744806 2.104372448077328 +2437 12.497593788879822 14.276588846894349 2.272749510297842 +2530 10.700150983024017 -16.717268422795787 2.976627609666298 +2573 3.1306341300012717 -17.03574716247205 19.74854228960884 +2686 1.7787464545165343 -6.258817041912029 -2.5372510954620044 +1398 -13.774019303297207 15.86764929708589 13.584341502045033 +2950 -15.089573337513299 10.215727061383495 -13.578981020480297 +2970 -6.873899972242501 14.019454599004455 -8.1500718110257 +4 -7.763165743331771 -6.485801346352637 -5.678419527317921 +86 7.357036417175315 10.768225180048956 -11.899534123630064 +406 -3.4104162936919455 -3.4045209313195106 7.709684292329075 +416 2.398294113764864 -8.408642125490609 -13.60086408924663 +503 1.3098930626801897 8.35594265746151 7.499358784316063 +2390 0.9543556001166233 12.534083688696356 -6.823582739864747 +599 -11.778375128064873 1.6015104751166906 4.7881823662010286 +606 -6.553553659306519 8.087044057791779 5.810160068784854 +607 -12.568980303215595 2.5349285319254675 5.50375247999386 +659 10.160737346022739 2.0012570060269614 -5.236922270628705 +679 7.247384615841823 15.740454491761753 11.0078476168667 +867 12.636065893511422 15.663071346913293 -14.430559165033287 +887 -10.473506010029542 7.68683423914926 14.839184024523492 +1007 -14.14605820897759 12.961647016937553 -2.6638637075494374 +1055 -13.013477257684508 -13.460134446696356 2.17190199670243 +1065 -9.835509697116015 6.235592324235899 14.957886225661243 +1233 12.491085726516836 -16.718370142943417 -15.539982911548819 +1256 -7.8309521606419965 -2.0174211469001007 -9.504502827346228 +1257 -17.022307162140105 17.774049079126197 -5.4469859704955015 +1266 -8.35835343945182 -8.427612740969915 -3.9755728284050136 +1441 -12.458072642345272 -11.07457349028194 -7.364266840490241 +1470 -18.132238524970255 19.03637845563473 7.097633339419685 +1608 11.853775005381557 10.88852457429317 6.538317600885575 +1712 2.620307688412378 -10.820307591218905 -5.956761679765295 +1711 -3.571371002690321 -16.88913922966695 14.62764688372987 +1750 -10.121934858502051 -19.015457983050837 -17.56807778199241 +598 6.011596931390086 -10.901085656621639 10.619666561201223 +1913 -18.807282622766994 0.35375020974613597 -16.531467805832527 +2032 5.624494524972277 -0.06521878148740544 -3.3992404357966253 +2106 0.331228572284396 4.1751537435176 11.626750698327543 +2118 -11.723296207742129 -7.4891474215773 13.215976098065457 +2169 -7.908227245432755 -7.410026335928901 10.44129512905476 +2184 -17.17378911977087 19.36325438487275 13.878215906701836 +2195 -16.582353838696 4.588290020304915 18.043159347773724 +2213 6.572785806140764 -13.69384314993963 -15.665087901009365 +2254 2.0897010255908857 7.282656875400798 -4.8672007512461235 +2299 10.878258026729243 -1.9419003715840577 5.596445592554208 +2509 -12.987601347395836 -14.04739534014019 -0.47731759684190567 +2511 2.274558080835733 17.926401155859747 7.587900484176925 +2595 -17.644232346630684 -9.578522395431676 14.039015398850207 +2623 -5.249439457515736 -1.2094073517268076 9.997542599440106 +1872 4.684401884290136 -5.414134048589822 6.175646461744168 +2766 0.7089886746285097 3.919537112119708 -12.48251281436922 +2824 -12.425205114207813 -7.372344097654178 16.678312653919946 +2874 13.820246586752637 -17.53465842840151 -17.339296265417918 +2881 19.877418800779765 1.0791222001251688 -14.23444552214379 +2900 -1.725387501440322 6.874711509880575 -2.42600887946427 +2934 -6.455544641649785 -9.426567161339516 -18.788854992696415 +30 0.6330211800222708 12.241755974597448 -6.373629022730756 +72 -12.043794694665145 -8.683105441208209 -6.8728078787096125 +130 2.988912374982512 2.8026130398351383 -5.09115565754938 +186 -12.987858864033969 11.460972907424587 -2.47647058283685 +250 10.299964059754307 8.67778410112876 8.337669161805064 +275 5.808936893003587 -8.620586058612066 1.6561802401583092 +345 -12.920042268918422 -3.6537638546821034 -12.379027964727392 +445 -3.422082060956296 -2.2916138778062467 8.458567395756821 +571 -2.661085809524609 -0.7238573959671096 -7.968554856740497 +578 1.8403694852286299 -5.339397363360432 -5.316521144028325 +655 8.920574629723019 -14.125073969973588 8.531210446924026 +671 -0.4571542368349499 1.320839529186332 2.5516224213652605 +695 -7.520203213990777 11.470389171886273 11.52100534276588 +1246 -4.462365645416752 19.091545696763315 -6.339086750032514 +818 -7.320783226191258 -4.555598821901119 11.566828535307854 +1338 -8.874202790306773 -16.64966405955336 2.605506025498292 +854 -8.168612295042475 1.39373810218338 -14.686269680683488 +950 -10.574344177135178 13.086571276236675 4.400548078600546 +987 11.179785345947785 -3.5107249596903882 15.063411109797771 +1017 1.9868589057504888 11.799047224824944 9.66976344312305 +1134 -7.383620109282694 -14.38628581255775 -0.4055980204193815 +1138 -6.645446494945582 0.35146593993612063 -7.151981191803452 +476 -0.42482900153395153 7.273420373195069 10.394401786872823 +1225 -12.416714134435699 17.75648521511278 12.90133213512211 +863 -4.814731428086116 2.337485066311321 -10.642651602158004 +1150 -12.179020449487307 -15.285754623736143 -12.272004598468898 +341 3.38618981656808 3.9115138668368954 12.83056023789155 +737 -9.575743656172946 -9.127187390246073 12.24328375652267 +966 4.764057486430573 -1.5699253308574146 3.5743506298083414 +860 13.50481611298914 1.680610552569677 0.4816712218395186 +1051 -0.520833987828479 10.01997193074309 -7.195900623462515 +2074 7.529062322672078 -10.693684492498178 5.774439609839359 +1219 -2.89187091174107 -1.700679214302805 -16.273911511121344 +2838 4.823483202903097 -19.455766464598387 -10.351460967859298 +115 -0.21019882954535762 8.99549876014754 -3.845902200353916 +21 13.68734777576307 11.909679393012459 -10.222938841821685 +79 -11.403840504839646 -13.337715872840475 -13.002706386318906 +161 9.095984771426577 -1.6234776527064032 -1.4049728817578104 +432 1.4929426299662947 -13.66431156487506 -9.240187302648506 +523 10.550148559087525 -11.745424150830688 -11.42496202158127 +597 1.9975210502372358 -11.93147308546241 -11.646580853409493 +748 9.065412876451543 0.6747223149729721 -1.701522919159049 +768 -0.5293255013117084 -1.9132942910280601 -12.949323759283361 +830 10.990136809780436 13.264549502408164 -12.342225147499704 +899 11.844012207361551 10.84815887360384 16.384453380668575 +930 -0.2484831648013407 9.994223366873923 -14.90531067710027 +1039 1.2588417278318993 4.281021244836972 -8.834421620009278 +1117 2.3699945136139475 10.06686470986364 -3.7705672896545037 +2680 9.771161686996404 7.775639629099605 10.966177887944555 +1085 -13.77020946513657 -13.15315845495397 -4.434839978965407 +1210 6.4412525645118075 9.629251419042996 6.166586407726231 +1286 -5.749235114574539 -13.968185045200443 -1.7526580061385333 +1292 11.418015358161869 16.17135479195778 -16.323363170625285 +1310 13.170783654765234 1.795141359184334 -12.358368941868791 +2231 -1.7435604999275744 14.985306513817182 -0.9882845275614528 +1429 -1.5769532602541254 -6.744441507379027 -12.278947139875553 +1480 12.8660732960692 14.814099739445298 -17.369893610547663 +2794 12.065435401027502 1.6997401071341443 -8.853286680924512 +1535 -1.462875072124059 -9.890439653024055 -15.682330826931876 +1733 17.060073579434448 -4.870745490184179 6.932888215948449 +1764 -19.087174493042443 -0.6262048216467853 13.626822554120531 +1830 -7.298249444487255 15.107982758419926 -16.398837826489768 +1844 -0.622259989636185 8.839125656343219 12.957544756569687 +2716 -0.9486748886146356 9.807078661675039 16.239337822076997 +2011 -16.54934731343029 10.626644147544448 -5.267486655922867 +2044 -6.481867186312065 18.486695568501737 18.13067638193809 +2077 11.591413016365744 -9.010896705554437 -8.973522500238506 +2185 -12.105877480961878 -9.876904552150625 15.836996690823291 +2196 -10.639777693906009 17.64404102801868 4.316963119937418 +2312 -6.492379245651297 -1.4173954563846904 2.5204765581119486 +2327 -6.809396343650739 0.7273083135587944 -9.024028610646093 +2360 -17.46776760801781 16.78764654110448 -5.265894375926182 +2524 -15.973724872015334 4.436441625654566 13.473657665398534 +2394 14.163306300586473 -13.104366166115549 15.032890985337781 +2603 -12.395916397109502 14.566853304863269 -18.380326956178724 +2491 0.26615690973519046 7.92035330626672 13.20155054683913 +2706 14.623373125362084 -1.786688925354943 -11.697289985561703 +2748 12.457513302622464 6.925240050365715 -15.439325538575648 +2809 3.2751233238861484 -18.573265028226217 6.887647771566006 +2344 15.966368525269022 -5.244004392457888 4.454129285891405 +2848 9.30940171075248 7.194188232877135 -2.42481789527327 +2975 -16.97199565866248 1.1129914347202832 6.303464304294606 +2999 -9.617465715016388 -6.095439058130994 -0.1550577556630507 +2304 11.34591302521822 19.33114475244762 -16.279082821165254 +127 1.252204072503723 -3.494121834807273 -5.2825226738111475 +160 2.5741290812799673 -10.842205080890109 14.328215553822233 +2249 17.66946308817509 7.759836517048588 19.71443165335728 +206 -9.911116201660345 4.920055626086347 5.95856591486096 +297 8.076423216686386 -10.950222600686152 1.6613714543853761 +338 0.008236498812039469 -9.834641533328451 -8.984582606018147 +351 3.5710806139364677 12.836813637379946 -5.054833527947395 +391 7.962797821884166 -5.194646234389264 5.025226041721682 +448 -5.650724909689699 5.004945895155795 -3.883871940338499 +455 11.64213377171001 3.560500108588524 0.5575553973411285 +471 4.532581941812945 4.074119090551347 13.392644614039835 +507 -12.64029233919896 -6.035180306780229 -9.415472891809715 +1193 11.073808836258873 13.616588948464303 -13.573195594570857 +2125 -11.289341734623788 -3.9185161882236126 -18.89546584482139 +2117 11.180727074982808 -13.437540785991843 -19.223739994646337 +739 -2.41915761150994 16.093446092313215 -6.916162449993978 +844 10.914676792288363 -12.547756023471988 2.138856672421085 +925 7.900166424315585 1.2218346758938297 6.067964493028035 +938 -0.8410084596209307 -9.024738958726974 1.2113604937696612 +2713 9.16470663102151 5.271382683301022 15.225932609799818 +2035 -5.147192815906983 -7.243095019048723 -5.841687278630253 +1000 15.385137944893216 -12.685876007057262 2.165208367957041 +1003 3.0742984039534043 11.386469020079074 6.998723496153639 +1064 5.965786553060681 -10.175840120368006 10.627068643906162 +1933 -2.897285868274245 -14.32380852257051 17.81601141246972 +1113 5.613147279209409 13.669724796542912 -3.308302950818256 +1139 -14.493963019523749 -14.404264187954476 -8.305051308698001 +1180 1.639341774853737 -9.05113211252336 15.364227756039353 +1215 14.16610482233708 -5.26263367602964 4.895940874645635 +1669 7.545815163263039 -3.4798506870433243 -14.532631119110727 +1318 2.4531165184449986 1.0953239798849075 -16.282291107033988 +1349 15.466729970006444 -15.362372196811492 3.5713831627415917 +1381 -17.17176617863507 14.169803481830773 10.410157217230967 +1924 6.132118753613845 -12.503728786032035 -1.854485630537775 +1555 -6.881322466343166 6.84866396636438 -9.083824459795766 +1717 -15.611173785803244 -16.27897370229534 1.1077514492986051 +1729 -17.72074573956905 -2.1693726213535496 -15.806466760389396 +1771 -0.6091933652970525 -6.708254510270772 8.020574672559546 +1829 -3.4139431764385377 3.067824233182004 17.425392378449228 +1847 -17.049491576600808 -7.99115646554834 2.449827143023259 +1848 -4.03220128963364 -1.8453025506368255 -16.990925788145084 +1873 -14.63698224405252 13.467855810934886 9.875446762751336 +1887 -2.8483565247909954 -15.021806619998083 5.275737095111708 +1925 3.7026821222880146 -4.915671037448587 -3.4633557813128037 +1954 -5.362997738713992 10.674666596818117 17.98536683853667 +1713 -2.724172391305148 -5.089271460633415 18.31102468133376 +2025 -6.218925756667966 8.931752915547785 2.022987311647463 +2061 -9.135600066979817 18.857857577911226 -14.633043057028646 +2174 8.720866680681494 -7.6723739251634395 -9.216109026894648 +2260 -1.097791650232216 11.955110788667247 -17.75151557362396 +2272 -11.79057552649214 -1.6550030533447329 6.737896835550758 +2354 -2.0890056315206706 9.65632054400013 -9.198901306521037 +2462 -9.872750184159257 14.570971021785185 11.633118778025912 +2479 -18.159825932549268 -13.501932428451914 -4.0494427938149276 +1115 4.893442581470929 15.075952312785237 -7.9782984934880945 +2639 -15.658230902211246 15.88554484883683 0.8106992008962184 +2641 2.6927681725699113 -7.960650100025258 5.661019048222223 +2717 7.931310959513231 8.699272443751466 14.025955070993385 +2732 7.2623462705144295 13.80722272002381 -8.56620775023465 +2584 -0.9241279702135445 -8.75611206760269 1.1524271630954817 +826 -8.10539796364611 -15.127701468950573 -4.240550157808712 +2813 -15.418968534948954 0.28682646886506447 -4.721126194369761 +2866 -14.524470182704228 -16.000035155942484 -13.934808686383839 +52 12.146504523998743 1.803062811016986 12.059021006205436 +58 0.24223794070575466 7.606936988999289 10.277872804892121 +174 11.136446284787244 11.356072335557322 9.074735232987985 +221 -4.146535804452931 -9.39630581520203 6.1469178758724405 +1611 -17.80256164664207 -5.493532763481266 4.284212742872213 +1582 1.2772764259323024 -7.965734390858622 -1.4046118433311823 +384 11.134146537651773 0.872716153361043 9.236873400497128 +637 -7.968122005079272 3.3563185734075205 12.936285680492636 +638 -8.858340158329595 16.18211890155745 12.092232495410485 +1402 15.246719453285325 10.258017649431883 -8.275473994451131 +1069 0.08442451969616095 14.174738631067616 16.221056221095587 +991 3.3072680512809605 3.3993049277656455 16.098138477655375 +1530 -2.380137379738002 15.732849805449632 -17.98842780167858 +1324 -13.085649403349052 -15.834123704939945 -8.165654327187898 +1329 7.823961228877557 7.351387980464024 13.698827446719154 +1376 10.02757163866361 6.025214335690628 -13.664799135963575 +1452 -2.822429672977679 -10.392456490032615 12.613565208798864 +1637 -12.11274641388907 -7.74399254226054 2.073493166545623 +1720 6.6529474539303814 1.020203788598291 14.542398828028775 +1870 -3.9793332318327215 -14.731374255834316 -12.555339954554414 +2024 6.546319281916396 11.799555079986671 -6.243799017170584 +2036 10.873181437680033 -8.878087376844634 -10.84942150146178 +2043 3.54860031973676 -7.829036737940283 -16.31549101643455 +2057 12.495502608476356 18.323142378256513 12.803787998510852 +2211 1.7353694221341138 9.370828582361007 13.279475830118761 +2283 16.20693523165451 1.0793048711147615 -11.164294200094258 +1575 3.3219829497577984 -14.863984451447163 -7.332610992807368 +2442 0.008009001196596546 19.653960034619303 0.6402496469617517 +2448 12.66547322824069 13.928700972176987 -4.91839757663743 +2671 19.80619085759646 18.934780862722427 -15.153140124351808 +2688 13.65405100926734 11.113895989052988 -7.367504053676238 +2801 19.397476043687668 8.443853667903394 -6.75795021587273 +25 -2.3852545504941878 -12.629384271541467 4.822080871935362 +45 -0.8239508081593372 3.3347702456013817 9.462427863265843 +71 -5.76818960435224 2.570397356327344 7.480507012290893 +274 5.852770407101528 -4.2915566290131375 0.43399875874773985 +344 -9.27728249830797 10.072404735191492 11.539721389364196 +368 8.433836538213686 -3.793733425739516 1.3058808587193775 +450 4.85428557851828 2.596307859084065 -7.737575933657066 +478 8.127213345848782 -2.3753394773577363 9.707111915635723 +502 6.804454989280364 -9.033332574337008 -5.925004334612382 +1366 2.4796942805234483 16.664522935996505 2.6258709116045758 +730 9.941313831304436 8.786970302964734 -1.053517489007285 +843 -9.339913510677441 -1.733858996556381 -5.203150064133093 +858 -15.363005426102427 -5.332591999432311 -1.6933173656638434 +921 -7.134144227821443 -6.5203746016501025 12.439523242585484 +1075 -2.0534966680303324 14.927681282507551 -15.081087443760065 +1177 12.460826028833193 13.037685744851569 0.17892765716301878 +1305 -14.832785523904993 14.816027412066193 15.028500128838466 +1312 10.284626715132495 15.117401584174639 -14.868723656642707 +1341 11.104765837916064 3.2516927224540093 11.454308353369658 +979 -13.832200450508125 -8.766842467608724 -12.877042903709071 +1496 -14.725831175856845 9.518716726899136 -9.517923551249755 +1524 -13.05470562393772 -5.271316579882739 15.734466105238512 +965 6.798133390063085 -14.767845945624009 -4.890310811645898 +1550 -15.945143532765513 14.486739528589853 6.903225250542357 +1648 13.526114482588085 16.500933572916693 -3.308974302705091 +701 -14.174117351474317 -0.8857578074375698 -6.5789616507236195 +1854 2.6977103271591987 -3.283903062615301 -13.454803438986186 +2022 4.133208826939882 19.430500724656007 7.489794044319656 +2250 16.229700409818836 -8.23657144505939 -6.972363397081858 +2788 8.189136524659062 -8.451959686743075 17.94855785848054 +2343 4.463561180939536 6.253309115928192 18.20098279387178 +2380 17.952546143438337 -16.012007506408715 -19.188990110309916 +2389 6.134391181454379 -13.504056642574145 -0.5580869738035119 +2510 -13.310515840227868 6.5588611956792695 19.328830185708373 +457 -4.530899805024797 9.351539009623949 8.401858938973106 +2629 -18.470734876940238 12.916463894247773 -7.815169910921925 +366 -8.213613061658831 0.17098498872900797 -10.328350490469578 +210 3.4349712512009476 6.894761955992158 12.362010599145655 +2758 12.293525928858172 -5.698970738052874 0.47416048915277587 +2895 -8.833276038576711 4.924868536766943 -8.069987473088405 +7 -11.107540793233575 8.916606530569538 -5.868390306947158 +55 6.691549729640551 8.825555466556189 13.103542620655174 +100 4.867589459473769 0.8466836889507992 -5.763347087953402 +169 7.010658762681105 -8.091265635259687 -3.2995443452554944 +269 4.290653058025112 -5.761505728015522 -1.2313371459822906 +270 -12.177147734524624 3.531867531383094 -1.8057729924923194 +393 -5.989725641820701 -2.5445864562171785 10.191024512175867 +485 -4.784595299397293 -1.0660524399581048 -12.867898791746494 +592 -2.175378036608953 -6.296555856857829 -8.069290958883947 +850 11.203110192616759 -3.84082966688219 -7.39926502293587 +931 1.1556653635587029 3.0785787094070094 -12.219776949689924 +1519 3.189785383618792 -2.7061919228884572 15.459746567044679 +1099 16.392305465954617 10.998235325100786 -11.560843682376726 +1243 13.027256855387611 19.507623708335043 10.326035848598652 +760 -12.16171775390682 13.953448215711902 -8.370229494900856 +1291 19.154271494479776 -3.0206573394943876 -17.895485627105305 +1362 18.780250352833473 -18.3103734046697 -3.504385795352695 +1409 -11.832093727793554 6.0229939770211685 -11.789344721143182 +1423 14.294568464964115 -1.790433525510826 3.7532603392947204 +1454 17.976833464261652 0.25476784707196015 5.171933342553823 +1660 -3.714906617143173 0.6751881501012098 16.4319033229726 +1684 -10.692302949309337 -2.9014299428858408 -12.88478201971924 +1731 -18.1179121661536 -14.53166691969287 12.518939920627625 +1801 5.502896931666044 -5.71879571448935 -19.180037899520823 +1964 15.083136514442534 4.431144586721924 2.832369469306072 +2120 -14.272119053036025 -7.58103664180214 -2.6382678971961897 +2207 11.261194549305808 6.416532699012663 17.988163626473312 +2289 -10.555268133451472 -12.145611591407025 -18.704271717772205 +2783 -15.786504975094163 15.599443387710412 13.045218454514117 +2625 1.9822293804572166 3.8857554442553393 7.644333975273417 +2705 10.422406906740774 18.400750172822498 -15.404776192638034 +2765 3.276704306716028 7.998313393580437 -9.086029433147585 +5 4.892142486265433 -9.018003878087072 -1.8120517746456675 +726 -14.223328260929067 -10.576007445435476 -12.325618107217531 +29 -8.637712216169643 -1.034542194721038 9.691902282187364 +91 4.757028006895669 1.760949168728751 8.467383158694341 +179 5.540083118148262 7.881541653262636 5.925461602742017 +240 -7.953642549705426 3.378821226063465 -10.722079448695174 +326 6.631552295772764 -13.654028222066303 -5.419008257685228 +329 -12.712239273663785 -4.002069140787071 -7.299235414717009 +360 -13.67686812175262 8.533381044263194 3.8459698549113184 +403 -11.915143159807887 12.757702708441954 -10.753001777899486 +409 -12.16664760743454 10.996539992605696 -5.527653096913381 +410 3.6590851681883283 -1.0008210042837955 13.074071488217642 +553 11.611864825371404 1.8632096210205336 8.880675484955395 +562 -1.516649582976253 -5.265547640839569 -3.537967375859087 +644 -12.371123838419503 -7.073290357770409 5.220073381425719 +733 -12.159809395008985 13.33133598897175 -1.5223530458603687 +902 -5.3972420484639985 -11.844345031091098 -11.548475006994288 +2150 15.859107730164597 -5.09714938203693 3.485867369662406 +1102 -14.493961131597088 -14.372533804591344 1.8530983119167945 +1245 7.0924382140583475 19.25316564793227 5.6888750509609745 +1258 -18.19577004969654 9.473651835743679 16.93690224700435 +1303 -4.721254075026647 18.379214779780717 14.58009867820328 +1361 -5.481645420934154 15.40722271503714 -3.7797762282989855 +1377 -18.770096930562186 -1.7546820624714674 16.732761055777175 +1445 -15.790782713920034 -17.10349048634139 17.784152617299156 +1481 -12.580063720168996 15.851577863635239 17.822917503767858 +1574 17.151722128029785 6.9385304279601545 11.9669378291783 +1580 -17.819058813550026 -8.41025897870813 13.33795149856077 +1656 -3.880886471669438 -6.243624232377942 17.650163309554387 +1800 -8.770046489491724 9.41229055333782 4.656415734188409 +1849 7.462470671043341 6.698081182908369 7.617801201104785 +1945 -7.551418496332446 -7.0578337843918 11.595100380598696 +2019 -17.18570677296906 15.028369944879376 17.304395031538903 +2039 4.608904634092047 19.07332676133123 0.9994460221527991 +2042 5.0022537315874 6.470793629953207 -10.680911793347335 +2108 -12.145170049149236 -3.9857143462292206 -11.69725284544143 +2235 -12.14287807483754 -4.657524661966554 -15.222728591297136 +2324 -8.928555357878228 10.479274504636281 -12.948652952217875 +2406 16.29868881287499 14.653864120100842 -6.131390437140203 +2428 -8.414509283054596 -11.606334435190314 -8.66132140817414 +2435 -5.98148644916691 1.8858917008905989 -15.645256208325094 +2506 9.890357637694764 12.257831823967804 14.181012883054215 +2589 13.605522852085734 18.554632258255253 -15.848056102815535 +2613 -7.792068827303236 -14.786621453162864 -0.462443717824663 +2655 -3.0089039751403597 -9.024247146114883 1.8037584347647082 +2685 -9.122292223490978 7.364647660425885 1.396133131303076 +2730 -18.97102822986138 -8.207088157532459 18.23697919919821 +2914 -5.036255860671751 15.20225071665758 0.24183337776464076 +31 10.43113139147764 -12.10389159199254 -8.12954597083199 +141 8.403448096213257 -7.499387501503938 0.9178946442589941 +162 -0.9495908555840938 4.33953745038972 -4.511515440484206 +184 -6.460069407583937 7.734534902667127 14.010469623929938 +202 4.569610263230631 6.702250837632602 -11.964048375461823 +247 -2.2357972337599588 -7.696221122927996 -11.550991564525464 +266 -8.118032259459017 0.9933739137707476 9.000290104640417 +323 2.1956736099474905 -5.4636850242072645 -9.75068664770224 +435 -10.735168451223304 13.972907650099783 -8.961641970525436 +481 -8.282983218430818 -10.824989009032283 -6.174697891724899 +484 11.143112148936233 10.715275393067033 -0.4347983724854141 +567 10.21964682801289 10.873778557634934 -12.479034225145341 +589 -11.72952938089305 5.665659406525205 2.3415077329121905 +609 2.51813783478826 15.0232467597328 -11.011222632330798 +711 -14.130099488800312 -13.083244968059175 -6.451273756074345 +722 -6.618539276990125 -5.161525000778912 -3.809490597463556 +809 -3.2071299351770963 14.482192420506959 -15.05124008453702 +849 3.0030713311845285 -8.674534988464499 1.8274486053685892 +870 12.763680478750496 2.551990760460331 -1.994474539063993 +918 -7.19502578222678 -16.18375258779478 0.5821163652452851 +951 0.6099621419612307 -13.703404317372845 0.5227133771437089 +956 6.663514977548321 11.413510509205567 3.7424281270471407 +986 -1.0871329515323789 6.740253771159556 -4.131233235950011 +1050 0.35405831175624314 1.1797508266049304 -14.621385828336903 +137 14.15282932732007 4.416805640793059 -1.6157598187929405 +1280 -13.940486925319506 0.7509286087724054 -3.967952679511937 +1380 -10.516611491726428 10.468204722970055 -3.033360554519652 +1488 13.936297709173513 12.478450051610228 -1.2255795087376327 +1505 -18.077006274943184 6.692262922995436 -11.783648010714781 +1541 8.418356750919617 3.136170979064411 -9.661526747946034 +1959 12.270478303273036 -1.1301882234611584 8.870663898593069 +1694 -10.857229466223032 7.883202929114854 15.903522913788061 +1705 -8.624887459393445 19.132709926255046 19.226734586672297 +1708 -17.328373527615597 8.002601517039448 -15.401583602348385 +1748 0.8956139098598191 5.0880598526609235 -8.82512131102175 +1797 -12.664852734933916 1.7514193160728468 -2.5273186410071165 +1820 18.297984431028926 -10.798048686733392 15.411442856643971 +1833 -16.053070130684528 3.443446634156279 -18.7585711758842 +1843 -14.92597494035018 16.302408113880244 -8.519445674212074 +1897 -6.822467895671674 16.191868932070744 14.913609128719951 +1949 12.817719743079563 -14.003613909337611 -9.31023897354041 +1960 12.580007752267939 -11.54074109539399 -3.6386914785200393 +2005 4.845634464917176 0.10329105438175337 6.847945804273999 +2009 -10.913448329400897 3.645311236389401 3.379857329704218 +2027 -10.449745276967766 -2.3089784278173306 -10.579901653108923 +2034 14.111940437458571 -14.163931163943976 0.556220352976502 +2076 -17.310258037000075 -1.0745282871547324 3.714671663077243 +2079 -9.161919381272916 7.632390550218395 -5.846713952087843 +2147 -1.2280057879432345 18.255362334032395 10.222239323307411 +2199 -12.293303446235882 14.68972545219379 8.694679462950825 +2252 16.68232751185814 -4.379246516228977 -2.1716192955879206 +2345 15.467524202809422 -2.013701477164017 13.818963854615392 +2376 8.357334493021963 -3.4463306243308036 0.13674687663013343 +2382 -12.07568267268361 -11.90205526047025 -1.3273651930895094 +2454 -2.733872423434884 -11.345621175503874 -16.472093967002795 +2468 -6.149372586524903 2.1212063380025836 -19.20743007964698 +2483 0.4603061310616785 17.96544263128311 -2.5234058061442655 +2519 -1.8842259587369092 2.4022946494203667 1.8811112309226032 +2557 -16.334869543088164 9.596453626728419 3.6364069902759395 +2624 -17.39259215369228 -13.108237498947194 -10.839577343764576 +2692 17.428537172036663 -4.600711064096134 -0.9891309207888732 +2727 -12.33708129990648 -15.610254886367954 -8.132587538198772 +2954 15.102734854017312 -18.91676533156547 -4.947632308243963 +2997 -6.0690025342962635 -18.85511588927804 12.175957334139381 +3 7.943371814833405 6.33438034711538 2.3052807013945276 +242 6.908159450235451 -12.519080567564323 -0.4241653441828667 +522 -8.742953580220199 4.7889693966327185 -0.06516646869185728 +632 6.34373476269815 -1.0049239513266348 -14.954428408239258 +820 4.211587783433961 -1.2925603421004976 -10.266015181819244 +846 -7.416531345095582 -11.695122333524964 11.548986060180168 +890 9.01729713193656 9.390909819663973 13.628870631499547 +969 -15.101016945301396 -16.03872524389602 -14.135831432447945 +1079 -13.83315482788484 7.888837184672594 9.529066272170445 +1238 -1.748835181785358 4.7197736748543715 -6.1133452663691115 +1263 10.364269040011855 -18.08983420244289 18.953864224953268 +1309 -14.364569116453005 6.331650405056235 2.3202617072458995 +1450 17.37148102271738 16.282151636773683 3.7671467473795244 +1500 12.583155810914606 2.175658006730349 -5.477752937383389 +1556 -1.4250467737104924 -1.1985893746008316 -4.149828706272645 +1683 -17.66861022729518 11.825685572813262 1.8081456228786776 +1754 -15.21143065615202 0.19694646526966306 13.193533701310052 +1857 -10.831791823708947 4.2904123669494645 -10.872693902339934 +1914 8.54733263519565 15.217616524324386 -15.85619517310406 +1980 5.967158272197042 -2.289937317801365 -4.100146194001461 +1440 -15.653415553300412 18.431068848420814 -15.348088852925871 +2037 -6.696438746864549 17.940554023775505 10.297016109924217 +2163 0.8682745654330182 15.911968940245648 13.79715521249217 +2408 17.2859760522875 -9.851073771881838 18.85167237186592 +2485 -15.90612994437103 3.9067359438244953 7.526387082408669 +2591 -1.7440489426985228 6.7760488625022015 -14.542175326991373 +2631 4.888926430911099 -16.956065361386226 -12.795216894991198 +2665 8.210097021490219 -8.90609259708872 -11.216887274999763 +2667 17.20430063889795 -10.813956575900125 -16.794314934247407 +2820 14.925989566053651 -10.805104634310432 14.401199646527902 +2830 2.133542482858122 -0.5413997097879688 -11.19549761358471 +2903 5.742183481070529 18.28193774177398 -13.441153632630732 +102 -10.315651817614999 -5.503006127645555 5.423382032202676 +168 1.1398043805141282 -5.306652220309757 9.829713559590871 +215 -12.580871947389873 6.746057501278323 -8.086294496361038 +224 -0.2510462506785556 -1.4832540582695393 -10.82051076678393 +235 -2.8962446278969867 -9.448968471554181 -5.7310358020388765 +296 12.394596891710792 2.554386249341277 -8.101722789818462 +612 -8.49916326851098 4.126564879616485 10.889465936955007 +616 -4.724468771441727 15.370545043389221 6.160791136778356 +790 -1.8850541158116076 1.3983370458498297 -2.783623924102371 +861 -14.410320880142345 -14.554537181751787 16.336959312132244 +990 -4.857174501097595 8.306561862266546 0.6091747086847781 +1008 -12.145218980128476 -3.0147628961102804 13.24325690674273 +1188 2.429519364336341 -3.071876103227978 1.5226913385317047 +1201 6.360986267361178 -6.843637329928738 5.8368338803569975 +1302 -0.19717806311775357 -19.132066097771773 -17.74953327673772 +1411 -5.255662663369024 11.776239589268732 -6.177025789592655 +1624 -10.617601994240314 -1.5792004146294263 -12.616899165512786 +1155 1.1432235310182177 -9.855899462202222 -6.9538263127934705 +1958 -3.886973929014326 9.023547889295429 16.293230764690726 +2126 18.557179763961923 -4.927593618328581 -7.881059769408221 +2132 -15.8603541712378 -10.60029645397489 7.626300174671831 +2152 3.714801865192244 2.815735091929785 13.409633171734306 +2208 5.679676147631464 -13.260228486108453 -17.80563135695933 +2278 -14.526343669075935 -8.294698032872173 -4.080360456512691 +2336 9.170676298520576 -11.975483377078287 18.743001292479487 +2340 -13.25687508541853 6.659508111016609 -13.591456925275013 +2451 -18.277707488003415 4.1069162461658815 1.3567873076508787 +2471 -16.67187435877837 -10.648233252838512 -14.187026878147337 +2604 14.838492680632669 7.969599846452851 17.834677434646927 +2616 -18.873866663864945 17.873426076110285 18.675254300224804 +2770 -1.1318853316082238 -12.3550760842858 -11.801972015273359 +2907 8.193232596282382 -17.995329058454338 0.3878937721184806 +118 -8.364600224554819 -2.305808676966615 -4.765470703472142 +334 4.4116703547784475 0.044638303511329185 6.968449252299167 +358 2.733204264104319 -13.272530097363617 12.17185295505997 +381 10.658834624974851 12.15767410482964 -11.11291802853828 +382 -10.466867097860572 -11.813768087778517 -5.173259434695347 +411 0.7301290344677116 10.560818068281625 -4.897615066355333 +444 11.635566770217789 5.8628817233330945 -6.825296665909813 +1536 13.732320664502472 -5.9707759357229975 17.827844218287492 +794 -14.675454311803067 8.686207409322032 5.611340639590794 +1092 -4.565898050697635 -0.5951696737822965 5.646667508014709 +1306 -1.4390842243679651 -1.9678871403579898 -0.039928894518725146 +1343 14.191172852214422 -15.067503823982532 -18.08974139586283 +1392 15.34913146424533 7.003692668601207 9.744084256171597 +1553 4.130046259007896 5.4702440642312045 -13.11077932307103 +1557 -8.194180511091545 7.3152141420912535 -6.379535498376787 +1614 11.705309738050662 -15.206801394824053 -7.682660185265888 +2167 -11.83788786031631 -12.972946188165418 -10.193826233723716 +2180 -15.354747572786081 -17.756094486967566 -15.67798820696223 +825 -8.337606213197008 5.656275055676178 -10.945080309388414 +2320 -16.651765803379334 13.772076759574286 -11.369026439377977 +2325 -14.759116443656678 -1.204463171312775 14.708337673292014 +2439 14.129568434338154 7.758654384434167 -0.1536711972563994 +2480 -6.308120447478964 -0.8285577936481624 -16.71963664651469 +2569 11.128313878713872 7.093388687158541 -11.262812174384964 +2593 8.587183965998383 18.71754959504086 17.98506575717836 +2700 14.010965393265018 13.241494260644316 7.140060552008796 +2701 7.552310431903999 -11.892938355604818 -4.8716354093614855 +2761 -9.099897022976865 -8.169443022876663 -15.342626371639286 +2855 -9.242907857568124 18.2148594906923 -4.227664962767661 +2925 -2.4800338821390833 -17.120718008695587 2.592342417080961 +2973 17.413979230425838 -14.117900282898614 -9.663213365673284 +2990 16.268246543716725 12.519939818362555 -9.381476005559046 +2747 16.507797673132806 1.774446957170662 -7.431980434012686 +140 -12.107358608385546 -6.599034241847654 6.673892695137238 +201 -2.199833709196224 5.204363823417576 -4.317528557259669 +2674 -11.945172344794743 -13.22423848676837 -0.817051034203779 +245 -10.385937185233544 -3.712434899820673 -12.565996281404402 +252 -0.10087108113594324 -12.653632682772818 -8.362051762523368 +348 9.845941971645075 11.59040255448325 3.8735754121569834 +425 -9.99041747105373 -3.9771646577097 -11.256997187887126 +489 -9.826767283354775 14.147629405998279 -1.9364586425808208 +501 2.8400904446213406 8.5483886631465 2.5625751139041273 +608 3.5909100764505886 -3.030610563569388 8.45871170329795 +645 9.39773295900155 -5.02058835241966 10.807942340564445 +715 -5.003559888498215 0.19987252414319567 -4.702303051222863 +741 -8.012692040625483 6.273436270878346 -2.9169070091360454 +792 16.001516705846388 14.887488953028708 -3.979664317528013 +897 -8.065748321730531 -2.6541742482313007 -7.780779617384079 +964 12.383344924951462 -14.047118509293488 10.892629188523124 +1005 3.143462932072194 -3.217714905410296 2.6024597644117975 +1265 -15.96960012858418 -4.62504067172961 -17.96662069261192 +1346 -6.025942954126146 -0.6271582733240971 -2.3978397864241474 +1430 -7.411006685381373 1.262118526218981 4.329046489249654 +1436 11.391431190097071 0.49449042331352483 -2.6920527228209785 +1578 -10.827920071111812 -9.023086877807136 -17.88863468934204 +1753 0.5407131226531857 -2.390039724299218 -1.2213215901430214 +1560 -4.688420438389605 -17.681192847494348 -10.98285589748325 +1662 3.596295333679797 9.92061115467185 3.9218415717980357 +1700 -13.065240551370662 13.633270916624916 7.3025254546019776 +1903 -14.298653488015935 16.77098551965116 -10.936523935079585 +1604 -8.146967862445228 16.957748492714263 -7.453041455552673 +2627 12.736027283561109 -15.252991001975564 -0.13093613270310553 +2598 -4.79082509432825 -14.303252022644694 10.571902514024517 +2636 -10.719344497499035 12.927540501665835 -17.615741897545462 +2745 15.69131304693078 -3.3247652799643856 5.248315878164249 +2816 16.22412391657581 15.618374336662017 17.673496904940293 +2931 -10.97431118591748 -0.258131355438166 7.340002683062928 +2955 -12.865599081909348 -1.5924930735580356 -0.8684823442463252 +50 13.808479045930847 -8.537119322604592 -3.9430838640297687 +109 10.848841200834725 -5.610112712729593 8.066617637428571 +190 -10.706808326750219 11.757122967438377 -10.905836414558879 +229 7.945911904341159 -7.311323143333409 6.844242969178564 +2618 -12.560131886040036 -1.8912890825459383 -6.026116136576891 +2487 -12.183646739235018 15.617939112854568 10.358690373127407 +441 -10.121518011129428 -10.24141566636925 -0.6934131792656747 +520 -11.910586400648496 4.837672129402697 1.5953394108938557 +541 -11.937814438174858 -2.0880517980182494 -6.829816290906897 +563 8.304711572300219 -5.023003413419765 -11.528756058373306 +579 2.9235829292549544 3.3818817185225916 12.547123388235297 +624 -12.44216959410301 8.609002110209925 15.857887371256705 +761 10.736246468582825 -3.4033860520881256 -11.861981291375606 +773 13.344266738529578 -15.608907726139686 -15.986759723112318 +2449 8.166264160290131 -0.9375619113219398 -6.679781486861239 +833 14.742981539910236 -15.761501057927372 2.3532305162082463 +878 11.481725278101226 3.329180221463233 14.56460767091975 +2395 -6.0280041851746375 3.9227540670582806 2.391826265848531 +1030 -9.075363341777946 -2.081600592797798 2.8699817734765007 +1033 -5.645572323848203 -0.4560549050997143 -10.356231279756178 +1927 3.9432184595530444 0.8972244185618253 -14.334699609987878 +1221 -14.582108126988654 -4.895400434320846 -15.51253216501187 +2010 -11.030860130773608 -10.043705814732489 -4.887220882132764 +1383 -17.94938698146815 -4.026513124237729 8.072091468756081 +1388 13.47029757224015 19.018663092781804 -16.293312122901018 +2693 7.107914511301633 5.012135408951659 8.482498156586042 +1523 19.603574072111766 -15.845591552042677 -4.940647720799733 +1592 17.705927532019654 -6.470616945705083 4.306819943207994 +1633 -15.705594319670132 3.709039065358274 16.241869354727122 +1702 -15.392177641507088 19.438124249923657 18.039315500456148 +1777 -15.678127293532555 -4.968923509182337 2.961870954724002 +1879 5.335112359305261 -3.7764781692740925 16.7561642957326 +1893 6.8996518070124795 -7.080126635129749 -10.34363882051355 +1156 13.609166006383683 -10.08934319227428 -6.9345709072638675 +1975 3.949119723528382 -17.49929966510069 -10.959900054534405 +1984 -0.47814513531245434 1.0100827864369943 1.2108057927072688 +2084 5.331025248762562 5.917500084356077 18.053839587067905 +2159 -2.805780532712712 -4.921514063525255 15.911972665289074 +2187 11.753057332183628 3.4265617499436094 11.001360440994153 +2203 -5.6269089361373785 3.930722183289508 18.732888046854363 +2378 -13.901847420976743 -16.116305633206387 -8.441591440803803 +2460 -4.0219416918589 13.815666959821472 15.777062811831048 +2493 2.6563712197153984 7.4041244326593905 -1.3991396709370458 +2529 -15.477529415784849 -4.120333429959384 -1.0448838990280536 +2588 -14.028677500583967 7.866787890236983 14.367122500261951 +2610 -9.822746551290425 -7.264467944596312 -12.319243805358777 +2711 5.5425349668493 -5.803722120323272 3.603694428605922 +2789 6.306917224000265 -14.142529931602017 7.509529172691217 +1999 -14.49704960453033 13.734373916289348 -17.95235237093653 +212 10.476278977463258 -13.857749869881305 7.187515599076229 +287 10.113123568019603 -4.847534960480137 8.04616443989734 +361 -0.24647840767347595 -9.216998442794416 5.7370761016199685 +469 3.4950468097846263 2.5188938210118157 -13.084593326715638 +595 -2.1920389586429376 -4.631733245677558 1.2898689778316594 +1946 -14.459426315930537 18.980624254600432 10.669318293650086 +1141 -8.23485306422501 -0.2542619761920154 13.499801931651994 +1144 -6.342941524613262 -16.00793242927225 12.960500608455403 +1262 3.4599860368397373 -7.8344316369834415 10.591508482380757 +1917 10.269646325185564 -1.4998768195095027 -11.988003446596455 +1581 0.45145168912973377 -13.272095201677313 17.9086155115698 +1136 -8.09798232475525 11.419240701571324 1.9620705501332345 +1824 -16.78799260717584 -2.5965054490393538 16.888251646055227 +2045 10.117180327748947 -16.449428530674407 -2.6359013323825016 +2090 -7.900168642363044 10.451847739484121 -3.5940239957768454 +2110 -9.908723465882545 -2.1366363155575003 -14.309691259812404 +2430 16.76109818457816 -13.043317572496246 -17.13500550992261 +2607 -5.57369692614645 -3.174545064385207 -17.546988088644586 +2626 17.18285960183741 -18.436263300839144 -2.912651805507061 +2793 -5.135096032349833 0.10243336398752613 -7.567256651487599 +2812 6.315726130502188 16.3296939290821 18.950002126962335 +2873 18.176311608447133 -17.716004054093233 -8.15946661889428 +2932 -2.620234167785995 17.307458040141682 -8.83806370302737 +131 -12.105365509941846 -1.269522622204203 3.965006881624604 +1772 -8.609397839158618 5.115599206216999 -16.287476962864563 +180 -7.3296318488487975 12.446930931012556 5.445604762419093 +1489 -8.388223330992385 -0.941586422055041 4.066311766731952 +392 -11.10746892531578 10.124490624941464 13.723958784445067 +408 -9.652288244001426 -11.075018164005135 -11.30911089874563 +449 -2.603555364250931 8.461542915123815 7.70777212563438 +1239 -8.492000090804387 18.568427175714536 -19.15501379901424 +543 7.776424714279205 -10.86464022743446 3.4511285901405384 +734 13.426941513425875 0.6782246016285828 -8.230391543731251 +1035 -2.8192701105782154 -5.9377800903376015 -4.664591944581242 +817 -16.03947473064111 3.4210841258335956 -10.209682266970013 +1026 -0.880166311866974 -13.232757203538856 -1.7190983135653002 +1107 14.230716498816616 6.317612079932701 -12.459789355167908 +967 10.467034947860615 -16.007184094730057 -7.158140963610276 +1244 16.570286317882353 -6.190510192001573 8.898320749984192 +1482 11.092694477546894 -3.6665481401890934 -16.91492034794748 +1561 -15.326046052852229 -5.685919827543497 -15.337322014186627 +1616 11.559004638668505 -4.99618464947382 15.100156944594893 +1765 -4.427516495667969 16.905866938560095 -17.17982553179369 +1783 6.934267293390322 -13.192985668705148 14.93976871311986 +1874 7.772876955388822 11.024500048066932 18.68279611722785 +1978 16.69547212132451 -18.61593064936134 -4.7190403431629155 +2146 9.76622821972763 3.2449003876028804 14.874604227645982 +2564 15.99957728624616 4.193325336703003 3.492536786228503 +2574 1.6318253036553452 -6.4021775046527125 17.970851110733303 +2702 10.237558119050954 7.895958689734763 -4.868543781796825 +955 -6.168218723461462 10.623066706838786 -6.71106782663822 +2946 -8.566833107745792 15.026633758323301 -11.875692416415145 +2982 -2.8946296835251175 -8.874334016365543 13.040285498264197 +182 8.860462350447651 11.708836187130744 -5.5754292595345945 +300 5.818945290854342 -9.42040692278001 -4.561482256341947 +940 9.015797767989115 -15.808900044996063 -9.579939801933653 +727 3.2849920544477427 -11.338471398225224 -10.264385337779299 +893 2.7462063940577996 -9.944703878204873 4.521764175886899 +894 10.74309542497159 13.619323305726018 -0.31275331956407804 +953 6.944845145172327 -1.175894528693473 -11.217702613224118 +996 13.702961445789319 -3.0726037923786387 -10.70758021663667 +1043 -7.841528772937672 5.775256700409939 -5.670490855053661 +865 -4.928970783754255 11.374747492459976 6.170410138332788 +1226 -8.7149685854092 -5.5259172692977625 8.70013949864718 +1360 -12.952273591989044 -8.189148804165473 6.199510658956468 +1422 7.924826951537728 17.30161811667948 10.589410384972089 +1424 -6.130089527332295 12.667401608920484 -0.15158415975578474 +1591 -17.928939328558215 -13.100013818537006 9.796751593066976 +800 12.89116817704781 -12.691678656221177 2.727784538216562 +1826 10.295373313874991 -0.22962621274959158 16.109664981086954 +2224 -18.062744341003466 11.23445121340134 -19.233022195860325 +2226 -17.97353523216052 -17.955936786838453 -3.827580910538202 +2262 15.39718203780663 -8.463791507024487 15.056267250797985 +2300 9.796629808134991 4.695103308898721 10.375062413418856 +2644 0.47046808773398235 -7.207664439348257 1.744727161073816 +636 -8.052143039161027 -2.8614916616249655 6.296777306482152 +558 14.007644918359746 -13.207078322707174 13.648566584113452 +27 6.088247036713229 9.775007945850705 -0.9846925777399428 +87 8.068566803223527 -2.1504940527887615 14.10597687923888 +94 -2.213538759780814 0.2115300373049879 -4.931573241218711 +117 -10.520667901202888 13.5164296178912 9.01091185234262 +128 10.965993396633689 -8.427732574031968 3.5678943597927204 +286 13.341053663296316 -5.5457205668381055 -8.265849386127435 +386 7.635860353893008 -7.176355652809565 -6.405151611043321 +434 -8.75441595563689 9.320283233743556 -9.881075657352538 +546 -0.14029141450635846 0.8526785278998231 10.486429357366942 +654 16.472603462988555 -12.661137879806423 -7.107789822579373 +795 13.550596172497036 -13.595534643550659 15.213809056934545 +824 15.401910605064096 7.645021703191567 -1.2902031393333322 +883 8.467878105268392 -4.450808584838506 7.197730819725946 +1020 14.04999966754842 9.728549668459125 -0.7448294218387695 +1022 -7.197942324411125 0.18972336537744017 -11.799713313667656 +1049 -11.022115664268602 7.448238250647428 -6.343767553809725 +1088 14.03884789792485 -14.219741281315883 -13.139080592404964 +1140 -5.474585592528256 -3.9212812102093464 13.679455631832766 +1478 -12.653564583961018 -4.493740144436577 -6.007922533079422 +1812 12.802281772250323 0.881568370436692 -3.1147424423296597 +1898 -11.95401716862183 -5.107102258995298 -7.02004538004412 +1929 -9.944426290877422 -14.298677418366063 9.071231480223009 +1994 -15.901334105430012 6.124355880737789 6.500200430814176 +2140 1.5803262836146608 -9.699710735638641 15.26375530525667 +2154 -17.77661083169464 -0.46143423848621967 0.22141109329066466 +2348 -9.62964584939874 -14.841844760359992 12.031973957666489 +2432 3.8329229424834756 -10.767470066794505 19.83701472827256 +2546 -17.239058053848346 -19.400111200464337 -15.585978404538546 +2571 -9.171202495020573 8.383188082915076 -7.345850232015071 +2661 -7.745584435275727 -17.383896094821054 8.16979958766742 +2695 3.3335788435847755 -15.936909763450323 -11.197946525436567 +2729 -5.01422863023378 -6.516313036398453 -19.039947464676825 +2880 -14.300256134395086 -10.164692174737457 -0.2677997207435715 +2901 0.4019676529312668 17.296205003464316 -2.002738277524109 +2992 -9.148492707649874 -1.8636413017394708 -11.666134991107652 +2994 -12.213948131445669 15.851733669633655 -18.751473653273266 +243 4.91374783971842 -12.087249401001925 -10.109181227889811 +246 -10.268831226779026 -7.307165809245157 -7.788924780461087 +343 6.481096501621047 -7.200107402818182 -11.241899074978477 +394 -4.830848646556496 10.271771717114028 10.24980964878167 +474 1.1253369187497826 5.055163219043113 -4.936127075292196 +497 -0.7945678742761515 -9.859150605129692 1.6188564850643175 +513 -6.072398485903261 -11.770874693666734 11.52366731116099 +539 4.2819273693696704 -11.571685341848738 7.248326403579992 +554 -0.10470085807085436 7.484788143095296 13.622276121879677 +640 -11.903552659545637 4.379459522203887 10.82269494966029 +682 14.388334121102051 7.02907179086914 11.03999106031263 +709 12.687565502959789 -1.572298667821185 -3.618423497564743 +832 -3.358441867195202 -11.033131858266088 -11.679072211850785 +1006 -8.848528633931558 -15.09099187695129 -8.484541657547098 +1067 -3.948063150182388 -13.94026753938137 8.462368251831888 +1076 -10.493431842676214 -0.2476328262321252 -5.8676755833641945 +1133 5.760603806160536 7.083156337319274 4.5537570115061055 +1149 -9.761330181105839 10.526509443883581 5.246024821284683 +1213 -0.3095620959924757 12.487599424423555 -4.224160924737243 +1261 -5.324585966273329 -10.020057723743363 0.6360186481103347 +1294 15.813760701849779 16.615797178774507 6.745543301914807 +1317 4.638965646683966 14.799471952507545 11.132049333471105 +1529 -11.489704324690628 -0.8126262151074161 15.8842684534006 +1659 10.123802621076447 16.46541027979559 -12.453623202995791 +2675 -1.0291020106988504 -9.368794746093823 11.559586304067638 +1989 13.340124589797542 -13.182411338068437 -3.3025691376384727 +2072 -18.693296308526588 -4.3363723994014745 12.939255921058663 +2073 1.58174049179144 14.06888609151434 -0.4084512177877912 +2107 7.978170311624776 12.403951934524851 0.8612889541397825 +2129 -13.550383454570564 11.98519189525053 17.505371902769458 +2182 -0.6242491670262806 14.600043833417729 -9.2494295549954 +2223 -7.021958286058973 -5.236203653151981 17.98208708303109 +2259 12.490898766619008 19.33241742665255 5.110752541056751 +2276 11.186244217036087 0.9030205586586506 4.694981852573619 +2377 -0.4938467371182775 11.464419242751857 4.92343500303314 +2431 15.881986245010449 -12.508176091864032 1.7856903958999064 +2526 -13.892753201698287 19.15117006258616 15.942065324548585 +2528 -10.746491498079367 -12.208849955567244 15.853173868675352 +2537 6.701823359442057 -0.5759262971359115 -3.588512584434999 +2648 8.061550812423002 2.8312162438521793 -0.7498044754124391 +2764 19.428815333441232 -13.539019457516575 -0.2827791251541446 +2771 13.7333077339201 10.61889976631786 -17.848234214028786 +2829 15.575510443928954 10.032014688371353 -4.984051015901109 +2845 7.070220045075763 -1.4303972908334177 19.156780412734314 +2859 16.695176387413497 15.606692080648733 17.294932951688345 +2894 -16.70625740458039 -0.6287454613829163 10.11931308137501 +2939 15.923912567869383 -13.326874104978296 -1.3208931028037045 +2972 -6.46176757374297 3.563680865661692 3.174006543152036 +170 -12.614044152982537 12.590676578100435 -1.111782064256543 +288 2.1781388217789215 9.68256338665305 -5.433233212776059 +299 -7.542566822061701 11.04756444344787 6.985474498373441 +439 10.564142353690073 -1.8996696548423513 4.437544619219586 +504 -5.0554954276235415 9.211508090464417 -7.112803713575126 +575 -9.194340113461994 -4.339629340253714 9.362264723801198 +1379 18.735567776783416 14.570022370034964 -4.310871187886037 +1393 -5.227507075827184 14.670928536187285 6.319092720900287 +1451 -7.899364280436356 -15.222263931059627 6.789651310266364 +1474 -1.1881682729002285 -17.66992864140489 -17.63045701395521 +1497 -7.426278374325694 18.942000445836754 -11.392674439113735 +1629 1.394900081121298 9.283909750517138 2.576504208985093 +1796 -9.758361205312664 16.648432448842875 6.544211327332821 +1892 8.706974140370443 -6.006163498586369 10.964413759607577 +1990 4.630195741870993 -15.01725052190223 3.464032647326967 +2007 8.647232386216588 8.932761320002562 18.97124098306347 +2030 11.638318852942325 -4.524952811018421 18.103106239496068 +2105 9.406958203069602 0.7192065658972778 11.581988731848401 +2220 -7.115263667282643 -5.698842983339401 2.621333958465067 +2269 13.166412052726304 6.707671035723071 12.022367168226912 +2374 -7.303496348820194 5.309306779499018 -13.665166321260767 +2645 -18.354781048859007 2.1013238354437007 -0.6354474352442133 +2760 -10.11126403655532 3.556956186056681 7.731384138962739 +2862 -8.734684185560273 15.851194143227993 11.373728619154868 +70 -0.6993286906291821 13.39014922587603 -0.7465924739967591 +420 -1.7069107724795485 8.222947671727242 -2.436346484291507 +924 1.8737020933188886 6.334713604747465 13.398336424787727 +1059 -3.133319021621936 12.578008078691594 -9.391154931312087 +2425 -3.5257695964903033 4.866265898390417 -13.178966357310925 +2206 9.480250644171933 17.561564428319613 -10.111457988272342 +2271 -9.81592070820302 -10.121590891778727 18.661056663407315 +786 1.1528645330083143 -11.2990801282081 -2.1333146144176434 +494 0.39694274349901637 -11.939377362774884 -3.6513000259653166 +1275 -6.326624531431515 1.7174837950321147 15.013717813449434 +2424 11.556631759121835 -5.684148617945258 14.43139770342603 +2068 7.708847899056253 -6.900240278527317 -4.856381478322337 +1665 -0.007267232165389344 -1.9355586458580158 -5.397237847053612 +907 11.702427284573048 -14.664822396833708 -6.256238097310716 +1721 -19.194951873456123 -9.161599103923603 5.717735315251648 +1921 -15.576603743602048 16.037409559589157 5.654425609209294 +566 -0.3458024409929771 11.553608974488606 5.190742762151839 +1016 -12.082787544512346 0.0015683771254084917 -2.618279261603792 +1259 13.182851565757142 8.655408538156003 -17.720299968683705 +736 -8.80010100088741 14.130631350705949 -5.78019991754976 +841 2.2358442155594034 11.419920674898192 13.390382254817295 +2633 -6.563218905759018 -16.22888571481427 -19.309939549202692 +259 7.151785972556724 -2.3197388411130198 -13.5417881230235 +697 -1.4839993890881846 6.569683205866268 6.328495479222858 +1146 16.20576377193383 14.59840529899311 9.080495491700239 +622 6.6533351399743506 3.8004815171098856 -9.378270516996926 +1588 -1.8581027479289876 10.331850401718834 17.647893947826976 +1775 -15.404794861265573 3.3456246310432154 -16.746029456269383 +2144 -9.409729232392024 -2.8473845341469195 -5.983116509868738 +1118 -8.545096691609514 -15.870772014862004 -3.1933302117690476 +2482 15.597050071126949 19.311325853485368 3.361885471887985 +2657 15.716402302341232 -12.77289789294439 -18.582069680415195 +149 -8.761528269220092 2.457604535415645 -0.9393411670464221 +1078 15.493353291996634 7.814950510447619 10.159941036445945 +490 -4.218199215456702 -2.5980158392345682 13.595189695238608 +239 -1.9523242468316617 -3.8412029134350067 -7.795968977581958 +1859 -4.441116295178436 -15.700850571868223 -2.246393417606417 +2176 -0.49305763275451164 -14.466126287841186 16.655707424656885 +2750 -3.847760824258749 1.796815785461781 15.783713503206286 +2543 14.169799105386529 17.634158963672924 -4.998802049636014 +2060 -0.5092779369477036 -12.729620856001274 3.300683919375316 +292 -10.470778829668705 6.947237183857842 -7.078640218668448 +729 -6.884130469964869 10.385625185489124 -8.490889978416417 +123 7.647205752107495 -13.673705327410609 1.8898093041877682 +744 -3.742891350211823 1.312651180184073 -4.286358368739132 +840 -8.584247129175852 12.741728484804135 -4.19790810646247 +886 12.804540266429482 2.6685376040373896 -4.945687902722988 +2230 -4.4251233031218575 17.935231488652192 -0.7727865628295668 +1589 8.94848270925566 16.147028797957628 5.9529039652274855 +241 -4.9019398819000894 -1.4818759099484968 12.342028064988456 +1337 15.365436980832403 6.699351940792594 -10.217593611113875 +2316 -17.578404175420324 -0.6090808901145381 -12.11544076260748 +527 7.112846612504373 -8.898202997326544 11.718282589409762 +2266 17.486473660835806 -10.68770812700199 -11.359853212934576 +2924 15.753500062801823 -16.359198990182943 -14.675894616023884 +303 8.958800144489341 2.5309991512973746 -6.809764682748036 +2828 16.65943098359769 2.7290287344250883 6.277717769134021 +1077 -8.463748976902567 10.808359933230024 1.401666972377779 +1816 -4.310329706847026 -12.37992454031203 1.6932758482932713 +2677 1.8176520901781346 -18.653182208246278 -3.717629363909321 +1333 -7.08770549728234 -12.844950657059217 -14.58917641383218 +1072 -14.93332919834124 -9.55818123856331 -5.676375689928116 +1845 -4.581981653613005 7.5494471347963 11.072115655236269 +427 -7.659537701885546 -11.255932025071985 -9.731030096661124 +1944 17.819084426158856 14.092219376638802 -0.17615385499722067 +36 -5.259094405468257 -4.288747785760595 -8.694760543055965 +114 6.8942594551364875 7.380147116854856 1.3671713641944259 +864 6.949349936109253 9.144326302745656 -11.016870151779132 +257 1.4346920101792757 -6.785190998031536 4.640117036198736 +380 14.123234003342901 14.041086181965776 10.17518615577884 +430 9.053624411915159 -9.36169187018311 -3.6348805874806285 +517 -6.785534403071378 2.3321769305527797 3.6359481754399874 +547 2.3834539199778764 -4.311333790659128 6.06117005818798 +614 5.221507673186424 3.258811135234941 8.92378344997746 +631 -2.6628715408069565 6.980964237519824 -12.80205273635173 +610 -8.098812083747235 -2.5265186767134598 12.492896406090216 +823 7.354376784397804 15.683319162406667 -1.084526395107473 +852 7.369506933149863 8.408527456542524 14.158106123532049 +107 -12.077018030234731 -3.697827886536448 7.586124597480009 +913 13.714766696865672 -0.8371502884782636 -7.029896069695645 +1254 16.199246058714813 -10.573557009181204 -13.28012204666933 +1068 -1.4180514007899918 3.29691496107213 -4.5832201588093895 +1237 -8.941081561528703 -4.083517386892669 -9.366009235167253 +1316 12.27420164139446 -16.93808956142455 14.972895054056137 +1413 9.893337698893216 -16.04232475845451 -19.2217518027926 +1420 -8.913625230285708 -12.941229054721422 13.36674211828193 +1431 -9.568842617832 -11.94051870056718 18.498980828668667 +1491 16.92454553916861 -9.495209038860718 3.3377866805204053 +193 -7.782994048071663 -1.7181920260976755 12.334707178351625 +1631 7.820085880897775 -18.588562943388148 -15.066276920560313 +1642 -15.685438367272395 -10.267072137515054 3.5251590618174418 +1743 -15.63205191734556 -14.440527382377354 15.773263258897702 +1747 14.116267288846437 19.36443753952488 -5.4295264273309645 +1762 9.34400175706067 0.8218279485819886 11.84657432815353 +1991 -7.245109451653379 6.792323152187167 -15.371346598513323 +1818 6.480016447193471 -5.147556081026763 18.546974040363622 +1996 -3.594631047862615 -15.890492716407483 -14.927088324489382 +2003 -18.618916875570022 -8.417965015270008 1.4016627203155827 +2048 1.266245591203011 2.604139175912801 -15.510895809639036 +2096 14.828864045137088 2.913213361860916 5.619967863401242 +2245 12.514536564228365 -14.510366449318495 17.77874235118903 +1476 1.6291264123305698 -12.569421427742077 -8.546082823981616 +565 -13.729946127186164 -10.32534464465142 -2.8630549859494177 +2396 0.97262034473882 5.96546597479302 1.1630861403552037 +2413 -8.213510784776117 -4.0245150952710596 2.4599417391982077 +2433 -0.7467558263722274 -6.3322060290763975 18.190763949850638 +1503 -13.773179772322965 -9.215376191262889 3.325747569091051 +2570 -17.388483251845592 16.75705326587489 -9.937777718391594 +2578 3.9961058448170395 -11.664010614635423 1.8006949679890327 +2817 8.134134616380381 7.763509611066274 3.0620776638200664 +2912 18.71776116056373 -10.354618427508804 -17.72350168431003 +2978 2.4474292436147214 -16.10465894775547 -8.660861929221802 +2984 -9.510740850934978 -15.249686772317016 16.210229166121984 +43 1.2249386122415553 -11.04880968287854 6.649422541407198 +44 -8.507510713707678 -9.880416360044315 10.395734642271778 +46 2.9401299041084537 -0.19805115507945797 12.518337644087708 +97 -8.395784512909755 8.781241490702289 0.699392458669073 +992 1.5637598338399867 -4.216706044488424 -14.444800465733971 +110 7.913102645506185 4.633342089953609 3.976625073612838 +1307 8.78618306650969 -7.304509337911342 -19.01355752027785 +195 -0.37008448415373796 -2.1957754975261756 13.61007111568477 +316 11.033235979712257 -5.021395717998631 -12.67671303899194 +347 8.218264042586773 6.81504872169748 -3.459103780642201 +385 -13.375540082541706 2.6248298077042267 -7.2335821764085475 +442 -13.375588615357152 1.8091387784696706 1.5038302889215172 +542 5.12206238396486 -3.837950781939744 -9.474382783985172 +440 -1.1277697219797465 -4.452314155975574 2.7576597700631647 +2930 18.804410010196687 -4.189237825166094 16.669623033819054 +2533 17.74405486771611 7.24715294624413 -13.68639950140249 +743 14.786166568098828 -9.260537192171853 -5.64562206500774 +831 -14.262332186251516 -12.196975885398478 12.438597184108659 +1794 -2.5724252513905603 -2.221558122221736 8.551339313209583 +916 11.977821293122854 3.7603478960600634 2.709865175753158 +920 9.202988680402484 -8.497656494797276 -0.7026285972230693 +1073 2.515338176579429 0.6652914666254408 3.2737100175025264 +1087 -4.554643160692905 -7.60963470061163 14.949164720080308 +1671 -9.240173888449165 -14.221366671759572 15.063204806256987 +1198 13.687470200613232 -1.866759685090254 -15.543807107875937 +1209 -10.539306788062486 -18.234437645542958 18.571195531008154 +1223 16.365338629399705 -1.7603241486345218 0.2922640581392598 +1247 -0.8059264987061932 18.204890936405523 -14.997066571065512 +1354 18.129017835557764 10.471029014671439 5.241487498233247 +1358 -7.110258420115571 0.03830100884378384 11.964882474846629 +1382 19.449316314818706 17.476793974489492 15.29335966775062 +1532 2.661408953081043 13.68726396418199 13.324156581101487 +1403 -15.457608349553166 17.148846146704102 -9.50262178519575 +1590 4.26004575054961 -4.437565648645635 -2.515713512339425 +1594 1.9956496480939099 -5.717941820235182 -4.828637169704507 +1798 -17.01122398447963 8.083903156638723 18.472305680997206 +157 10.932573516278516 -6.745783230725227 -9.077392013935178 +993 -7.977564987923156 8.12760702990445 0.9381276892631076 +1673 5.268994422154075 -17.61601584205855 -12.957557565250864 +1738 17.604878828108447 19.69680960429115 15.33856081843333 +1752 -9.854311455867983 10.926496834018147 17.649725640156706 +1755 3.1889327851624283 -17.035814178944605 18.622196435421017 +1123 -6.869699950292232 -8.64783245829943 -7.125730028362106 +1890 -8.94830105338966 -7.842449376795514 -6.583576821919378 +1902 14.6185954823424 -3.6984900124247577 -5.059650999139505 +706 0.024545286869555646 -11.33852080404788 -11.09474899917738 +1969 18.220032939782357 11.63400539383134 -5.932771589408205 +2054 4.505538167667697 6.286118752929773 -18.262786706566953 +2301 17.506287230601437 8.774778344768725 -10.31611142114852 +2310 -13.203761957575827 -2.1076714019058187 2.187341615199521 +2405 -9.386834054681405 -9.978358475762288 -3.999126837173004 +2466 -15.813922012637427 -14.075458305514765 -1.8153057785090467 +2561 -12.290373410133089 -14.451202912997811 -6.878289589507331 +2581 7.523249848222601 9.19512515233638 -0.2913796637183982 +2663 -18.093841061057496 -1.8988292934897266 -15.175373751654725 +2668 19.68719604756912 17.833159925752913 8.20344897465132 +2733 -2.692020253061783 -13.410600018020402 2.446499004982619 +2810 -1.9028526507130445 2.887663185694936 7.3214053381695425 +309 1.6157729684180155 -5.554869632164958 6.976773207295493 +2850 -13.659022358019875 -11.029820046867252 0.13942775454030923 +1565 11.451716102540585 -5.3155730209606755 16.583889783966864 +2983 14.285873971933437 8.85331239750872 16.235968090751783 +2986 17.19616047356903 9.146375030465459 3.4187960720872783 +2988 0.9940534427564559 13.45434120556763 17.893609789688252 +62 -6.424412400542199 -12.685014066826382 -0.5875890016864738 +143 10.940558476117426 -13.385032836325687 8.627412103161086 +230 -1.7058763020767629 -2.559202192291208 -10.107700294935837 +302 6.9799526799620555 11.03298665478873 -12.675468106690813 +2469 -11.953712820392994 0.00807842304066916 13.523176323124353 +387 -12.336119752323706 7.696087127567358 -12.474420157912792 +694 -7.787657105443593 -4.288833962778096 15.745485303182809 +544 11.420950567809856 4.375590078579221 9.886634144129022 +617 -4.774660626273361 -10.806453543828127 5.378932711345248 +1968 -5.885243804573801 12.522093908837073 -12.370699972818429 +816 12.262661953793353 -15.220000954856925 13.885200904751317 +1675 -18.893963429328995 -6.34873049899169 14.815156090325031 +1121 -7.927686452790892 -3.6572587929372036 4.461792434653988 +1031 8.055547203689676 -2.9654242014260803 -7.614707326635697 +1204 -19.090927798769517 14.678030968229354 8.110600334778985 +1340 -5.155266749542309 13.830392661621763 -11.079225037493368 +1460 -5.23160864090318 -15.071053123682866 0.6432236854379959 +1472 -19.201556463630467 -2.5858784469593448 -0.4688372572123537 +1597 8.778499460025365 -18.8638158027587 -16.464420818154302 +1607 2.874356367961168 -13.063610806458943 -5.466185569358864 +1736 3.7808495190003484 15.474020617525442 -17.70508370703436 +1839 8.465850094922102 17.49635218083357 -8.729069458967874 +2067 -5.074325633744453 2.451935842167082 13.147163704503122 +933 -9.942114627553822 12.801038705670747 11.751967317118186 +2241 15.95172725108366 -16.161764191386073 11.396872681298001 +2314 17.746066201423655 1.8586159965617808 -3.7517479939558016 +129 2.108666457520993 -3.0312118272692308 0.34165109466027654 +2720 14.659887521299622 -15.177597561607508 12.829893816427063 +2744 18.563313687521166 -19.413808075306367 -10.631218440176179 +2831 16.562708090785968 -15.978705283733333 -8.180849618813562 +2837 -10.18790153407249 8.880280304231439 -0.8306944893249093 +576 9.607880339995864 10.414696582473841 -10.1024556814948 +9 4.256817579365978 -11.06451707937572 -3.828345073973263 +67 -3.6786970009326465 -5.439339744099672 5.061521189701674 +75 5.139161281865819 1.858287003134529 10.651718445775668 +220 -8.654830396027009 -7.054851821139852 7.578184760042488 +258 -4.880922313310085 13.738472298602009 -5.527445284644423 +423 10.018499596834836 10.411534984354853 -6.902447420016746 +431 13.257011419916468 -9.61900887012736 9.586365589396316 +526 -3.611858105942792 -8.817788595018412 11.155433847652125 +572 -7.249639432812499 4.791758918577924 -9.518658982944885 +668 4.475241506899801 15.989039880848404 3.9072534879126883 +813 5.989501043431795 -3.9572031257108904 -1.5339741936370068 +1029 -12.151154712896655 -4.68892286276313 -5.889111087428858 +1108 4.285943120226897 5.953376673333026 12.66497379568629 +912 -12.93373345847637 -13.738010287091985 7.426384316530359 +1189 -10.291838790390964 -12.446826231022515 -1.7209332108007913 +1222 6.447783768728602 1.8201329734923468 15.745467008863505 +1359 7.9706652697285385 3.8457805016419866 2.0668572034637833 +646 -10.610010674429976 2.1659552515725173 16.390871905004232 +1508 -6.238937236735438 -13.857011999254714 -14.5323582715441 +1566 -1.7512062727660398 4.061870134953308 -11.06577496650709 +1650 10.115471480701556 -5.9769982837946385 -8.365114676966856 +1679 0.7203007339835018 -1.9237941705612769 -3.6368143967656783 +1779 -12.71153408822825 1.0383659461855703 6.249600818267668 +1811 16.861747618508424 -6.728252119826496 -14.535068551289045 +1814 -4.078729191266423 0.02070615518700772 -9.400664927778495 +1836 -14.998908062195534 5.499129003432253 2.042122960151397 +1852 -4.86155844426369 11.86503535686158 -3.1214176078578606 +1458 7.692800903257225 -2.250940666031757 -14.964803632984221 +2221 17.392198055566013 11.736119572052898 -14.19277140533992 +2347 -6.804044698703424 12.28635979824874 -15.85861681844993 +847 -13.026199949765997 1.580881298772952 -8.176985980969011 +2492 -18.844034697223606 9.749995975876704 -2.516820652937041 +2521 -17.104299352467034 11.487096288414563 -5.873684267899445 +244 -13.59031885676441 -1.5948063279504794 1.6095855892537128 +2650 -4.376433718734446 13.207602267459531 -13.780352891034235 +2683 -1.8395682218532836 8.297449576868969 1.7889138298275211 +2785 -6.15944515139912 -10.396301213382516 -12.811677560552445 +2902 -18.819133715759463 -2.8624568527355305 15.047582978144389 +2948 -15.291311024563925 -9.789637971976685 -6.80844807697596 +2952 15.693608306363677 -3.941362563633687 -10.944271637928725 +83 -6.533583519127488 11.596594830172304 -4.726822776418071 +177 -3.2757318544179808 6.75733605537726 12.46140070267905 +2669 7.903236769974542 7.172639735851888 -11.853204246970972 +518 -9.019104827908148 11.316446905132214 -9.03451367811316 +685 -1.9706413525346305 1.5532592417482856 -14.678295276402329 +714 -0.6062230683783465 13.505304928828313 12.43849930120146 +914 10.244870437686854 10.102419027774358 5.264649826787439 +1062 -6.295330100119756 -0.5043263122128026 -4.256265061393067 +1091 2.188063303972576 -6.9322550195675605 -11.199713701978618 +1178 -2.060977653543948 -12.717541576680162 -6.90361672058637 +1242 -15.432759035745288 3.668015019288569 -6.967889208008011 +1279 -8.799012260925053 -7.099159057825198 -16.677386483707778 +1371 8.888437647161352 -13.204765511068851 12.921070968380363 +1386 11.849621626643913 19.468733275484347 -16.217107914619923 +882 -7.7691855701079815 11.899158418365026 -7.948218310277356 +1577 -2.7150553039329823 -8.630474286234946 -3.6766002989044417 +1795 15.135793630960835 -12.000217255377203 -5.029065553448785 +1734 13.78586720933596 -7.453516084469952 -15.016502297140715 +1769 10.845653125781338 -1.2301545894398358 14.035921508202053 +1926 6.607633003067497 -15.912342988316624 9.765617422631223 +1939 -14.147111996688688 16.18236305060414 11.920349609070087 +997 -5.341166257045596 15.136275101800276 -7.7060904220767465 +2013 17.725151185270494 3.0771426619826 17.26813494048387 +2028 15.926056693476244 -16.48357760284404 11.315981298585033 +977 2.242000302864197 -15.89832088427819 -8.46457537150419 +2349 -1.020437576527185 18.675282659865132 13.079092562039014 +2384 4.183368795076655 0.22258860657866947 13.037754385379555 +2577 -13.146467691721307 -18.988509495044564 4.231911842996415 +2778 -16.786450023762697 -15.863328596695547 10.497023377631548 +802 14.015383390358727 -16.23691727243059 -10.16743229536031 +2851 5.370645726798052 5.537490696025236 19.698729212020485 +2893 14.76528742299695 -7.407465492697368 14.288364749018669 +37 12.537753520939834 -13.902623730787798 13.54187128184789 +96 0.277974803904371 -11.470469551850984 -9.896020445915305 +207 13.853157385175965 9.990886355618668 -6.451975756580101 +254 -6.096395103641281 7.445379837992924 -0.8377474900540064 +402 3.305098197846772 -6.907613647716517 3.38270020609383 +472 2.9748092372584547 -8.880871299315158 -6.841302093244776 +237 -6.775733883074466 -1.9614470231582044 8.379590509208308 +877 10.273959383275376 8.561824193262957 7.640242588862162 +742 -14.576959792491964 -3.4073178877343775 -12.552542552481096 +812 8.796602433567932 -5.188160494322363 6.270372535846724 +1908 18.902939920427766 5.696015387745538 18.8976880318497 +1152 8.534595149626389 5.201948367452092 4.026922825157323 +1158 14.038874496375444 -13.772701122159505 12.903723345706561 +1183 -11.758289644543982 -6.377564049054543 -6.840135765225024 +1249 11.709186564334988 10.75799539345873 7.543639370926607 +1278 -16.644769517253486 13.779589959521514 -2.6737426435261695 +1504 -19.01408759102342 12.761657667719115 16.28909317278553 +1559 16.70217265528867 15.613898541528915 -18.358169324679647 +1369 -12.188015074403413 -18.60764749000669 16.916951213167025 +1691 15.551831582304553 3.991613091091035 -16.085233987671483 +673 7.451368057331642 11.020632225366278 5.208956629796635 +1774 -5.305383100539437 -0.8216739134194933 -18.60132936049523 +1851 5.452399307821566 7.8141369241956 -8.291167164445865 +1863 13.208021908909297 0.5701176000552144 14.197184457949552 +1909 6.777554072253678 18.05344161097871 -12.859411813443195 +2971 14.946692144368985 -15.59407404013055 -10.53226283298914 +2138 14.062533054088183 17.69267312278503 -1.3768941624457722 +2227 -0.8125925936497376 -15.446121634971549 6.943388613107411 +2386 15.878658471983275 9.947987785224312 -6.275399601814546 +2426 -5.52728117490142 -6.925465337198187 2.309305736778702 +2478 -15.10599730097044 8.529331244072573 18.914859853148826 +2553 -0.7004741445736492 -12.336431488399105 -11.98642952677716 +2575 -10.940617887813493 17.322813864690165 14.089144048831507 +2640 -0.16065622090548956 6.795197377730847 -6.257260458326362 +2690 -6.51370342365036 -7.075651935037049 -13.52339950731727 +2945 -1.4991287206914012 7.882850034094899 9.972416313413422 +13 2.063838112525206 4.088129766703488 -4.646366609654701 +40 1.577407554817761 -2.48701576805761 -8.115706917208854 +51 -11.881069516194673 -6.104941480641003 1.1852228228531532 +710 -1.7446004112719813 7.898933207438018 15.733419777056131 +77 0.9006295897162229 2.977269919164659 0.8436471756400712 +146 -6.241115525768944 -2.380277428990028 11.220440602624867 +185 -7.414507361318954 -5.631110973129233 -6.829217815707537 +227 -2.3325686246245754 -0.360339813667418 -10.891730574737528 +271 -4.927004221577964 -0.21082402144906326 -4.9757699644138835 +308 -6.296975851927239 -11.664479691476002 -3.0791419818879895 +390 1.3407529550732757 -8.18323044101815 0.3151310722094361 +397 0.7417094626787384 8.013617545525111 0.41396289096145367 +350 7.605007544667583 9.481864244531353 1.6355559841280924 +495 -9.188045879509565 -11.226414996331414 7.497275244314924 +506 -3.63841161603629 -4.406729958288604 8.341934356796404 +822 -8.125668129755098 3.8465191872554882 12.371146497540943 +876 5.428982210798833 -8.177959044215815 10.324786799099588 +908 0.14612366814670244 4.883519512234402 14.320789707728677 +1224 -12.64908946410283 -7.666445832698271 12.0312958903994 +1227 7.6670656470127705 -3.6601440701628762 12.332239437870083 +1230 -0.1796384177478708 1.3055956270433928 -9.618748830417774 +1235 1.85704580359721 16.348598067794548 -16.065341684501007 +1368 15.975880940476689 -2.1409322868060525 -8.126034889440788 +166 6.393017823331323 5.391724534465972 -10.21737741403159 +1510 -16.315601850962523 -19.30864796920623 -6.891330973165215 +1545 11.831547400800847 -9.953622462134588 19.808828479599484 +1621 0.4709020522449691 0.08597709683855369 -9.796580617467486 +2621 6.714677618946054 19.500500324519958 8.18239178575274 +2438 -1.5062590032610084 5.6232586039061205 11.05812178718676 +1709 -10.104807021325705 -5.499056567030319 -10.168308361249567 +2046 0.11154297230097891 -3.936603372044761 -9.342583747641013 +1809 9.799039754799242 6.00605432253777 17.050062955534294 +1881 -14.403373606882882 -18.76705909144926 2.811700691237789 +1609 5.858354583418027 11.118526276136025 -7.932314193924629 +1885 -9.667198489641986 -18.900708170141378 -9.426078260395675 +1501 13.406133479175447 -1.1756395908755393 -10.36303935929053 +2082 -9.328630303021683 -11.573468640866828 -4.988232226915619 +2092 7.344226675467077 18.21539872508719 4.835247512132481 +2198 1.3614710892688098 -3.854840300671104 -6.906433204607451 +2261 1.155304730323679 19.286173852259935 11.755449172368612 +2290 18.12902214271667 10.543419434493968 6.923573711042621 +2372 8.196178528721662 -7.676065123849093 7.131959808134314 +2602 -15.820446007838246 -6.145177928481493 -13.062777716066336 +2681 -2.6436658057891544 15.422143845047692 11.841520424691296 +2682 11.854884646321421 -9.654762721795336 -13.155427478351143 +1214 -3.319053928778596 -9.042515814631852 8.30642724925345 +2853 -5.963872979823314 -15.628709620499755 -4.757123512229859 +2857 -6.687665429175661 8.62161413132164 2.192442952161798 +353 -3.222951551897787 -7.555925044075413 8.420210049097513 +219 13.192013899295643 -3.4610749225803277 -13.232947348267981 +231 11.299721300705807 -4.993139637388285 11.527331000931252 +267 10.295143610003308 12.16596690700524 -12.578261481407445 +301 -11.128591285436219 -6.857088835650897 7.498398883928364 +319 -7.869954136784152 1.505281012162948 -6.936247850112941 +417 4.837167175672302 -3.427749536928529 11.665424752437644 +556 1.4361024524980577 -11.248380869901318 4.507259162226597 +665 -5.36876026922424 9.106315533422514 4.054134288584013 +708 -1.3155413832762404 -6.699932489552916 2.632921750338954 +1372 9.491421406813823 9.343459288579236 -15.592996463717704 +2436 9.757074430251352 6.169250949377693 16.384190186110924 +363 -11.831808826567746 4.933145293688033 0.6086579073143095 +859 -15.427062046842714 -2.96750943164651 -9.965271418681839 +57 -1.2973823365771913 -10.113641408060632 6.003008017347643 +1315 -8.92205178518089 2.205753111580089 -9.178619168967739 +1321 5.740580834691376 -8.653739952614634 -2.7724294182947182 +1399 -12.932152425374717 16.443117903575153 4.808635384036107 +407 8.823577292654377 11.488536175535929 10.083473786245593 +1493 18.587035529481316 -12.651035975135988 -8.485990839406115 +1803 0.10591238406213815 19.009167814956417 -19.10835624459796 +2134 13.033666820381319 9.660837640407026 -11.666107140580117 +2355 -15.063503637679649 17.245923869107152 15.168733174444043 +2461 -1.3063169087082236 -4.549899473917963 -9.245231389105346 +92 11.309170810394237 12.982300077856083 -10.523199801824623 +181 12.074208927164344 -2.0237944684178903 2.7403532041799954 +283 13.976487231234465 -1.6729412882037649 12.314523023138678 +783 13.485012295215434 -4.203152542875117 -15.522400409918042 +663 8.254043066614676 -1.8272787385568123 -5.905543174765528 +680 14.216145419959151 -9.707208718422786 7.203087461441811 +932 16.578714594028444 5.170029480702112 -9.299403218190806 +952 -11.228721359762133 0.7917376993162702 3.2220283753836823 +2849 -18.7741836213394 7.946351189700728 19.024729125742237 +1009 -15.545175762970501 6.3451771946532896 -6.915509364396789 +1046 -13.888934960853264 -14.122651379439311 16.55178933381107 +1142 13.044128710570732 7.835790891308581 0.7693197166593017 +1212 -10.821854186062826 14.540197995673743 3.940162364238104 +1485 -9.383159883873988 12.580407712057113 -12.116173563643953 +1526 -19.079453472677745 11.561916730642029 -2.543234067701947 +1610 -9.345159043594542 -15.020853442080876 -17.897224222750264 +59 -9.933276993510665 -1.3459519950358967 -13.001235737075012 +1699 3.9711363685758063 -0.20274950464161906 -2.4897727170116672 +2870 -17.556100940049234 -17.68882973225489 17.436112221704583 +2243 8.478049082250031 -12.63340323308133 13.516346866403625 +2141 -6.000613976121202 -6.046273240673108 3.1213622386064257 +2565 1.5076821976831984 -15.645163241301093 -6.941970313488279 +611 -6.236624259387561 5.287732192151122 7.176054742039153 +2563 16.382679780446196 15.341243483003435 -15.288096991544387 +2741 -9.356875118105549 -15.967804886566494 18.25003527464815 +2772 -17.480959085213346 -8.956397822334711 5.549688608469499 +2882 9.473620776814991 -15.4805710949739 15.846652939587656 +2943 2.7154595450111967 -18.51697920332782 12.250965101278144 +189 14.342318202325862 6.116514492320868 2.5380692426453106 +205 -2.1922143982122937 -7.5803460878430124 -7.665357622052024 +766 0.652423500455917 13.330743225676368 -11.484925751318476 +828 -3.969957938082577 10.424834894817439 -3.411309751872061 +853 -6.747493863851295 -14.571851676873894 -13.100558423335372 +483 -12.290080474231562 -7.23959583953395 1.119799210346649 +1287 -9.373427785311172 19.375697967724953 -12.140622530681156 +1270 7.913973184841304 -8.345548460483236 3.5229992771328433 +1658 19.623863035416896 11.606834138106121 7.716204305657408 +1689 -8.491236665138027 -7.793700222210277 -10.31000972827842 +1728 -13.686938387223286 -9.898251999758212 9.787647901689052 +1805 2.2691627255257414 5.632709605597956 13.129016932233476 +1911 -5.545279715202093 4.117248408617875 18.237351348678555 +1936 -15.66943918823755 -15.7200281056675 -11.019023402872364 +1961 -0.7827370288877536 16.02008445088454 -11.177518382496444 +2122 -6.339932812936516 13.203331974908386 -7.16511465333085 +2139 -3.987140997647867 10.815595978614803 -4.188890220935351 +2186 -13.016199568518513 14.811595692309242 18.93063131853225 +2258 -17.48251260077983 4.126688624161756 -19.066058867299084 +2434 0.9903473515213449 -9.640911610512797 -15.517935587119487 +1192 -1.5580858942599607 3.841999247229644 1.796314928631521 +2781 3.372602889615087 12.851870709601867 3.9718077725358185 +2860 -5.120570960201712 9.067185523042658 5.043512278747718 +2969 -11.470179553580136 13.796021259749338 -0.8640377212633122 +150 -5.918672471944793 8.56929485548354 -12.257471284756749 +153 -7.4472235945519945 7.8770355518689925 -13.471596672961335 +226 12.728647276666097 11.40891538969619 -4.1838594113679 +400 12.897696333457352 7.598526593123556 9.766818939629452 +413 13.920903830697723 -6.302854629284349 -1.2587834368914224 +415 -4.991507914243119 -13.921617546558503 4.166242783568178 +530 -2.829026599799643 -6.455327184906546 -0.5320787282973307 +540 1.117370086573291 11.999084446914422 -0.522375864195287 +574 10.956000844091328 -7.361599611670686 6.9024573336407435 +581 2.6866802087707353 -6.484498227140881 -11.945388858970714 +675 14.617347039556844 -2.067034020603972 -13.876841146659274 +797 -0.24949454538299545 -7.004050068981807 -8.110800966523787 +837 -14.507432523625932 -11.914918074299456 12.078696030812754 +839 1.9401934695402356 12.194666184390178 -11.12602857914974 +848 -11.010037151033531 14.2764088561727 -7.890182241977984 +926 4.491148552697385 -10.924343403619847 -14.241927444849347 +981 -11.847576593285451 -3.0119013017268514 -4.0537267364096685 +1002 6.897151215238767 14.629730645961747 12.43119842998123 +1038 14.534220456405581 6.748192533212411 -1.4880603044893106 +1047 7.928947348579554 -5.49567456038787 3.833699362833627 +1186 -15.43301096464708 -4.863270301464454 6.4845067042994415 +1211 -10.137219833936571 -1.5588821042415417 15.32876294444375 +1300 -16.082250238025715 -16.67034658037868 7.73158166600044 +1325 -11.790521559251033 -0.7479756320938117 5.061985135798162 +2822 -1.2879326586769084 -9.109989776813173 10.86919946745522 +1512 -8.103887677264895 -3.661008057039409 -2.188787996021904 +1568 16.967282629940584 3.3126692624149134 17.26842859381812 +1571 -11.613463637252837 -3.6051961108746267 -4.7899505421231465 +1655 10.52619624126671 -0.8979202077533412 -6.703053340219194 +2202 17.48191097424687 -8.986736482420351 5.157121990343483 +1862 19.618244328366405 -4.440730114647648 -16.50787103573687 +1941 -14.968835150164587 1.425268066321653 2.8717869268511858 +2052 9.7293054102218 9.771602181531094 7.881474628755725 +2083 10.245974106806266 -7.4286253963855815 11.391066612834871 +2136 -16.129279540407527 15.961642308929484 -13.589033911128643 +2218 9.26396383058571 -11.812834854460498 8.865140861572298 +2710 6.368787718443345 6.696283290825688 16.593651539873882 +2527 -10.813688305535148 -4.987938265225981 -3.0749532915710382 +2532 2.9173590607824442 4.208241137516942 19.02426563164176 +2535 -2.531751052478358 15.10831926433521 -10.743182908321186 +2576 5.591375776316116 -7.989711431984264 -12.45651631798639 +2601 17.36741367765392 -12.884694272387819 -16.278735510851348 +2647 16.42801421579641 -6.583353034068784 -9.183533710288247 +2792 -2.9203028692294954 -9.240317853477935 15.254479017260842 +2886 6.74519006194336 -16.379186233356204 2.1357125226098446 +2913 1.668471560707858 -17.57689638150795 17.434854750310564 +2941 -18.270981786360696 -0.4332839618903241 3.026838971699236 +2996 0.6836339996754881 8.906763473069905 13.148675882294455 +15 -11.370999568504859 3.4185165568597893 8.561985001538657 +156 -12.376193586612619 10.219008401079241 -3.3199313151691014 +268 8.937903711183301 -10.653428339690663 4.059091522059972 +317 -11.964777040551654 -4.552607166630961 7.2426651031258915 +364 11.781878793235625 -13.8984126957951 -0.1887453667954684 +424 -4.344085848934865 -5.73762043406256 5.849883390557461 +479 2.7448852339451864 14.038566476240508 -4.005014045129397 +510 3.7682535846763234 2.8406498731578353 -13.681458246609596 +691 -7.343338697070917 8.705404776332077 1.3024857501947793 +740 -7.2922963769549085 -16.215627047367402 -11.997522108315597 +767 8.172521434276844 1.266455913838064 4.0114054991879495 +785 4.042799877663519 6.432426750799838 -11.827729231779013 +801 4.947330448593763 5.284128810067947 12.00581251555334 +889 -3.255919791311177 11.868585943052654 1.3545926782440616 +922 12.205822952797709 10.36391599295972 -13.702386370192238 +978 -5.531690912984585 -15.509295660822772 -9.297689300513662 +1019 5.3644318667867035 -14.110883506265772 -14.536867797562085 +1086 9.021690230696283 -14.86197999381112 15.097852220888953 +1268 4.244314217639489 5.513718737716066 12.093651633745592 +1277 -1.4374233583408191 -13.246734394498045 13.024453477146592 +1296 9.428826287635935 15.5189007206132 -8.072619986714193 +1327 -18.97858466565378 -17.629036803212955 3.3572837471087507 +1350 -5.884035208483017 -6.358054165735541 14.884379416048585 +1394 5.48991847632988 11.310440885017167 3.748666334550311 +1466 -14.965414408207353 -19.46836700324143 13.02942149294002 +1697 5.409086079793188 -14.676880245544378 1.8859718232526783 +1719 15.625174705526785 -17.507237229704725 12.405541935093432 +1735 -4.8920348421811255 9.157508999749872 -5.41769502681504 +1790 -3.2561926052791796 -10.743861214753089 -14.49225730803124 +1792 12.948512171626446 -10.584531376327144 -1.7611978064618696 +1815 3.68827768709076 -11.852877963338825 2.1419936743510317 +1828 17.710776261412054 -3.3640671924964987 10.98245568175881 +1861 19.015269785303975 12.358970886962778 -10.467748546004138 +1866 0.3607562454489196 -9.062536821550816 -14.642455458546337 +2811 -1.6416292117036895 3.651474507031395 -10.613120707465832 +488 -11.309077060836863 1.9158277583522452 -8.15809593731534 +1918 -16.64817529365857 -4.268271508339805 -18.279745177494583 +1923 11.415834512200218 18.71089928692976 -15.400617521205115 +2099 -11.840742064871318 17.442483000596546 -12.668862537435592 +2119 -11.551930670762747 11.56078480563 17.625524827525087 +2149 -16.20524293105373 -6.578341964936912 -3.3485399557178277 +2190 -10.130408737393235 -4.663850217596005 -3.957274338287783 +2192 -3.7797090092577266 8.946015908026554 6.582966467941948 +2255 6.384811919151359 1.6638665835914008 15.308764294599648 +2274 2.0949559602201036 17.21629804382134 -12.436241535454453 +2285 10.81836964666567 10.53268278236845 -16.755248272894818 +2338 13.826704039998415 12.609713128521543 10.103690085219316 +2361 7.547921801986836 -7.266596228618704 -8.896290797298308 +2379 14.504096013919327 -7.632949751370535 -12.895403820357345 +2839 14.412441588607171 19.652026923297747 7.343470237997312 +2475 -5.789653913563837 12.187466644865912 7.344124889650486 +2538 19.520461837961154 -1.7640983148812364 15.245897094383409 +2555 1.545860982027835 -1.062695919353119 6.6161644427711375 +2559 4.164068342992341 -10.615928995232746 19.24133726068351 +2635 12.240734852397456 8.480926351938797 -10.76571079123058 +2646 -5.87317494454688 19.39831151929506 15.18813555653903 +2704 0.0794661728372169 5.650944054102388 6.05121236703608 +2707 9.43816533969742 15.708258428408252 -0.17245343972152422 +2714 -14.59829536096173 -2.603083812996092 -15.288266230038388 +2737 13.587887773944887 -3.4869680481361995 -16.575051289831915 +2832 7.173370095015488 7.71949886055302 8.040822663103002 +2843 4.016472099723824 17.087455024447312 16.908395899771342 +2865 9.656803442283737 6.214726790945043 -3.163792039499633 +2888 17.19014061671824 -13.643313915928907 10.526274096827937 +84 -1.3258137649380537 -9.09626116726924 6.836903351498362 +148 -7.4189543576135675 4.133704074189687 0.7716833727426308 +217 13.63893555780297 -13.036638000617728 5.052679730605925 +414 5.3974376575186795 4.761268360910397 13.22792284800974 +564 -13.670141473531526 8.914182001630458 9.719539661219587 +605 -0.7786473340476435 -7.1901085755795275 3.610300026822948 +787 11.50852870576607 -3.928214133658807 -4.754488115075499 +1093 -13.932830458474356 0.13142522545236623 -10.739544352725613 +1250 10.108614958232241 -3.6355037083142174 -4.660447268139229 +1251 -6.888406446954476 5.367269549267784 -19.31045912762238 +1276 -14.727323533416921 -15.563336785338878 -3.4405149906087753 +1486 -15.187091028898873 17.342835984900198 -2.136284732679966 +1569 19.73695718374111 -8.077921024450358 -5.660279144382298 +1739 -2.921076332766199 16.95310305757235 -7.142824740951309 +1894 -10.892818261010795 -2.362332482798966 -5.8619845642424355 +1904 18.707817189933955 18.482180059903424 -18.56845405757093 +2004 16.328503842891458 6.24578016564986 9.240983183160475 +2191 14.239231273565265 8.789932371621939 9.219482466398066 +2237 11.706096816589683 -1.9783723894580674 19.69960234248437 +2270 -5.709657397866714 -15.066884067616808 -7.673496157161857 +2393 -6.998170048149167 2.6424851729267034 1.8819148445716842 +2427 -14.19412169784732 9.950767125517224 1.2439501288074715 +2536 15.169580409013742 7.1518454661536275 -8.60529191398299 +2630 -0.152323237212591 -9.924435985308397 0.8366510561320254 +2782 -17.147500849873147 -9.126064312878293 15.055629827780457 +2803 19.58133945927248 2.387496182185421 -11.678592152460837 +2823 13.546969070761776 14.266793856511157 -5.579563570405738 +2833 18.154398645475027 5.923052997729127 -6.197413069275141 +2872 1.7773127181192678 8.837397901598234 -16.08082924240975 +454 -12.402743056677156 -13.47052611906859 8.334999148638657 +2960 -5.731855290351208 3.7833626695050513 11.221961932769116 +2993 -15.642158884739048 11.656784497259435 -15.014605997427314 +78 -10.511131688295508 4.780596410375815 0.052523129660864434 +134 3.342785017751246 6.787902166833162 -9.015348607088807 +183 -10.597050144735691 -2.6577108743111824 -3.8019775101478164 +187 -9.943835687903716 -9.794965117213172 9.981582799849138 +330 2.7731471253764086 10.17177905900138 -8.385653756003885 +333 -5.136077543601488 6.9555931836293405 -7.481821677253265 +396 -12.816889586724049 11.755236444434006 13.72435929822531 +509 7.567043641737833 -8.870585975842854 -2.9868340360073304 +650 -2.0721095390367377 -3.635739717667435 6.477988043724767 +2642 -2.32193280679798 14.151542898362099 17.048711438420476 +702 3.650798429180977 -10.059973128316097 -3.750409302929597 +751 3.2230451308483805 -6.211609205614629 3.2113989981117843 +927 1.3356738569244941 -12.237394004815691 -12.950731406535677 +928 -7.610258092126136 1.9294625960717453 -2.1372621472605546 +1013 3.4005184127645802 1.254919692310665 6.29753162453384 +1122 16.370947427783847 11.688590238867459 -15.810387071988071 +1171 -4.170052996689735 15.104907824589551 -11.761514939245352 +1228 -10.358423634433532 4.005987321423891 -9.655680217740079 +1355 1.3553695606547667 11.175836000310872 14.639678275124393 +1374 14.49859925786818 17.562139014268784 -0.4543919405067856 +1378 -8.025185590575337 -13.477804527260336 9.537966809031055 +1389 13.541593280173618 2.3019265861211893 0.2950419748796521 +1456 18.63893000511222 -2.7070806394273834 0.523087697307244 +1462 3.1676855520022245 17.792163821464108 -14.536692076438511 +1464 -18.679981383776486 -15.710567558873505 -8.78770372576132 +1527 -10.150642437659453 8.00555255966727 -4.996432728970649 +1628 -1.9559749221430969 11.501166426028012 -4.555016833065382 +1639 19.86124877719166 3.6606937616729933 -12.437198235751621 +1922 4.441205420130536 -16.742759649286835 5.668832270988701 +2095 10.226488008872607 17.80572978422618 17.501331203689098 +2100 -15.48432388596476 -0.7359260265272781 11.614593030524086 +757 -0.9263616695642733 -4.93652867674225 -15.020698348933722 +2236 17.241648214575402 -10.20161332343201 6.286815328285697 +2583 17.114472029198712 7.964480532577321 10.180414273434913 +2724 11.340106646493638 0.12938267327409808 14.246536231518235 +2746 -1.4591166562084479 14.084234068273279 -16.80616383715908 +2757 -14.647004510070976 1.7957211283247396 -2.614188999062566 +2877 12.457252445748228 2.5410185650970574 -18.167392335020622 +2911 -14.911459103042777 -14.081072267390182 -17.783117873831216 +2927 -13.178158051427493 -2.906069063294778 -12.468433587920442 +49 -11.614907161412459 -11.504778514034232 5.0116245365547005 +236 -6.206275116139562 -8.355885184306716 -0.13826524427099057 +263 4.94613495487784 -2.958389465749539 13.02184243977908 +281 -11.818700795198051 -0.10812286495905703 2.8444378213667902 +446 3.985112737708672 13.856718738868622 10.045901621838368 +486 14.153077631697483 8.590057311984987 -1.324791948525939 +601 4.246139094631274 -9.114877057887494 -9.728261851906787 +648 5.899448844934274 -13.453093028364849 -10.266580996484082 +756 2.5848029763883384 -8.892226162995518 5.032703207331006 +764 0.6610895862542718 -4.4978538749376575 1.2091454685914036 +838 -3.475584108029835 14.607140020060667 -7.594548639550901 +939 -11.485311070677406 4.147295745505987 -0.341773508081685 +1036 5.696630406445407 10.846934674966992 -4.190653108815017 +1048 -11.909438940815516 3.536430887514358 -0.6347718389462319 +1057 -12.633778879132992 -7.570029561999477 -6.021175302650932 +1314 2.2466546628476114 19.269925898296613 13.027244917635938 +1518 4.188348947567866 5.53796638157551 -11.499446316929705 +1696 12.716389613785251 7.433896226830684 -10.533888475216715 +1853 -7.811803882672104 6.26350611389333 -6.3831852680339285 +1950 -5.050589757016499 9.450590284894773 -17.921379718959955 +2049 -5.243014052452371 -10.79669216893508 -0.9825850795320505 +2070 -6.823828903135634 -6.682583514647195 8.349749821626588 +2094 -1.1694218930082432 -16.143702376000885 1.417623280925613 +2128 12.265865701092478 -0.2681479272465354 -4.236429410629301 +2166 -8.224399629266722 8.931788413107459 2.6195947970492357 +2351 1.7342695453044914 -9.114801293082602 8.388090671950602 +2352 14.927460059307057 13.909475475608138 -14.497137830096618 +2518 -14.977768325501376 8.057480470531752 5.509468577563686 +1104 -3.299763157796127 -5.697069669652978 -13.336179115548196 +2755 -14.689208936690463 -2.059670762186811 -14.11938064786024 +2756 -16.2821657595981 -6.050576420937635 9.18385667749542 +2926 0.4476328817359991 0.9312540765757121 8.899446615772666 +81 -4.615855331055557 -10.071290807580215 13.577202200837727 +133 9.513935159261536 8.913703704175731 1.680794339595575 +211 4.732683946666952 -13.030756164426837 -8.765275103616217 +438 -7.895231365001139 -0.80168477622325 7.905879589177198 +529 2.7984617238612906 13.106826939898186 -2.0687798091989897 +580 -10.779495347299695 1.3516073087093459 1.7712591796662225 +903 -13.631011582005332 4.936747518539374 -6.561314560779961 +948 -4.132514528760936 -7.904066150513176 3.520719855665903 +949 -8.11608005061232 1.5138642263282764 9.823585236607784 +982 5.99551421164344 -0.9815856607928193 -15.058582079062953 +1181 -6.919354400710205 6.903225157595225 -11.526760120234476 +1185 11.328765551514696 15.511173076640535 15.591329955687979 +1216 -5.679392360997381 -15.911702845948763 -18.668532373179954 +1285 -16.86661778552789 8.512889449707572 16.928779967335316 +1356 8.866789994227776 14.893357358381051 -17.84985961899761 +1439 1.4782130544281171 -1.4237604882206043 13.122454209103799 +1443 -3.881895022129601 15.998690756070678 -18.00414396752174 +1469 -13.35338543088838 -8.47594273234025 6.7957362307676545 +1502 15.779529665906113 -10.002907912756301 14.521733900852567 +1521 11.63662958886744 6.276608454800213 17.862745491959373 +1674 -7.64685739952176 -4.185554218760554 0.19395074689953276 +1782 -16.424130903608923 -1.2843748943815008 4.1947755188630245 +1817 18.342524213810666 -6.8853483495941274 10.274132667396566 +1860 1.3362970229792888 4.167875867752587 6.88656043294898 +1947 -14.449000418020201 -1.7564224284317416 -12.51756963853009 +1952 -10.411368965585428 15.593325816754492 -11.386751456837107 +2168 -1.3461167178600801 -7.183908158367495 9.086315880757379 +2212 -2.5235435056634152 -3.7195317065016615 -5.97020019807534 +2293 6.69860127606427 -15.536459055193198 17.170247271448083 +634 13.299468248632378 16.164477916925 9.863305782349592 +2586 11.942387444960573 10.862938827564824 7.641920633983926 +2600 -8.934513527453083 -11.273636395147289 17.58543231407399 +2620 15.493537289054325 4.064990744587251 2.1892885787821488 +2632 16.494230159063502 8.90337342874525 -4.634776509774403 +2712 -11.530905840308021 12.187907106616613 14.746965533705179 +2852 -12.523095703351338 -6.512527791993013 5.385632685176091 +80 1.9213495440592956 3.604743069128143 11.76815117222564 +132 0.44576098436976025 -8.337526833610927 -1.4428982601256788 +173 -0.5056518009255883 0.9723393324613838 -6.50599087821204 +175 -6.087810815999495 10.879032615299515 -8.679568827398384 +188 -3.8559672674382277 1.039647001980558 -2.0057462148646854 +228 -11.210528988534513 -3.7278625505462144 9.826417210765644 +280 -2.548701451281303 0.8309587157042392 11.63196679349781 +352 6.822294314307379 9.107263918367591 -12.697980879505927 +419 7.864129152093916 -1.5778379046212108 5.1129372478966015 +552 -13.042368377651597 -3.2886169077150287 12.082528281993968 +593 -10.211672739626337 -4.373265637614854 7.406893447826605 +676 -9.48815433412858 -8.328961813018243 -9.994431313772237 +750 7.117688895965154 -6.12609477586971 1.8328099212254587 +754 -1.9013327938819946 -10.630203501360231 -7.7135237983430756 +874 -9.370478038427585 7.702526670316283 -15.681227355805278 +1148 -11.751518565129915 9.33626699503042 10.732123251601942 +1260 16.286683519943356 8.846018680159238 11.229528315178497 +1282 -3.060026611544486 -5.9959005974397535 -12.512119531200039 +1407 16.000806998366016 -14.33192563729899 -1.0292681118883358 +1517 -8.285028238390822 8.965341746797499 17.848158112012424 +1823 10.598972261315847 7.26494901357462 11.060946115389495 +1877 -12.876565802023151 10.054954835741116 -11.35921989631855 +1938 -13.1843123427382 11.237824594861223 -1.7296225720031955 +1957 -10.142712866850351 -15.494241141326103 -17.94070323989538 +1965 -2.2990253281335193 7.2273110879347975 5.568691045308627 +2000 -3.708806475580304 -14.378800319976154 -4.9916084189791965 +2101 -0.3906395990723015 -17.61922737654714 11.452227429844617 +376 3.0321922214750354 -2.173848974887717 -12.229777830647217 +2116 8.230450920691144 19.63771069360481 1.8887332231336897 +2137 0.4393145533338028 17.897198910451777 -12.897967218683148 +2172 -7.020005975029051 -11.616734745656611 12.50577344685458 +2305 17.53533211870375 -12.57708076083084 19.495596242741346 +2308 4.710433567971191 0.9771252824799067 -4.003647200450435 +2319 11.405613806610397 3.7035907283435368 3.0577142928348207 +2371 1.8151794524509157 18.175240655217415 -3.8200490584028075 +2402 5.735070974656764 16.321110162886658 -7.738288602659433 +2403 -1.3779201587383612 6.9979770139738715 -7.932877920723159 +2444 -9.854101573124423 14.453996105031198 5.286821513817966 +2599 -5.6090605441263826 -9.63553386710259 -3.5202472365557456 +2721 5.604908851364803 -15.697454523072034 15.637976127520124 +2735 5.0283031731736285 13.160510073257345 17.794613173238186 +2739 10.289257640989097 14.563327311272808 0.744343913738075 +2752 -18.602056885275807 0.596733852803765 -8.779726465942744 +2780 5.135487370201985 11.726271198450146 16.25072631525199 +2795 -6.8858319522192755 9.443779991381062 -14.802915086655528 +2804 10.148465686762755 -0.14569302681021773 15.825908457726305 +2875 -7.839777565752635 6.426085448208438 -17.423893502107244 +2876 -18.716721996810232 -6.121689658638919 -10.225652195932913 +320 -9.058036002966757 4.8755479387139244 -9.70129373894566 +461 7.367715918927901 -6.92084632972005 6.328965161817679 +487 -5.436354362029799 2.363518189773245 -4.812892655242448 +642 -9.884236216355719 4.686489030576977 5.11540698626187 +1074 -7.231101776904068 -1.2908908972763522 -14.903556245126026 +1179 7.388376440380218 -1.410666750125086 -0.8305012650815156 +1190 10.871932077317412 -11.648375640342286 12.519053036171659 +1236 4.124539373833044 -8.697929924740219 -0.8058620573898834 +1288 5.022368273207295 -8.201308516044344 -2.2036540272496064 +1328 1.5051629112348894 -18.793788005604416 -15.29791121813729 +1405 8.97075417020444 -1.4667527599073968 -3.974249727589612 +1428 -8.855005509278927 -7.5451424037451424 12.740852540776274 +1540 11.905727226142947 -17.390020254270055 -16.372903126886907 +1638 -19.000709792703613 2.4441785942157783 0.350165104130745 +1745 -9.677363056160578 6.22853521390261 -6.243762826085325 +1993 -17.260396193612525 13.899999506995158 -16.987652018860363 +2121 -0.47028927897302203 15.46439256605141 16.441368030920124 +2133 -11.560069102277703 -7.642765949036163 18.088874875434218 +2294 15.710420151381586 4.2641586455764 18.197281849326558 +2311 13.18508325809475 6.970439083970318 -0.44659662165086755 +2501 -3.208659055043296 4.292066151715351 16.922466657907687 +2550 10.110911604716316 -4.228788822888129 18.217388050388735 +2719 -16.911199873370464 3.889167955158895 -13.387640413526784 +2981 -7.819687826797823 -8.662875089902746 0.46540846999968855 +18 -11.350429249484675 11.121941245461471 -10.545840622570658 +111 -1.4667437348282968 -11.552775527199685 -12.956345873456401 +112 -7.615340637648967 -0.81671541540145 8.802372233885295 +144 -3.259776206011295 -6.761020409825603 -11.652215841207434 +516 -10.33065453074885 -4.137160455575193 3.869044755782117 +834 -12.569274682747512 -2.4127082610273622 -3.753560298199642 +988 5.119806738822698 -5.841981134440411 3.3293489061514445 +1103 -15.444874969828094 -8.086204042448099 15.743791041258223 +1159 -0.3031971216393466 5.901957026713809 -1.4516211427587584 +1163 -0.9369809981942725 12.759816375172313 5.542163307066197 +1194 -6.677795128613995 12.498283661182146 -8.787530881067534 +1311 -9.690465324064768 -18.016168589822513 2.87509321883582 +1342 10.02334896211924 13.440734799313411 -14.824147263010218 +1414 -17.500778294437048 10.67935590657877 18.412550841110555 +1425 13.461223702462483 -15.906798543256008 -14.627962160820525 +1449 -12.452001628857074 12.574905061038477 12.979838483339961 +1970 8.547050516286959 10.476044025948756 11.1427368912853 +1834 6.957548819605155 -13.830600300053103 -1.754178086471436 +1942 -6.0912000982686365 0.0006521510506230974 6.288890703606039 +1962 5.19546441203671 0.7418264322003688 -0.17614403613495702 +2064 -8.30360012359488 10.371847701407043 -15.591896495634717 +2135 -15.174075068428968 0.9439481681703598 -12.909091387355966 +2307 4.685674941759207 15.982142834040125 17.419111044201312 +2388 -14.901610072415785 -5.3205048091675025 12.08137053663825 +2418 7.628350822141079 11.941178042122798 -16.761051311746172 +2464 10.586043301805814 -14.066960609494853 -15.766619061470658 +2779 -9.925983583939354 -17.876282489517376 2.3594267032265206 +2956 -3.188633302949262 -11.872321555454244 -11.102278430291285 +171 -2.777957747989826 6.804047473612432 8.822377119371557 +336 10.505355682397944 -4.02996673441196 2.6903052335846396 +583 10.500114217031422 -7.617793378627787 10.833386401858762 +620 10.117570161786123 -4.199803558909284 8.068072881106987 +626 -12.841991961474351 -8.545980642055106 4.510934008479656 +791 2.19063522341552 3.598094835267834 -10.517609073388806 +963 -14.912841387783907 7.821448571306408 -11.410751000800593 +1255 18.84204096407929 1.1858429213037283 15.734699567852044 +1330 -9.224986335109001 5.877706881947971 15.530870444888528 +1390 -5.153665380710294 1.5515760489162664 9.306831484863546 +1579 8.982658628165796 2.6463593346127183 -11.39109484333503 +1730 4.609883381202626 -3.669893123601239 5.251988588917795 +1912 0.12430800426295158 14.640175950829999 -1.0303159377975535 +1934 12.601085746934144 -10.02008789210642 0.12897897028558983 +2143 9.345094260618257 19.183535240939577 11.20130189677337 +2238 2.1516080031299984 -10.4583810795503 2.023621212285035 +2253 3.888243471017555 17.565133840261982 10.686625954710978 +2334 -18.247907204531018 -4.549012874457147 5.655845748854915 +2404 -18.819715346468552 -12.637924180380306 15.918830757316293 +2407 1.7669953387126922 -7.794707495123307 11.95377699486332 +2410 13.807880003491308 9.778312132842707 3.0765586058400207 +2414 9.191726333155206 -10.924754424503062 2.2913270714613123 +2551 17.338356798859216 8.265637266163434 15.821723815585205 +2884 19.525009321739187 -3.7205836023110375 15.543609506142317 +214 3.8280317813880558 -6.532979243646125 -9.879509477164076 +777 7.4953737398336475 -1.3815670859852067 -2.190949406950621 +1507 -17.94525853315031 -13.025727391011849 4.152016691539095 +1806 16.26022694233597 -4.686432870776127 8.426299387399542 +738 16.294703189917836 5.391793110965069 -9.450694778871249 +1841 5.984543261360931 15.548417552877753 17.700509014793877 +973 9.510680576979125 -3.0721859211279003 -3.6844181054712495 +525 -2.575104627699706 7.768675429746817 -3.7280641440538305 +2383 5.3927729526753225 -14.500449708693365 -11.515710824253757 +1935 -13.469980952644706 -8.445748270824774 4.764757480174183 +521 3.6949884333590446 10.886984323601357 12.290816907093559 +717 5.418778850267698 -16.18633837740858 -10.18134945123376 +1819 -8.719114974138952 3.171772494571501 0.7978057936978792 +2731 -6.130408311843755 7.30959032485223 16.68003588249794 +272 11.72439221113353 5.821889241549614 8.42641009003704 +905 -9.5122522410889 11.704218800257582 -14.70835756998545 +76 -8.283735634473988 4.697648477048505 -13.797190044304125 +165 14.187341091087006 -7.082353124651143 -3.940320576038863 +256 0.4182917125166666 8.850817833238068 -13.007763335167883 +2749 -17.34516803449382 0.08848242152174564 -6.882611239453291 +335 1.3605737569022383 -13.076941185252076 3.7209097483972133 +1620 8.7924342688959 19.373404022340537 -11.501940034184646 +388 7.752404420397434 7.953689356179693 7.26666581336078 +418 -12.860663366108058 8.430168351898367 -12.571621379001574 +2933 13.808622130621862 -16.94177975632317 -7.855188034628431 +533 -13.333522010548968 4.610217698728032 9.683896676226421 +587 1.2652138970655078 -10.185951813962232 1.9272547454787632 +618 -1.7173273466254195 8.534727604083397 9.970471366104357 +687 8.30315793541324 6.248815590935976 8.330028094813251 +745 -13.032203845821707 -1.2388990414019971 8.830159644420458 +765 -16.017339018938852 15.801088255793053 16.506612786600343 +869 -15.630765405277492 6.459668740782595 -11.714206709683243 +871 -9.11114086134048 -14.868167871364825 9.185894843939138 +896 -12.489669387320179 -5.018417145410157 14.603518326575141 +936 -4.270637329010982 -7.925054139833508 10.430485798794793 +971 4.943358068199984 3.912131977220363 3.464699864660454 +980 -11.571799548776811 -10.844945871476328 12.356386382414104 +983 8.099330171746745 13.58511503384775 13.275025231341626 +1128 -14.3141650604309 -0.5627862048219752 -5.9146734621438535 +1352 5.22493308077428 -13.487551536623283 2.4920707355877636 +1395 -4.955482121799213 1.0106899133367568 11.41478759701337 +1522 14.200308281513305 -18.300433887204225 6.776993957277177 +1617 -12.08668155048386 -0.795081587303708 -2.787352628882035 +1680 -8.427646555750277 2.7536588028939764 -10.887969770688452 +1692 -16.66121943316813 11.657011188873152 -11.204600045666176 +1756 1.3669564386491073 9.951381589187676 11.571241038065509 +1971 -13.886212160368556 11.50738397417256 -17.635752884844752 +2051 -11.853871234268029 -7.254354187952335 0.8905738203460172 +2268 -18.895106724510523 13.62892995746655 12.730070024708622 +2296 19.05948771746114 10.862327776770288 -2.6280100697367654 +2331 -16.403535694004926 -7.877890231625078 -14.342685356369563 +2353 -15.977470877473067 -19.329649530052432 -7.127360963669948 +2358 17.406286845367628 13.368274333406552 -17.683498015136816 +2369 -9.512094685884307 1.1894318067145642 -2.3329484770290176 +2422 -1.0420254585055277 8.584953401485162 13.123917748850653 +2525 8.069688532161697 -17.170218397497383 -6.3072181542503625 +2585 -18.113113680864945 -12.269569818058109 14.353031867142327 +2590 11.092211528228624 -11.783477332323647 -7.232278025553046 +2777 -16.52410206951469 3.800210340594753 -19.163410641813204 +2784 18.80802451955291 17.366798352484466 8.669001532071373 +2806 19.3976424533273 11.240700481216177 7.412376823284824 +2861 5.392774321475824 -14.477444278665018 -16.793674061852617 +2897 9.62825630479578 -3.2607421003486405 -16.118736347230854 +2935 7.486733097948202 -16.646558123460792 15.613951360883664 +74 4.513496320319179 -6.844488195191247 -6.070588299813616 +2350 0.23481110449123696 -9.399301987649224 8.333670923650534 +167 -1.0915143053235346 13.35410118862853 13.10091182725044 +249 -12.156247680932891 -11.391352759624207 -4.0993079013502784 +253 -1.1560628711675123 -1.1108758529704845 -5.665665352640753 +264 -3.8601764398201692 -13.366925374051807 3.1060973802336034 +291 3.4029136345074886 3.303782738137622 -4.311719454707063 +295 12.12111054156816 -2.4661910452656395 3.863481963826399 +298 -13.244213550066725 12.687335071142735 -10.345137073144642 +337 12.759038263360091 -13.011155793398848 10.804727603816016 +346 5.404841640205748 -11.64246423573248 0.7442016922291546 +462 13.916143863328353 -1.7981444353536724 -7.506220776318096 +480 -10.50734808312016 12.03466074519577 5.870096954033172 +519 -7.657414810952965 -3.7449980448134172 3.515104298241528 +369 11.914550825875528 -9.390580084156177 -10.294696131030905 +568 -13.459235709800412 4.3771186523942 7.408880328823136 +585 6.286949092830173 -2.69031180931509 11.6439863518698 +674 -13.962010557425053 0.14000550193901576 2.6855616674895515 +696 7.140385809092109 15.686021698969048 11.64110538611749 +2497 -5.9105135408930405 18.9368838878129 -19.00062000120202 +798 -10.299106942624169 -3.8190599236727527 -1.1700933518441239 +821 -5.926976638269232 10.887164915231173 -14.654909665900313 +879 -8.119133467479461 15.586887385673448 12.981613185710037 +944 -9.034814178935276 -7.185725373209548 11.886981813601034 +995 -0.47607445925644915 10.2876635182524 12.558280132695495 +1024 15.031588431563497 -4.13870600437882 -11.334135252463504 +1063 2.3075093786645295 6.148008742097583 14.256131249464874 +1169 0.22025705175544666 8.399089360992656 -13.684364892211864 +1284 -10.868754328429318 10.149956690055646 17.616042671933837 +1299 15.624978273529486 18.38435276409509 -16.644866667399043 +1334 4.850955174973155 11.142419820431078 1.7162590490014749 +1387 0.9359769712927003 17.188649624241304 -6.806958548270253 +1415 5.225484378864255 -4.221884538406652 16.678629613364066 +1417 -17.139160091393396 13.47799573904445 -15.667894361802883 +1457 -13.305420635491837 13.807922049325354 3.1874198207808377 +1570 2.7439330957841945 -10.278282230358021 11.08224151207668 +1585 7.850910355657395 -10.030909099601578 14.222057461131442 +1593 8.799823784029815 -13.203105411569982 1.6293406734244347 +1598 -1.1916000565148426 3.0381292925961993 -11.341203178347218 +1643 1.087952007365448 -15.306408879561918 3.5143144387083716 +1676 18.64573714125943 -5.878611130330526 -0.8791744464781872 +1788 -10.939769760772101 -7.615737523080607 2.0393590416774643 +1900 8.278748425862911 8.320406095092729 -4.311110107450902 +1982 12.695582459111609 10.465250778485172 -13.487282939557483 +1983 -13.925099435852761 -14.982693930447297 -3.6386733556013997 +1986 -18.5444935132427 -11.76123669676216 13.828880704744565 +2041 17.81502122399825 -15.00499676430357 13.447823746013933 +2055 -8.506683286786435 6.946087739784877 -17.789412622324047 +2153 -9.778367027671397 -6.045243355175797 -18.762374780467038 +2216 -1.3976125987849495 -10.428682269821747 -8.337777121106045 +2263 -5.073336319494004 19.079340449454424 -15.5075654085149 +2286 9.999189669769498 -0.6742659988493056 -10.276931240607674 +2288 8.009332369089412 -12.55766427096535 -6.908661739578571 +2443 -3.8156614122107024 -7.410681936617091 -0.5773856373218332 +2568 4.317877170222255 -12.290459520527328 15.997005618554029 +2662 -8.939694254844444 19.232946055436557 18.595387127049737 +2678 5.07099069511677 -14.057737503961178 -17.52597464661003 +2842 4.867409233790652 13.334628359298568 4.723953737982519 +2898 8.159962038525267 10.721745303772694 -13.816279396281722 +467 1.8180862070456976 -13.664032776642753 -4.554593482283304 +2929 4.498051741458279 -1.9591788315675849 -10.4514733437855 +2963 18.044736846536296 4.909259137362896 3.9339947499358496 +2977 -15.967494256388665 -8.424669254120863 6.3025880712162525 +2989 -15.76575580280976 11.593578820055189 -19.100813314303842 +14 -1.1867273074841143 -9.455166400660389 2.7743454044820974 +105 -4.980593789120286 0.5011198510697855 -10.945022085208114 +196 -4.64218768891434 -1.9433265619599716 3.076748707894728 +1856 -3.996686045059489 7.164074421087203 0.9616407925903484 +895 6.319602842607532 -14.239302241685213 -14.941139292484328 +915 6.588345030852322 -9.52357514704245 -12.577999507807467 +1027 9.015149691487661 5.994778417764959 -10.805712436731765 +2980 15.809542733979136 -15.082566250706186 3.107210666488477 +1131 4.530870088078169 2.757497286782551 -13.81171024997419 +1160 -7.530271298486687 5.735594162737259 14.335143157363008 +1203 7.566012307430533 -16.763651815596962 7.271396248349379 +1339 -13.469735882602922 -4.32685607854971 16.107970187058044 +1471 -0.047445250021143054 -10.926121016673061 18.516035042628708 +1586 5.4648096744482695 -18.762966615208594 -6.792096276681259 +1606 -10.726948549298216 2.7053096300659463 -0.43904347097966934 +1646 -18.217843983607622 -8.785752256168434 12.499071379833854 +1787 -9.527031201212498 -14.690445879794328 9.04649241873286 +1875 0.8472216836933476 14.813388693211463 9.872574909795192 +1953 15.987215484661249 -7.606361038888073 2.8578385759810203 +1988 3.5246145365385817 -19.02786922570986 8.994302282193637 +1997 8.553745757555848 5.423896314995088 -8.216949286449822 +2033 -13.210386933752307 4.12542171716961 -1.1659421119340114 +2040 -2.527659726030114 5.485197735192346 3.057433086459797 +2131 18.661186683015575 18.623701730802438 8.404914398156864 +2194 -0.2645056731494558 -14.109553300939252 13.045444708111676 +2214 -10.010003935094664 -19.057511750361794 -18.89133867405068 +2217 -4.374648583872438 4.0173413208262465 -14.79412512435254 +2244 -19.12033905088872 -9.320612530425624 -1.6953889809652631 +2279 -16.43198396759533 -15.69175359673809 -6.125622695091113 +2696 14.596869169006673 -16.115435094338125 6.189555318157198 +2775 16.415547746599817 19.05083461324027 14.90413878131436 +2995 8.666543624448854 -19.24046086196364 2.5317258534012743 +20 -8.782688104544242 13.014673249668789 -1.6286856947009776 +64 3.5381929286951244 -4.705127664804633 7.163599349057198 +304 4.107513626328567 -13.420096575607992 10.849518381789249 +370 -4.836470425558451 0.29201380218827727 -4.328645182275715 +395 -2.7263450400734945 1.0355177906913102 13.100081417661148 +398 7.088034092553789 -3.3948169522744083 1.7934965615461134 +443 -13.200152679403873 -7.3309476364823745 -13.131180225486737 +550 -9.390779976349043 -10.190615817526787 8.044828606944579 +705 -4.478712760183576 -6.587502026453058 -4.1104978481716525 +707 -6.002750097262397 12.50274830322713 0.8579075235282216 +724 0.7642468885583003 -3.61578585539996 14.883548945973292 +909 13.715787243026751 16.315169040801706 -7.751192594112227 +1101 -15.36226925650701 7.040210390681743 2.07103677438975 +1267 -18.952334119897873 -7.559362580144225 8.900483235768446 +1295 0.5217028380245162 -8.35171289916833 17.496346014012037 +1335 12.690952792551466 11.04049004701308 13.075550398351963 +1336 19.08771116100651 14.897472574960712 12.121562863021909 +433 0.3107302306651307 3.8486034671519653 -2.2702520921877496 +1619 1.541925972596859 11.187645719026856 17.160507872615923 +1647 10.881422310224517 12.047189761142937 1.2918945017005323 +1744 13.22064208527687 16.71230894779688 -17.288102779899834 +1837 2.462547353142776 2.82727245584732 11.352995671719075 +1869 -18.99842283732709 1.6880150350411778 -9.951460485463125 +1907 0.31574090487161344 18.22508554372942 10.869518142462637 +2075 -16.52065975526155 -16.7308591517216 9.715381987960136 +2200 -5.71370915685513 -4.778752241121225 -14.657477679036594 +2265 -3.0135816409714176 -9.255731623914308 -8.64662527246468 +2298 2.4372598771690392 8.943912061655782 10.416643086775158 +2329 -16.78414505497157 -16.316740696697114 -6.553762302921765 +2364 -12.890802093766807 5.943734934532896 -11.333304359922717 +2397 4.260226833730621 -1.3941006254289852 2.1064747066395184 +2452 6.774872062801755 12.169931324905615 -13.02083967627511 +2477 -6.936361441739427 -16.751876353394863 9.21647661699817 +2542 19.596771389128843 -12.599216728780648 0.19358606194459232 +2594 -7.193190520120185 17.147308837735558 3.8528489528363385 +2611 -18.395679731053452 -19.001444075761988 -17.1944734127228 +2800 10.143919827294651 1.838092037586552 4.039276661029945 +2802 14.09986615698166 18.06177229508677 9.575328273470925 +2938 -6.326484421012183 4.072319612733612 7.78650779748336 +2979 13.369118978286691 3.8100051302205378 -11.314471690847117 +26 11.1879211595077 3.270980129610062 7.744717495288581 +311 -0.1474664928252142 -7.064887082559806 7.926509616677361 +325 8.314964037744769 -1.720780228677609 -2.99671965895198 +373 -7.370385863987725 3.5380526583196046 -10.526320265103273 +378 5.659916463427228 -6.210986744870034 -6.502415885441253 +470 5.903744554336337 7.376118237323814 -10.009219066749033 +586 -6.985440702626334 -5.442222776974963 12.94337550195115 +2103 -18.315197893450524 1.0940330550066273 1.2141570361003764 +958 14.835533733935067 3.0559134495020244 -0.8039975000981964 +985 4.314038757563964 -12.281749943388647 -6.435285879610354 +1010 3.684113254992941 -5.967999492914251 10.572312513222624 +1037 -6.613011214578635 -10.339080719055211 13.497945216683416 +1132 6.202118902272779 5.658026138103121 -14.210538182428165 +1157 10.275764515215554 6.204776489087058 -12.52535178012158 +1196 -9.045358325453632 11.77420542908521 -15.495494881961447 +1269 16.577677402574178 0.45238250625472914 -4.925408426800614 +1495 -19.007936000812364 -1.4276333723594872 -12.776086940697349 +1531 17.059790201229294 -9.633482984185887 -8.244080627952417 +1584 17.7668520575615 -1.5307030463337692 18.617918331581677 +1693 -18.842800185176657 -8.694582623492556 16.259207439660493 +1725 18.699909811943645 3.161945894022064 -7.58577935112697 +1726 14.298603141322275 -12.365673118760167 6.058782436081476 +1767 -13.9069262366081 16.103107767754572 12.439578218101742 +1778 18.616198608944266 7.176569689846344 15.00450996547868 +2228 -5.6990706020201 6.093303436817313 -5.888931099426657 +2346 11.063469984568112 14.666691806624437 13.498424102898714 +2021 -9.51837399430748 13.232162855614964 7.079226513305437 +2547 -12.97946421167869 5.134376940765807 -14.234272980277911 +2562 -9.599835327298594 15.867329308029992 8.206285439551833 +2658 -5.251532335231824 2.808619446400209 11.396046473315309 +2715 13.155185917541463 13.99512984605009 14.147053581386103 +2726 -16.36632791848536 -9.6151682327187 -13.972233298153512 +194 -3.4600065604866956 8.186682758379575 7.76612120145187 +199 1.6794881864698201 -5.095968933628052 1.553478440936423 +482 1.815873294298947 5.480530536021581 -10.585087221578748 +545 5.946129691817585 -12.63771812985554 5.597393805479076 +662 -15.218302287931765 7.196434753543036 12.061885566433041 +667 -9.975041316959931 15.232473643464997 7.003688423538127 +747 -1.7894097871979016 6.793457143066669 7.268532393411373 +776 11.419787550531723 8.610600087874886 10.019197763542339 +904 5.982337107795224 6.4221315213214245 11.315750260869292 +1014 4.709701489622307 0.3540425487452808 3.4571828410629464 +1080 9.222254378177421 -11.658076218598659 12.960935394920002 +1126 -12.915897149560758 -8.226268346889025 15.787842338504355 +1130 -12.836900086247239 11.641365854564327 7.886891513304093 +1218 2.389864247271686 -3.7739881751565165 19.412472857429318 +1298 -14.370764179767983 -19.402733584966416 18.72565041382409 +1419 9.272479193257427 13.725797851878056 -5.318176641864486 +1479 -0.33813744902143716 2.537911935478904 8.005528817447297 +1490 3.46022670846924 -3.7894635598661295 -5.524182522638821 +1509 19.160930873175523 -8.675547317190718 -16.551602696953214 +1549 8.384278673869327 18.28126858083549 14.505281046579514 +1600 -6.584178636061894 -15.76186976365275 -8.777362857738138 +1688 -10.59903525572614 -3.0722067861455473 17.152483672065483 +1698 3.9629018472656474 18.171741125103313 15.749393458728678 +1780 13.330188101943845 15.780150166832083 -6.87170549483916 +2014 14.801525594993286 13.75215266373083 6.503897871230117 +2114 -13.886663718528657 3.918045977354742 1.6490077632857365 +2280 -18.873631759448212 -17.371557964359482 19.571645393301633 +2292 -3.8957133734534724 18.911795490184097 -9.538070652070912 +2421 -9.52191853058207 -7.147835738986548 -11.732892742114581 +1799 -9.493508528653686 0.022795802533910656 -13.472984540772408 +2500 10.83870117054106 -0.4925985955356969 -14.048644396067736 +2507 -18.090030338712054 -16.238063978443517 -16.796926076334703 +2670 14.919686184992326 0.8330375851581234 4.281823401218178 +2762 0.9638051965066078 14.581359925580632 -9.725687993905694 +2869 -0.09652211369710617 -12.707494798167097 -16.75688778563414 +2917 0.4738339499164433 10.169358688886492 -9.031766129619502 +32 -8.851877299499497 5.060124505777751 -6.057262697143965 +232 4.182650727688607 9.995433342630085 13.632247096994632 +315 7.751557680171592 -6.277473619544166 2.7924384118471575 +321 -3.1693156158412457 -7.488553298122871 13.997387328069408 +447 6.747704807392342 -5.104846162720485 -6.8036412974229625 +473 9.259639956693826 -11.583183382326295 11.180217562720896 +532 11.930777497264046 9.814640629964172 -10.92202484995901 +535 5.273028126837163 -1.7211634542819678 -9.437592391415976 +628 4.456222975265081 -9.392319299385292 2.8137171437165214 +683 -1.3793043705201455 0.6002482519535101 -10.942891623832098 +759 -11.052955159401549 12.263247114793012 -2.842839093951778 +808 8.54794311083727 0.6698308797012611 14.175825137391342 +827 4.860692139153597 -12.226328151080331 9.55357121002843 +906 9.060614147513935 -14.58571449395503 15.47427667578456 +942 -5.065127841271147 11.696097396525651 12.274711021080478 +961 3.9063661323145316 2.1034842608478344 12.70973792227325 +1100 7.35996282442799 11.48019328160461 12.819176265221532 +1120 13.167657959545979 -8.545735835823209 8.625392347961867 +1164 -4.756323773189589 3.1179342306193267 -4.689536388720471 +1240 6.760219181188143 1.057085479337057 7.3246139160490475 +1271 3.9814733857069093 16.759407128219927 -9.569435857780643 +1432 7.712450089207966 14.448747028868128 -4.54835641408125 +1448 17.09239325885919 -10.376209412101616 11.327045988313397 +1515 -18.039763439880108 5.544230669694517 15.398398954393164 +1516 -16.240112138292528 -4.7297694414157245 -14.457037049090497 +1632 -18.400656634924808 14.930800275576097 -15.635111480288437 +1742 9.5094185053113 -1.7234868435333495 -7.671510264892966 +1822 -11.479779097502387 9.228576848026524 13.228953786873337 +1842 -8.189605943314257 5.813929630155659 1.8382090263088096 +1948 18.941983385174527 -4.38185634426779 -6.841976571499573 +1976 17.75560323678968 5.375479103656799 1.08845377131664 +2029 -2.451129031453407 -1.633163403327487 -18.133331048589813 +2047 0.03310794771459686 10.36870586623999 9.989324996504141 +2050 -0.45519920247923756 -5.267849809727307 -4.385573037238056 +2142 -5.1323506748106995 7.050634951772475 14.842586067595704 +2170 -5.918115676371517 8.746860618252693 -9.21307010727463 +2232 -17.859777087838374 12.712111360223165 6.61777710876996 +2313 7.581840933922896 14.109938207119669 -15.919950542339024 +2357 -1.6778556667677327 -17.311217168354162 14.700816972318039 +2476 -11.724353195489373 13.939082082934913 12.7848406422039 +2484 9.558768983082174 4.656519031093524 -11.022533500126334 +2489 -17.795504640525973 -4.465498687476611 -1.6700262757159636 +2558 -10.433197865956071 1.452200438983357 -14.79209661676137 +2652 4.57064649581967 3.1571579758732775 -9.670274532942901 +2666 9.803871839577543 8.832858046601666 -13.996127024955298 +2773 7.812449744414837 9.842981477548514 -7.430396950840556 +2798 0.08685848032415354 12.314388269850676 -15.100365473497108 +2959 -7.290725713901503 -15.21276757644451 9.622793036918937 +989 12.406493509306443 15.356236294986115 -5.455041715232301 +192 12.225582332569436 6.944577047775229 4.549440488116919 +255 11.456621321443647 12.355574005326067 -8.891573374071243 +365 -10.140335442908425 11.515935507666866 -8.280347790840874 +625 -14.74085801389042 -11.589106223051855 -4.912757467913991 +666 -1.6963670215207347 1.1600091886092612 13.23580682841555 +698 1.9848036844288155 9.952842694139548 8.919527576080482 +772 2.1919360657846494 -7.234547689502 8.727817454451593 +1066 -2.858308916868216 -8.1449929519533 8.555595668916506 +1145 5.771151439253127 -11.818175611829057 3.2342516347377064 +1172 2.3558715737346296 1.5739157172373273 5.53608604069943 +1364 -9.054441512659633 11.133890003226064 15.127711573964566 +1375 19.263787032522252 -4.465070362423687 5.528832888754062 +1397 -17.17588283701793 -15.825851386485272 13.288134223317547 +1477 -17.18958786991095 -11.008203785091847 10.706736262174656 +1558 -14.346656190061033 -6.149976304266109 -15.32303438329883 +1635 -2.088435955002629 19.230873782730683 -16.233300240530863 +1781 -16.520023956553953 -6.044990273088409 -14.508824137759387 +2017 3.1799169525260282 -11.79282300937956 -7.532982014685295 +2020 -2.8634852014589214 5.061682628981274 18.169151173953846 +2179 7.711376329091912 -3.597939241634641 -0.40281694291293263 +1789 -4.797607865826543 -10.722224877236995 -3.5875358266478177 +2664 -9.919035935857993 -18.68622890324404 -10.431116177714049 +2818 17.490387773245786 15.903756575252938 -6.648995502771718 +1 -13.367490285484752 -2.924700674245853 -12.309011154098979 +233 1.8791091786548293 -2.1167301928248556 -9.963201103744753 +324 11.738884621388411 -4.120616917369708 0.23135213902886226 +328 8.052273497591097 5.692857419290877 8.762605507382354 +379 -13.28413198752736 -10.346483086185843 8.053579152271716 +534 6.92527141264565 -6.603267575701505 -8.138761539232982 +551 7.895288308320635 -13.087283751212656 -1.0956328092671508 +594 -9.853240005986018 -8.25201100278431 -0.7715196625615722 +647 -15.546460344810015 -15.244789782073692 -10.389815454846609 +677 13.85296266949898 0.4136459463518305 -8.361420490009346 +721 -2.7961209019894175 -9.219834011054298 -8.161161699440136 +857 -9.835755873617261 2.098103867796574 -12.326727644760254 +1116 -6.651257776806398 0.7689523733658398 12.619857799155598 +1274 -0.8673138430735986 5.486381035849865 -16.24785533503665 +1297 -15.883264113743161 -3.717474417598614 -10.586368176939354 +1326 2.3219021890822136 -9.414645565995883 -14.387714914221409 +1408 -1.1964725665346188 -0.4681014649715136 5.74440327215781 +1612 -18.42218910785885 5.771730824743565 -1.922707231553002 +1749 -3.82673086536481 2.5101317642879346 11.420462479636438 +1760 6.00318614168433 15.335126569071756 -0.5160017240810187 +2287 12.856845189851027 16.489408820214447 -1.0403801073620291 +2315 19.534514089914715 -0.7460351657508968 -1.5176196112184168 +2323 -16.352996130113084 18.487086078159475 -14.499050372909304 +2467 -4.082928561700919 7.827932407425761 -11.588615949566188 +2797 1.6231596831899147 4.726829622431411 -5.103102056253046 +2826 7.284320172484864 -8.807632586936586 -2.506444688869001 +2847 18.59913598142381 -5.24385303962377 6.997916368892379 +2920 -0.8031977127784661 -14.318449121087022 -9.687595571747362 +151 -7.892094518618033 -4.417695462610927 -6.944333246645876 +1313 9.663153946583664 -4.63141515741432 -7.523533878349177 +514 -1.0559953938172113 -9.386419444589684 3.2961852157669083 +524 12.518105548401772 -6.10417109433914 14.133105398259621 +688 -2.337855267943677 9.314125056215229 -1.7525399654181675 +770 -5.8609307061629785 9.260538252493696 13.099256122964976 +881 -8.04850398439912 -7.091698723689009 -9.906230607994553 +919 6.280292981814988 11.693772095115186 5.889270438148364 +945 11.277689263944035 7.165413667270851 13.8248921533845 +1021 2.906401355962719 1.3882025946417595 -9.633844264540832 +1151 -11.117972643460135 -1.520900108124735 10.143763529929199 +1154 9.291609693465306 9.640200029628366 -14.321699228002643 +1551 -14.443321501998325 15.303074006502206 9.478895183101375 +1761 2.80674138282685 -12.871011359310902 17.72487171089814 +2447 -0.39067880151866297 -18.27810289255897 -9.836204763888322 +2512 9.337716480667307 12.7642553225588 -18.43816708142256 +2540 -17.653994923818004 -16.886066893064022 -12.12163697571488 +2672 11.024334992694486 -15.986755454991954 13.29201232714901 +2718 1.7858347057854114 -4.705645683126996 -0.9392572144636442 +2728 -4.739315032630185 -10.82014165609678 -3.167890082195672 +2738 -18.485876639340958 -6.413001340244837 -7.17326339647625 +2844 4.392944489308171 -4.8107499604173505 -3.740829875385136 +2879 12.47024677917021 -14.221355046080646 15.258597591964405 +2915 2.0089620725017623 -17.134160231892324 11.827032583916818 +56 -10.981438713405753 -12.491275999541369 -11.977187284195724 +73 -13.225205725364424 -5.870082240909709 4.8753156777137345 +85 -12.388854958676465 -5.401214410532156 -2.041357784697582 +139 -8.418910451938636 -13.705994760441206 -5.597307091953877 +216 13.863306042863368 11.54841256593859 2.360186032914576 +223 -8.329999960543065 -12.317543827749857 6.584549881291841 +260 11.829644160584646 0.17628647738295775 -5.7317124544220395 +339 -13.520703819146044 13.516880054886467 -11.587087491856533 +405 -11.77318665528603 4.298690698222356 13.189468973515597 +1640 -2.011640151144795 16.568204332100898 -9.28697929338158 +536 6.405686304796782 -7.037058864627055 -3.229028289359846 +784 -5.671103502097673 -4.511864848585905 -5.40198707845047 +880 0.955334907902514 3.8023334361357417 -10.948967672181666 +994 6.41287499137381 -16.017508617522118 15.493005806532663 +1028 12.841521963471148 2.997815551604559 3.621639218843104 +1084 -10.933160381610575 -1.4917363610549446 9.860357191087685 +1147 -9.849801758683492 -5.099784881274821 -12.412109219279131 +1231 -16.696774737970294 1.974341964986196 -18.396525304811874 +1562 11.728095758483958 15.020640875967729 4.981001550683415 +1681 11.704184091270267 5.067475739466325 -2.0451086210150495 +1827 -15.863886078046429 8.424990958219453 -10.239331294619099 +1835 4.271604632011027 -6.13255778861527 3.078800153541242 +1855 -16.74444934766052 -15.432371650670058 2.881239333844865 +1906 -5.328901995011897 -4.173507588053779 6.696560173697186 +1973 -11.829003268271986 18.771324583552705 -18.85124406177215 +1979 -11.836654060045623 7.763534961251563 3.488138227945032 +2113 6.110024013935145 8.080207158025976 -4.45332043100755 +2359 7.728755624045716 14.144713040126554 19.83835179085308 +2365 12.833054159588196 8.563788916877936 10.149628106838653 +2441 0.5579286178136437 12.59962943073658 -2.6009282970629957 +2495 13.990805608225875 -12.039832312962712 -4.557954662205695 +2513 -16.647950554866902 -0.4910866367524386 11.362846874176192 +2572 9.905983097691358 0.523779979942809 19.261254676780524 +2615 14.36813650948475 19.683990988352214 -4.138804405284411 +2896 -10.831630177495057 7.007200283763606 -9.689472854259131 +2923 -14.947034720844377 15.087880499503195 -1.5203002883711858 +42 13.98078296254861 -13.980066862315361 7.705880185318445 +136 6.7539112100657865 -13.467812124677804 -2.3878849727312823 +147 1.1101144175468358 2.7270308138555768 -7.819401132442362 +164 5.716290424176688 11.70587209133668 0.9440005768582449 +261 10.589722203686845 5.493460386373693 9.54745018094424 +262 -4.682966980468231 -11.277025540959677 1.9406693861892952 +537 -10.52743750752414 12.413631871133894 9.15818385445002 +538 -11.9915260854235 -3.4279015495766982 9.110548174654062 +555 3.3078939634730955 11.912325310291845 6.078498949166254 +630 -9.123868897472432 0.08303041797174879 -6.713568111444616 +780 -0.6428653040264964 -13.814545600618258 -3.7625214334393773 +799 15.897678531927811 2.56201170769062 2.948084446760382 +892 -8.932712669165042 8.64753775359479 9.608441286220986 +901 4.152989737223928 -5.272916312504969 -12.29695408215429 +1977 4.090722719427862 10.840898073377897 -10.059831834041077 +1090 8.108226325768882 -0.3767254296672216 15.098253405304058 +1124 1.6626380437941657 -9.861542703365147 -3.7120798698566193 +1195 -5.925503172412495 2.95580534668059 -15.829970261171288 +1301 -5.780060100353015 16.65859498953672 -18.61908009315312 +1365 -19.29229660321033 0.8724759579748947 0.8411716019161886 +1563 12.986577199524078 2.0860313407317563 16.694751947942695 +1687 16.590632935064612 -16.962118361459826 3.051078585262408 +1703 3.1427255843618043 -9.779786587012829 1.9916887208954757 +1746 -5.610662186718499 2.638681659597236 16.34231146100809 +1793 3.870238469978515 -10.693760616056734 4.495030961196278 +1807 -9.18004312119279 16.57087429610841 -3.605916791557929 +1910 -4.218154808832191 8.275706071398945 -10.916979453241868 +1919 -19.176546160632945 -13.360964263974347 13.621143236583837 +1992 -11.420777006638186 -18.14186887974649 6.653539376207943 +2023 6.569729840391836 13.330585652644135 15.164228141732233 +2059 -7.917629992344242 -8.669903387709656 -0.08012505354378986 +559 -5.524210051708004 -9.465374202797749 0.2227784236706588 +2130 4.354848344012472 -18.004302786787317 6.338531969355446 +2273 -10.413389625387056 -18.36790346922394 9.413383551569648 +2297 15.160926541981945 18.478392552414487 -3.8390472793363917 +2416 14.695371849233108 -6.687836569457054 -1.5522972228883576 +2440 17.577407002043778 -10.898922768201954 5.320726227722079 +2453 -13.017687929181125 -10.203281964246006 17.434991739864746 +2517 8.094216360358462 3.1387643814972073 -5.267234632374534 +2637 9.908169382353668 -1.9243562730498769 -13.084070922672721 +2638 -17.533636678987154 7.130802786540362 -9.532405022539237 +2722 12.645134221589224 -14.364803239808136 -4.900817469524723 +2776 -14.35005572473583 15.100089561202813 7.712286835123525 +2814 -7.70053272110643 -4.867164927080393 -11.274632843504957 +2864 13.810459827423127 13.944390382533012 -15.577635729738098 +2918 11.27281190592465 5.704332529853966 1.9118051586157339 +2947 -10.30177451163137 15.475252519726098 2.999496579409986 +2964 13.610412043220958 -16.85180004929924 15.09889016535746 +39 -8.089589734135487 0.1625003245286638 -12.087632087496047 +66 1.608729532081818 -11.259928440084586 7.606704557478398 +106 -5.48913991134085 -11.579897448380924 10.069921535327802 +377 6.855885922127376 10.311538076341611 2.559155019516485 +528 2.297690991535742 -9.135682012201766 -7.83387718582674 +657 10.176141015762179 -0.6764674650092765 12.502499710447987 +746 0.5267417410351755 -6.464973104553375 -4.608621511650602 +805 -2.0007902319154245 -14.720453170443035 6.93845630962376 +1053 8.855925793795091 10.982548161858153 -13.647794519578488 +1061 -11.375985013689712 10.619923065347585 5.845550076175352 +1110 2.3825632330961954 -7.561968511019787 -1.3226923778622177 +1112 -11.473493136996964 6.595905776353855 -10.691365454018829 +1283 -7.037130435830825 14.116633138127108 18.215709754968533 +1391 14.15340916118452 16.519524767333156 -4.390950324381431 +2018 0.22391755132690427 3.477862841431781 10.97230848988125 +2115 18.99624836776456 6.210186881196452 -1.0800100392463163 +2277 -12.59773509889914 -6.800126447107948 -7.54318742621085 +2366 -8.83793651227347 4.982332260123542 17.090269243683064 +2516 17.970329690806906 8.524915110390664 -16.114076366302275 +2531 -7.71985978267249 -16.152908088642853 3.469301196958505 +2691 6.152107383838279 9.900998816830608 -12.158539946738776 +2827 -18.91991355075083 -11.36917293943904 18.816657871016556 +2856 16.17462403879287 6.727402459207942 -9.088801473171161 +2968 7.463506542761513 -15.085045422174463 0.6327983715492128 +204 0.09981874793197913 8.289547549159503 -9.831963425672972 +310 0.4188157619876877 -10.509976630943695 -7.438517000323002 +374 -10.491130318159124 2.9216972089642934 -3.606593681973984 +389 -0.5056028877178037 1.7944236157088598 7.702535080689157 +421 -11.621965603570514 10.706453753723752 -7.857621196818839 +465 -1.982707376456345 -7.457571890053484 -0.4994717988348658 +468 -8.022941376355684 -6.418307415757958 1.9523150320107 +968 12.762353114056848 12.938872577015847 6.916927200937309 +974 0.7446320766035379 -6.322928151893814 -4.059818421055038 +1173 -8.809238931323664 -8.666964600488436 -1.7206415718075718 +1182 -8.323812259763292 8.61994885708838 3.664460821149774 +1197 -11.212498253726476 11.886279058821243 4.45968739642885 +1208 9.023710305754959 -12.872501727547583 -7.323747243032011 +1348 14.07823162628223 7.187417981340761 1.3666322501270356 +1373 -13.35291711861014 -0.6050182719754784 16.971959728189464 +1447 17.13041793451804 1.6161532277216442 -2.7491563603923237 +69 6.0223605260831645 0.9916868081699585 8.813600195803375 +1886 7.689644686559568 -16.104452131125033 -5.1848948214722475 +1951 7.339261853541482 13.157681766407823 9.452282525735473 +1967 15.144068960776613 9.504183241190598 -18.624082420212453 +1985 -16.769050105548 2.225938830826062 16.538583618909684 +2056 -8.692031613656601 -11.954458747380967 19.36674946372861 +2069 -7.740780912801226 -15.03713901068198 -17.257617694661885 +2291 14.00907354671591 -18.55477069013324 4.177807521083909 +2560 -18.077197633253288 3.4761038050326696 -18.591816270012654 +2609 4.666510000924542 7.421162805034961 10.613626838430777 +2612 -3.769491807797185 -15.298592006660767 17.313429571115492 +2687 12.019126854237747 7.252445659767184 -3.117808464199604 +2768 -4.248674625101532 4.8384474737881 -10.406957779647298 +2889 11.374583080991208 -8.32052131211421 -6.968966380999982 +103 4.767203187110862 3.7642395036736103 -11.750690091162395 +155 -4.674852975808136 12.421075086699611 -6.586161750722438 +265 -12.97733999278354 -8.927815452075867 -7.113847680669369 +278 -8.784922883291898 3.623240761472179 12.805433238413839 +511 2.378872710773083 3.197764875273853 -11.53882341703634 +1011 -14.636591859178347 7.929444218557457 5.397580097914046 +1032 -9.907858137419666 0.0236643814669633 9.09436325697625 +1094 13.267902282365974 8.769686440975198 2.719716057331954 +1385 6.634021542164624 -3.5234146793235754 -2.0452204976427018 +1644 14.78748427519306 12.917826215760211 15.08136774862322 +1831 3.6571088221249624 12.994324570143734 7.419464983300335 +1864 18.547493492839894 -10.9526620766474 3.56368835034383 +1895 -16.71911726704111 18.393681595779498 -16.62728283714897 +2026 -5.606116473255784 0.6524426826641052 -13.113964740846052 +2145 -14.546553643466796 4.773465531549099 -5.153828963306857 +2209 -6.929146622050848 -13.071469564655436 19.223755711767613 +2246 13.308333960891954 1.2148046593382456 -7.01466272720278 +2247 10.765171196925042 17.86585715685731 9.043496132685796 +2332 -6.834234725305277 14.391876142134054 19.448214556358433 +2392 -13.533595882948218 -19.410272427109707 9.599398228774607 +2457 -7.173628864398844 -6.81714660531151 -19.249828346668153 +2566 17.522868752121628 13.109252527875794 18.555544538319538 +1884 -14.078060866068222 0.9340382167957191 16.49946872102742 +2808 -1.1964127043260202 0.5380026749348159 -16.049068599360478 +35 -3.019428232777262 4.672734654683404 -9.996393680002924 +48 -11.937315048620878 6.305188435770401 -9.458776571849715 +82 6.29983894951896 -11.398441829923902 -10.571336733785317 +108 -11.5441576102066 -5.493816189817909 -9.132296440383804 +135 4.596500735350087 7.9545129711748235 -7.059330887129422 +314 4.024066014873774 -7.499406114494512 0.6050661116957967 +604 5.392377688008225 -2.168069354243786 -11.790882049511824 +635 3.0908636510204164 -4.464525529134779 5.528349591303418 +771 16.42616798842558 -8.400553514461022 -3.4878492218820303 +872 -3.981500706452422 12.600928239146015 16.173079376216993 +875 5.988235234282369 7.464242722595763 1.0761907000938704 +1095 0.12397311185982236 -7.7459775514270985 12.147886654950042 +1220 -13.129527690475115 -8.629066557047206 -19.209918412953282 +1232 16.94400521012725 4.019300183847904 18.128485680612833 +1396 12.079380612781847 0.9187786280478323 -4.8103039303052135 +1401 -16.71390445496599 -11.573653574939916 -8.096419193278683 +1487 9.860903678999914 -12.458581091571574 12.27538629079051 +1548 14.788519927903153 -8.868981258127155 -14.574974506357123 +1663 5.31705994301685 6.3607418506262725 -18.249106038322857 +1710 -3.5904823412973474 14.643795953638902 -18.57497387336755 +1920 17.699261382324085 -0.9295271618823038 10.781184627924477 +2066 8.362971797508598 12.913800737741424 -13.381818740737938 +2295 -7.042383873904826 4.208144573204228 17.401309227908712 +2499 3.149529198129069 -13.010517717855581 -14.570164577896275 +2582 15.499542946881247 -12.576985875580078 -18.102689920094694 +2867 -10.429992445443057 16.132680428828913 -0.04200054670170165 +2887 7.701420696281869 -14.150169590464905 -3.311149618712712 +24 -1.6003070529484371 -2.871949281543293 1.0603343651020063 +28 -7.590496059806232 -5.781304467088922 4.0331823310009645 +65 13.702954827385067 -7.467543232443796 0.9231401890054083 +88 -7.828221031119957 -1.298760180629657 -8.566240873169976 +172 5.971956101633809 -1.1006572030930208 -2.9317804039436446 +294 -11.107346320930377 12.185102530415897 -0.81927197851833 +399 10.239936456839082 13.859643155806816 2.8595892547875503 +653 -13.737581768502524 12.086135309931214 -4.234023138591004 +678 -4.69030943340445 0.9603354269262174 -7.699283060975345 +689 2.7916107866109217 1.1612166395096144 0.8335338879243539 +720 3.719127504077375 -6.009719139835266 -3.9958886111304377 +2240 1.1134543667672434 -17.811502709987106 -6.291450758767102 +975 1.7002710450828666 1.4142057241056267 2.354049739351454 +1052 -0.6421457908162863 -1.7216870766273178 3.194906847301963 +1114 11.803293344272557 13.100131613971513 3.437842829013619 +1281 -8.459559391164635 15.09695000736993 -5.861171861758025 +1427 -10.18050758402495 15.571331036013744 10.877194357424251 +1433 -4.24250576975349 -9.060668408866299 16.75995653014593 +1437 -2.9923343895605385 -4.890380312854992 -9.525395833187325 +1554 3.894548695396892 5.957972266564933 -7.204600331892954 +1627 -2.51587318566929 7.61646871753722 0.9062021821996737 +1651 6.479320932282661 -16.837075187029924 -11.771507681051013 +1672 -6.052909437296341 16.463429953982075 -6.543936578404647 +1757 15.659852025185948 16.61215826826801 -15.2206030083744 +1838 -7.438920926018795 2.42374700189839 9.693596177429278 +1889 -11.936070168222706 -17.01604713014535 -1.8902175471059728 +1981 3.766329210277972 6.589327354968951 -17.328746646192926 +2183 -2.045279153495559 -0.10019216356970254 -3.3015345069660875 +2409 17.25280817281867 -18.6013079908628 5.885845607379763 +2514 1.358148481182193 18.688130732390864 -6.14148793243422 +2579 -18.336391962399254 -2.3774806146846874 13.894520839267368 +2617 -8.329028969284408 14.112486493887928 -12.283917400501808 +2654 11.349233205965277 -3.2526225765312775 2.767032733977089 +2835 -1.9769639812780533 11.475252696448841 -8.963821573825776 +2910 -10.414412593879165 3.632087656259433 16.289281519734534 +2962 17.94796292484188 -14.656117312252267 -1.8886114878509044 +95 -6.010616985739609 12.525017305982484 -6.075905528840144 +124 -4.804445535722978 3.33295271789681 7.0837336561371265 +508 11.97769517996487 9.64230392090354 -6.030219897568888 +613 -13.670735492519656 -8.78501204125535 8.705935044651195 +758 -9.10682200072907 -7.6728780208173415 -1.7125108502440658 +807 -13.505392230740856 -9.012330256254318 13.589021615393614 +1234 15.39935759107301 -11.092290331439406 8.412964405159427 +1410 -9.197895254591824 -9.118773734644625 -19.18371208857891 +1534 -13.27961551566979 16.391322602103255 -3.4684998613520728 +1537 15.50994026423711 5.398636634796869 -1.633146081532414 +1716 15.066126302855947 -7.108323542196062 -13.932785015221109 +1785 -12.761652262323047 -18.24431204460591 9.38426076959346 +1858 -5.90545458199429 -13.616261618092603 -5.122027037234463 +1943 7.393907253166882 -9.049628467051003 6.343145757829771 +2158 6.011421612029508 -3.0234136291868583 14.165598656351007 +2160 -7.071719038966821 -18.51170375494176 -16.663641591344156 +2796 18.303157693894885 -2.2370648433374973 -16.911987044974158 +2878 -12.127406176006536 -18.97247901610492 -0.6949866251745241 +68 7.366710778086018 4.3542454643979855 -10.830369316287747 +99 4.721614254195144 -1.899620072668731 5.270872211248402 +282 11.76400014351112 -4.531445455579077 -3.282878255132512 +383 -11.767345744063842 -10.207090084975952 12.846754825153965 +460 11.878526687760393 4.8585969347303095 -12.911878455203821 +500 11.175666990882442 -5.505374489688485 -6.213184899703319 +866 -6.5876026145350846 -8.343442682476866 8.192797476936668 +900 7.3610020367026525 -3.749666240843082 -11.922874051539178 +1004 -13.578492598737437 4.833993288577111 -0.6689457322890442 +1206 -16.787411980253786 7.162091229917968 6.8231693836554905 +1494 12.950832580487226 -10.778442225608968 -7.7999681768085685 +1506 8.160671770710621 -16.542808429397375 -4.350956273313075 +1544 0.7587845418318895 17.78520317890332 -13.945143878447608 +1587 -11.090661838389426 3.8875811686148873 -0.863739286252643 +1652 16.238079567715317 15.01286760392522 -8.085313950554129 +1715 -15.458573700669502 0.9241899344463359 7.751477564553571 +1804 7.073284807649246 10.886044709299306 4.052249221398617 +1821 7.023640129023922 -0.4385949260867339 -7.848491132548266 +1832 0.339878460669395 -7.218262459358984 19.58891770280824 +2256 5.798041035668019 16.447316124217227 -3.017915429426457 +2210 -0.02610968360190616 -5.076459360184865 -1.5141385142844044 +41 -1.606854444559823 -0.23998439958097745 11.958645397944949 +101 14.107820991163855 8.511035801480215 -5.520104591372095 +198 -6.659553419176588 7.057528977619731 -12.525061422501535 +428 4.084610885782839 -3.987541996776701 11.510522578489237 +600 4.825613755317223 -0.4266279792547336 1.742827344679067 +789 -13.887272778456671 13.813648160102419 -3.8849480875699407 +954 -12.642427349357602 10.55463248660764 -12.528499456294755 +1097 -13.854445585830552 9.709970841033448 13.959820261997468 +1129 -13.655492281321045 -14.159563207969367 -15.299108761853022 +1161 -6.61298653450513 -9.924282723638786 -11.914793481833865 +1162 9.17952388355728 -10.519694399491815 -14.053361391017678 +1167 7.811955456742992 -10.024387294210342 5.814500503525913 +1174 15.77350863635602 8.176191086807448 0.09286648994764858 +1759 17.438648446589067 8.56739004849059 -7.7121980240554695 +1773 -5.965939704324487 -11.17112573929781 15.989031990619452 +1974 17.125258596915852 -6.710788707519208 4.6213440904807745 +2112 10.289784665683513 -15.771991222080883 17.076398202665224 +2919 7.020520997694518 -13.668812606945357 13.093022479729093 +104 2.694261283766279 8.256653528418196 0.6881084479076419 +1357 -5.6061178238056115 0.6297439917028045 -2.680638003428377 +2385 10.938482292185205 -8.771257735647506 -18.24268023174468 +2109 10.062379341133207 3.1429311562290945 -13.622296858354968 +2362 15.011413028976342 13.958224100923848 -18.232466169399952 +121 -6.514184703570357 -0.3894391847386166 7.068030457072635 +197 0.7924146331801465 -13.007893470012341 9.297608913552057 +731 13.434191867382756 -8.248677335975222 -1.1851347832684127 +664 9.01364679529034 13.431502252114463 14.481120234947909 +960 7.313165537855884 9.659803209518872 -11.810057035455827 +1111 1.4460656180609446 12.146522943136912 -2.871978754731447 +1438 -15.433853181863476 -14.721298789103034 0.01093910849078047 +1706 10.846818267018865 18.352374189755313 -5.406449582417788 +1878 8.393882251190387 -16.276520246025818 3.1499683987720095 +340 -8.149256698881002 11.405605097524251 -3.4829520978365824 +357 9.499298409790114 -11.738193272891042 -2.5695721845368316 +806 -12.916189702066877 -13.143198317232374 -0.5143064056599679 +1682 13.72993210762739 -6.9222287627857595 17.51338931406941 +1446 -13.340391243471789 13.952252316346673 -1.021181840797822 +2554 9.804695109201822 -16.523471950483867 7.0930642468444045 +2373 -11.017824149315036 13.086921697486595 -4.021518661312548 +2111 -1.0047699027231247 7.650718277914335 -11.356775145620219 +2275 14.067621743333826 -14.360794442904794 -15.911013059843327 +2694 -5.279871141283455 -3.165422994579214 18.188571423458043 +2399 -1.3792422922680758 -15.223121219939038 -7.618802886020248 +1455 8.149352228579557 -10.825240164204683 -10.47247070697683 +234 -10.76134370704678 -3.427208120579764 -7.403484597499105 +1808 1.3591107296840588 -4.332381269149936 1.632136913840878 +251 0.18005721222562182 4.76970859790914 14.2405164677342 +349 13.024219442017673 -6.733126029860115 6.472725460569033 +796 15.273787117013828 12.202972741961656 -2.301316366211846 +2552 4.643744311741359 16.728450427331857 18.84360833009555 +1229 -10.314240305553046 1.927766940114816 -17.32251687009723 +33 3.7546139615737486 -1.0525442227325994 -11.183243271767353 +1668 -9.425968097520016 -1.4228327334913748 -10.47779462915132 +158 4.067237042923877 13.863714232653344 -13.223303956540327 +2400 7.974368203597156 -12.305055113277286 5.84701370443851 +1685 0.5080366060630412 -2.881938041238056 1.1714283953901679 +804 -3.615234819505437 -11.09345193719286 -11.905731829724735 +1353 0.4814526387556501 -18.555428280144824 -6.874307803600548 +2544 -10.628946065276365 3.726110544455305 -10.381962040687108 +22 -10.056949402544367 4.560419724600141 -10.384330705799007 +1018 -12.881109680053669 -12.079472350212026 -7.129400523192977 +1718 14.882615983048499 4.882514673634039 -14.436958844561246 +2653 18.75026208742554 -12.813856674606185 -1.5019067669978072 +2868 13.160947399609594 -6.7507087521071165 -0.03346156765866535 +2006 -2.892433196736403 -11.151003130880287 1.452508512255615 +2328 -15.45479699757919 -13.986806371478613 -1.177108184152851 +1546 -4.156766405925731 -18.181015734557796 14.993734293413537 +1916 13.430212432061092 11.58909583415679 -16.060312163938374 +332 1.2576645126867545 3.7740145505008993 11.696052316931485 +1015 2.9820228673102394 -2.7811648737094736 15.817192670583902 +1153 -1.2968297158497366 13.523959943229821 -0.9856758798193691 +1636 3.1427133929120052 -9.98468828379863 7.1948572132149495 +1653 5.927421062854784 -3.8718310022878724 -18.117997270854747 +1770 12.519654582306087 -6.877881761866644 18.186004886016427 +2486 -5.49944015596549 -9.317730949860588 7.5423130032406736 +2841 1.677007053872281 8.300069515780816 6.62920454888189 +2335 -10.883530128327966 -3.028776772058384 2.4133015594229574 +305 -7.74249404319521 2.9215357652095544 -6.319978867870987 +436 5.852135899565943 13.212769144037765 3.886727975664093 +1661 -8.64118899733373 19.503919770679385 -12.73302175757051 +633 -6.968536321355608 -2.299809561665563 -2.62733304227677 +2071 -2.3788501779970863 -1.8261731073618326 -9.026553244541692 +1670 14.575181820858559 11.315530304289746 10.900490903943252 +1883 -6.8362277353367755 -19.10464345727179 12.019537310070156 +2709 9.350261957028845 -11.542058903514121 13.405930018857608 +1667 -4.955675195672617 -2.2343026769282073 -9.68127877644112 +1473 11.639484596452077 15.0676983573892 12.015640353293122 +1367 15.258724326451466 16.058808090831462 12.562337047001408 +2534 10.122786861600309 -0.6064592356393937 -7.246316571250921 +2890 -5.0767896206525 0.23273045100893455 -12.473379137134977 +238 0.5397949276884527 -5.344701199953292 -9.95262098932802 +1511 6.3717649690380975 17.54191146447949 12.318381902350522 +959 -10.654483268600218 6.720770154882398 -4.633369778894626 +2161 -18.088216404287497 14.248731895120583 4.397231917430295 +2805 -3.411020367602394 12.998449769841725 -1.634348837407725 +661 -9.68407335986619 1.1458951098050734 4.891785925445228 +1896 5.098026768104461 9.21429290377474 8.316838181611637 +375 9.810635568285528 9.734053686938635 -13.259067945647686 +2679 -9.901524469527768 1.2778277020542463 -5.997993254241698 +1583 0.47806723010202845 2.9320536232166297 8.724059889682737 +496 -11.905058303097334 13.242925900870825 3.6984494434906883 +331 -3.4758523673267425 -4.617347489563868 -10.445173332089329 +499 3.5940577670935565 4.654911817696662 0.30861824383283687 +1595 -11.758456841733029 -10.538584320624494 -13.38948406004756 +1972 -12.872313577638627 3.1360449216635633 -11.780173484023177 +1290 17.511749784890714 -16.9951394325122 -3.231746578411683 +2892 -17.2187426635682 8.496472658765061 15.36293260337293 +723 -8.811126583929111 -7.696841717507485 -12.119558448834562 +2520 0.6569717004780673 -8.083250841592342 -16.852470704886883 +2786 14.19098207792586 -18.273847291799875 -16.69836795056262 diff --git a/examples/nb3b/in.nb3b.screened b/examples/nb3b/in.nb3b.screened new file mode 100644 index 0000000000..bc2619dccc --- /dev/null +++ b/examples/nb3b/in.nb3b.screened @@ -0,0 +1,35 @@ +### LAMMPS input file + +units metal +dimension 3 +boundary p p p +atom_style charge + +read_data data.NaPO3 + +pair_style hybrid/overlay coul/dsf 0.2 12.0 table spline 20000 buck 7.0 nb3b/screened + +pair_coeff * * coul/dsf +pair_coeff 1 3 table Table_NP.dat Pair_P-O 7.0 +pair_coeff 2 3 table Table_NP.dat Pair_Na-O 7.0 +pair_coeff 3 3 table Table_NP.dat Pair_O-O 7.0 + +# pair Buckingham +pair_coeff 1 1 buck 5.093669 0.905598 0.0 + +# shrm +pair_coeff * * nb3b/screened PSiO.nb3b.screened P NULL O + +neighbor 1.0 bin +neigh_modify every 10 delay 10 check no +timestep 0.002 + +thermo 100 +thermo_style custom step density lx press pe evdwl ecoul temp + +#dump 2 all custom 10000 NaPO3-melt.lammpstrj id type element x y z +#dump_modify 2 element P Na O +variable temp equal 2500 + +fix 1 all npt temp ${temp} ${temp} $(100*dt) iso 1 1 $(1000*dt) +run 1000 diff --git a/examples/nb3b/log.30Oct23.nb3b.screened.g++.1 b/examples/nb3b/log.30Oct23.nb3b.screened.g++.1 new file mode 100644 index 0000000000..2768917c7e --- /dev/null +++ b/examples/nb3b/log.30Oct23.nb3b.screened.g++.1 @@ -0,0 +1,132 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-700-g901ed98d31) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +### LAMMPS input file + +units metal +dimension 3 +boundary p p p +atom_style charge + +read_data data.NaPO3 +Reading data file ... + orthogonal box = (0 0 0) to (34.33782 34.33782 34.33782) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3000 atoms + reading velocities ... + 3000 velocities + read_data CPU = 0.019 seconds + +pair_style hybrid/overlay coul/dsf 0.2 12.0 table spline 20000 buck 7.0 nb3b/screened + +pair_coeff * * coul/dsf +pair_coeff 1 3 table Table_NP.dat Pair_P-O 7.0 +WARNING: 1 of 4995 force values in table Pair_P-O are inconsistent with -dE/dr. +WARNING: Should only be flagged at inflection points (src/pair_table.cpp:466) +pair_coeff 2 3 table Table_NP.dat Pair_Na-O 7.0 +WARNING: 2 of 4995 force values in table Pair_Na-O are inconsistent with -dE/dr. +WARNING: Should only be flagged at inflection points (src/pair_table.cpp:466) +pair_coeff 3 3 table Table_NP.dat Pair_O-O 7.0 + +# pair Buckingham +pair_coeff 1 1 buck 5.093669 0.905598 0.0 + +# shrm +pair_coeff * * nb3b/screened PSiO.nb3b.screened P NULL O +Reading nb3b/screened potential file PSiO.nb3b.screened with DATE: 2023-10-30 + +neighbor 1.0 bin +neigh_modify every 10 delay 10 check no +timestep 0.002 + +thermo 100 +thermo_style custom step density lx press pe evdwl ecoul temp + +#dump 2 all custom 10000 NaPO3-melt.lammpstrj id type element x y z +#dump_modify 2 element P Na O +variable temp equal 2500 + +fix 1 all npt temp ${temp} ${temp} $(100*dt) iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 ${temp} $(100*dt) iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 2500 $(100*dt) iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 2500 0.2000000000000000111 iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 2500 0.2000000000000000111 iso 1 1 2 +run 1000 +Neighbor list info ... + update: every = 10 steps, delay = 10 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 6 6 6 + 6 neighbor lists, perpetual/occasional/extra = 6 0 0 + (1) pair coul/dsf, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) pair table, perpetual, skip from (5) + attributes: half, newton on, cut 8 + pair build: skip + stencil: none + bin: none + (3) pair buck, perpetual, skip from (5) + attributes: half, newton on, cut 8 + pair build: skip + stencil: none + bin: none + (4) pair nb3b/screened, perpetual, skip from (6) + attributes: full, newton on, cut 4.3 + pair build: skip + stencil: none + bin: none + (5) neighbor class addition, perpetual, trim from (1) + attributes: half, newton on, cut 8 + pair build: trim + stencil: none + bin: none + (6) neighbor class addition, perpetual + attributes: full, newton on, cut 4.3 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 12.11 | 12.11 | 12.11 Mbytes + Step Density Lx Press PotEng E_vdwl E_coul Temp + 0 2.509108 34.33782 46464.417 -50581.248 2292.3853 -52873.634 2500 + 100 2.4533672 34.595928 33156.229 -50182.221 2373.5614 -52555.782 1666.1883 + 200 2.3649528 35.021791 29182.391 -50158.578 2367.6353 -52526.213 1885.4424 + 300 2.2932707 35.382952 14450.387 -50100.892 2239.9823 -52340.875 2045.1557 + 400 2.2282371 35.723887 16680.683 -50048.753 2281.6385 -52330.392 2257.1768 + 500 2.1753698 36.010969 15871.062 -49981.163 2285.6757 -52266.839 2396.7925 + 600 2.1285968 36.272824 15066.532 -49934.767 2282.4577 -52217.225 2540.7515 + 700 2.0841139 36.529076 7572.3436 -49895.93 2222.7473 -52118.677 2577.5774 + 800 2.0485057 36.739517 6642.7187 -49870.601 2230.3801 -52100.981 2556.7855 + 900 2.0180051 36.923689 8318.7918 -49890.3 2255.1538 -52145.454 2538.111 + 1000 1.990678 37.091879 7724.2804 -49928.89 2250.855 -52179.745 2492.3778 +Loop time of 30.3284 on 1 procs for 1000 steps with 3000 atoms + +Performance: 5.698 ns/day, 4.212 hours/ns, 32.972 timesteps/s, 98.917 katom-step/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 | 27.347 | 27.347 | 27.347 | 0.0 | 90.17 +Neigh | 2.8101 | 2.8101 | 2.8101 | 0.0 | 9.27 +Comm | 0.067332 | 0.067332 | 0.067332 | 0.0 | 0.22 +Output | 0.00047847 | 0.00047847 | 0.00047847 | 0.0 | 0.00 +Modify | 0.087652 | 0.087652 | 0.087652 | 0.0 | 0.29 +Other | | 0.01585 | | | 0.05 + +Nlocal: 3000 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 11846 ave 11846 max 11846 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 811471 ave 811471 max 811471 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 811471 +Ave neighs/atom = 270.49033 +Neighbor list builds = 100 +Dangerous builds not checked +Total wall time: 0:00:30 diff --git a/examples/nb3b/log.30Oct23.nb3b.screened.g++.4 b/examples/nb3b/log.30Oct23.nb3b.screened.g++.4 new file mode 100644 index 0000000000..fd42272af4 --- /dev/null +++ b/examples/nb3b/log.30Oct23.nb3b.screened.g++.4 @@ -0,0 +1,132 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-700-g901ed98d31) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +### LAMMPS input file + +units metal +dimension 3 +boundary p p p +atom_style charge + +read_data data.NaPO3 +Reading data file ... + orthogonal box = (0 0 0) to (34.33782 34.33782 34.33782) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3000 atoms + reading velocities ... + 3000 velocities + read_data CPU = 0.011 seconds + +pair_style hybrid/overlay coul/dsf 0.2 12.0 table spline 20000 buck 7.0 nb3b/screened + +pair_coeff * * coul/dsf +pair_coeff 1 3 table Table_NP.dat Pair_P-O 7.0 +WARNING: 1 of 4995 force values in table Pair_P-O are inconsistent with -dE/dr. +WARNING: Should only be flagged at inflection points (src/pair_table.cpp:466) +pair_coeff 2 3 table Table_NP.dat Pair_Na-O 7.0 +WARNING: 2 of 4995 force values in table Pair_Na-O are inconsistent with -dE/dr. +WARNING: Should only be flagged at inflection points (src/pair_table.cpp:466) +pair_coeff 3 3 table Table_NP.dat Pair_O-O 7.0 + +# pair Buckingham +pair_coeff 1 1 buck 5.093669 0.905598 0.0 + +# shrm +pair_coeff * * nb3b/screened PSiO.nb3b.screened P NULL O +Reading nb3b/screened potential file PSiO.nb3b.screened with DATE: 2023-10-30 + +neighbor 1.0 bin +neigh_modify every 10 delay 10 check no +timestep 0.002 + +thermo 100 +thermo_style custom step density lx press pe evdwl ecoul temp + +#dump 2 all custom 10000 NaPO3-melt.lammpstrj id type element x y z +#dump_modify 2 element P Na O +variable temp equal 2500 + +fix 1 all npt temp ${temp} ${temp} $(100*dt) iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 ${temp} $(100*dt) iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 2500 $(100*dt) iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 2500 0.2000000000000000111 iso 1 1 $(1000*dt) +fix 1 all npt temp 2500 2500 0.2000000000000000111 iso 1 1 2 +run 1000 +Neighbor list info ... + update: every = 10 steps, delay = 10 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 6 6 6 + 6 neighbor lists, perpetual/occasional/extra = 6 0 0 + (1) pair coul/dsf, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) pair table, perpetual, skip from (5) + attributes: half, newton on, cut 8 + pair build: skip + stencil: none + bin: none + (3) pair buck, perpetual, skip from (5) + attributes: half, newton on, cut 8 + pair build: skip + stencil: none + bin: none + (4) pair nb3b/screened, perpetual, skip from (6) + attributes: full, newton on, cut 4.3 + pair build: skip + stencil: none + bin: none + (5) neighbor class addition, perpetual, trim from (1) + attributes: half, newton on, cut 8 + pair build: trim + stencil: none + bin: none + (6) neighbor class addition, perpetual + attributes: full, newton on, cut 4.3 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 7.188 | 7.188 | 7.189 Mbytes + Step Density Lx Press PotEng E_vdwl E_coul Temp + 0 2.509108 34.33782 46464.417 -50581.248 2292.3853 -52873.634 2500 + 100 2.4533672 34.595928 33156.229 -50182.221 2373.5614 -52555.782 1666.1883 + 200 2.3649528 35.021791 29182.391 -50158.578 2367.6353 -52526.213 1885.4424 + 300 2.2932707 35.382952 14450.387 -50100.892 2239.9823 -52340.875 2045.1557 + 400 2.2282371 35.723887 16680.683 -50048.753 2281.6385 -52330.392 2257.1768 + 500 2.1753698 36.010969 15871.062 -49981.163 2285.6757 -52266.839 2396.7925 + 600 2.1285968 36.272824 15066.532 -49934.767 2282.4577 -52217.225 2540.7515 + 700 2.0841139 36.529076 7572.3446 -49895.929 2222.7474 -52118.677 2577.5774 + 800 2.0485057 36.739517 6642.7277 -49870.601 2230.3802 -52100.981 2556.7856 + 900 2.0180051 36.923689 8318.7257 -49890.301 2255.153 -52145.454 2538.1115 + 1000 1.990678 37.091879 7730.4071 -49928.905 2250.9166 -52179.822 2492.4197 +Loop time of 9.72954 on 4 procs for 1000 steps with 3000 atoms + +Performance: 17.760 ns/day, 1.351 hours/ns, 102.780 timesteps/s, 308.339 katom-step/s +99.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 | 7.1441 | 8.0123 | 8.622 | 19.6 | 82.35 +Neigh | 0.7458 | 0.78431 | 0.80001 | 2.5 | 8.06 +Comm | 0.26061 | 0.88607 | 1.7928 | 61.3 | 9.11 +Output | 0.00024827 | 0.00027521 | 0.00035196 | 0.0 | 0.00 +Modify | 0.03802 | 0.038395 | 0.038805 | 0.1 | 0.39 +Other | | 0.008186 | | | 0.08 + +Nlocal: 750 ave 765 max 731 min +Histogram: 1 0 0 0 1 0 0 1 0 1 +Nghost: 6607.5 ave 6671 max 6552 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 202867 ave 217674 max 182729 min +Histogram: 1 0 0 0 1 0 0 0 1 1 + +Total # of neighbors = 811469 +Ave neighs/atom = 270.48967 +Neighbor list builds = 100 +Dangerous builds not checked +Total wall time: 0:00:09 diff --git a/src/.gitignore b/src/.gitignore index b18ab895da..60cfe7eea3 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1297,6 +1297,8 @@ /pair_morse_soft.h /pair_nb3b_harmonic.cpp /pair_nb3b_harmonic.h +/pair_nb3b_screened.cpp +/pair_nb3b_screened.h /pair_nm_cut.cpp /pair_nm_cut.h /pair_nm_cut_coul_cut.cpp diff --git a/src/MANYBODY/pair_nb3b_harmonic.cpp b/src/MANYBODY/pair_nb3b_harmonic.cpp index f0497d437c..d1ba719906 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.cpp +++ b/src/MANYBODY/pair_nb3b_harmonic.cpp @@ -37,18 +37,19 @@ using MathConst::MY_PI; #define DELTA 4 #define SMALL 0.001 +static const char *substyle[] = { "nb3n/harmonic", "nb3b/screened" }; + /* ---------------------------------------------------------------------- */ -PairNb3bHarmonic::PairNb3bHarmonic(LAMMPS *lmp) : Pair(lmp) +PairNb3bHarmonic::PairNb3bHarmonic(LAMMPS *lmp) : Pair(lmp), params(nullptr) { + variant = HARMONIC; single_enable = 0; restartinfo = 0; one_coeff = 1; manybody_flag = 1; centroidstressflag = CENTROID_NOTAVAIL; unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); - - params = nullptr; } /* ---------------------------------------------------------------------- @@ -191,9 +192,10 @@ void PairNb3bHarmonic::coeff(int narg, char **arg) void PairNb3bHarmonic::init_style() { - if (atom->tag_enable == 0) error->all(FLERR, "Pair style nb3b/harmonic requires atom IDs"); + if (atom->tag_enable == 0) + error->all(FLERR, "Pair style {} requires atom IDs", substyle[variant]); if (force->newton_pair == 0) - error->all(FLERR, "Pair style nb3b/harmonic requires newton pair on"); + error->all(FLERR, "Pair style {} requires newton pair on", substyle[variant]); // need a full neighbor list @@ -222,14 +224,14 @@ void PairNb3bHarmonic::read_file(char *file) // open file on proc 0 if (comm->me == 0) { - PotentialFileReader reader(lmp, file, "nb3b/harmonic", unit_convert_flag); + PotentialFileReader reader(lmp, file, substyle[variant], unit_convert_flag); char *line; // transparently convert units for supported conversions int unit_convert = reader.get_unit_convert(); double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); - while ((line = reader.next_line(NPARAMS_PER_LINE))) { + while ((line = reader.next_line(NPARAMS_PER_LINE + ((variant == SCREENED) ? 1 : 0)))) { try { ValueTokenizer values(line); @@ -269,6 +271,10 @@ void PairNb3bHarmonic::read_file(char *file) params[nparams].kelement = kelement; params[nparams].k_theta = values.next_double(); params[nparams].theta0 = values.next_double(); + if (variant == SCREENED) + params[nparams].rho = values.next_double(); + else + params[nparams].rho = 1.0; // dummy value params[nparams].cutoff = values.next_double(); if (unit_convert) params[nparams].k_theta *= conversion_factor; @@ -276,9 +282,9 @@ void PairNb3bHarmonic::read_file(char *file) error->one(FLERR, e.what()); } - if (params[nparams].k_theta < 0.0 || params[nparams].theta0 < 0.0 || - params[nparams].cutoff < 0.0) - error->one(FLERR, "Illegal nb3b/harmonic parameter"); + if ((params[nparams].k_theta < 0.0) || (params[nparams].theta0 < 0.0) || + (params[nparams].cutoff < 0.0) || (params[nparams].rho <= 0.0)) + error->one(FLERR, "Illegal {} parameter", substyle[variant]); nparams++; } diff --git a/src/MANYBODY/pair_nb3b_harmonic.h b/src/MANYBODY/pair_nb3b_harmonic.h index c92b65950f..9e4b717780 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.h +++ b/src/MANYBODY/pair_nb3b_harmonic.h @@ -35,23 +35,26 @@ class PairNb3bHarmonic : public Pair { void init_style() override; static constexpr int NPARAMS_PER_LINE = 6; + enum { HARMONIC = 0, SCREENED }; protected: struct Param { double k_theta, theta0, cutoff; + double rho; // added for screened harmonic style double cut, cutsq; int ielement, jelement, kelement; }; double cutmax; // max cutoff for all elements Param *params; // parameter set for an I-J-K interaction + int variant; void allocate(); void read_file(char *); void setup_params(); void twobody(Param *, double, double &, int, double &); - void threebody(Param *, Param *, Param *, double, double, double *, double *, double *, double *, - int, double &); + virtual void threebody(Param *, Param *, Param *, double, double, double *, double *, double *, + double *, int, double &); }; } // namespace LAMMPS_NS diff --git a/src/MANYBODY/pair_nb3b_screened.cpp b/src/MANYBODY/pair_nb3b_screened.cpp new file mode 100644 index 0000000000..48ca91c6db --- /dev/null +++ b/src/MANYBODY/pair_nb3b_screened.cpp @@ -0,0 +1,89 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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: Federica Lodesani + (based on nb3b harmonic by Todd R. Zeitler and Stillinger-Weber pair style) +------------------------------------------------------------------------- */ + +#include "pair_nb3b_screened.h" + +#include + +#define SMALL 0.001 + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairNb3bScreened::PairNb3bScreened(LAMMPS *lmp) : PairNb3bHarmonic(lmp) +{ + variant = SCREENED; +} + +/* ---------------------------------------------------------------------- */ + +void PairNb3bScreened::threebody(Param *paramij, Param *paramik, Param *paramijk, double rsq1, + double rsq2, double *delr1, double *delr2, double *fj, double *fk, + int eflag, double &eng) +{ + double dtheta, tk; + double r1, r2, c, s, a, a11, a12, a22; + double scr, t00, rho1inv, rho2inv; + double ratio1, ratio2; + + // angle (cos and sin) + + r1 = sqrt(rsq1); + r2 = sqrt(rsq2); + + c = delr1[0] * delr2[0] + delr1[1] * delr2[1] + delr1[2] * delr2[2]; + c /= r1 * r2; + + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + + s = sqrt(1.0 - c * c); + if (s < SMALL) s = SMALL; + s = 1.0 / s; + + // force & energy + + // Harmonic function multiplied by a screening function + // + // Uijk=k/2(theta-theta0)**2 * exp[-(rij/rhoij+rik/rhoik)] + // + rho1inv = paramij->rho; + rho2inv = paramik->rho; + scr = exp(-r1 * rho1inv - r2 * rho2inv); + + dtheta = acos(c) - paramijk->theta0; + tk = paramijk->k_theta * dtheta * scr; + t00 = tk * dtheta; + + if (eflag) eng = t00; + + a = -2.0 * tk * s; + a11 = a * c / rsq1; + a12 = -a / (r1 * r2); + a22 = a * c / rsq2; + ratio1 = rho1inv / r1; + ratio2 = rho2inv / r2; + + fj[0] = a11 * delr1[0] + a12 * delr2[0] + t00 * ratio1 * delr1[0]; + fj[1] = a11 * delr1[1] + a12 * delr2[1] + t00 * ratio1 * delr1[1]; + fj[2] = a11 * delr1[2] + a12 * delr2[2] + t00 * ratio1 * delr1[2]; + fk[0] = a22 * delr2[0] + a12 * delr1[0] + t00 * ratio2 * delr2[0]; + fk[1] = a22 * delr2[1] + a12 * delr1[1] + t00 * ratio2 * delr2[1]; + fk[2] = a22 * delr2[2] + a12 * delr1[2] + t00 * ratio2 * delr2[2]; +} diff --git a/src/MANYBODY/pair_nb3b_screened.h b/src/MANYBODY/pair_nb3b_screened.h new file mode 100644 index 0000000000..22286c7cb4 --- /dev/null +++ b/src/MANYBODY/pair_nb3b_screened.h @@ -0,0 +1,39 @@ +/* -*- c++ -*- --------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 +// clang-format off +PairStyle(nb3b/screened,PairNb3bScreened); +// clang-format on +#else + +#ifndef LMP_PAIR_NB3B_SCREENED_H +#define LMP_PAIR_NB3B_SCREENED_H + +#include "pair_nb3b_harmonic.h" + +namespace LAMMPS_NS { + +class PairNb3bScreened : public PairNb3bHarmonic { + public: + PairNb3bScreened(class LAMMPS *); + + protected: + void threebody(Param *, Param *, Param *, double, double, double *, double *, double *, double *, + int, double &) override; +}; + +} // namespace LAMMPS_NS + +#endif +#endif From 5674786acd9574a52b9149966043c246baddc7c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Oct 2023 15:25:06 -0400 Subject: [PATCH 313/417] add feature to comment out and uncomment lines and selections from context menu --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/codeeditor.cpp | 96 +++++++++++++++++++++++++++++++-- tools/lammps-gui/codeeditor.h | 4 ++ 3 files changed, 98 insertions(+), 4 deletions(-) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index e83db05fdd..caae722865 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.5.9 LANGUAGES CXX) +project(lammps-gui VERSION 1.5.10 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/codeeditor.cpp b/tools/lammps-gui/codeeditor.cpp index 672c009c35..ab8007805a 100644 --- a/tools/lammps-gui/codeeditor.cpp +++ b/tools/lammps-gui/codeeditor.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -424,7 +425,7 @@ void CodeEditor::setVarNameList() LammpsWrapper *lammps = &qobject_cast(parent())->lammps; int nvar = lammps->id_count("variable"); - constexpr int BUFLEN = 256; + constexpr int BUFLEN = 256; char buffer[BUFLEN]; for (int i = 0; i < nvar; ++i) { memset(buffer, 0, BUFLEN); @@ -683,17 +684,34 @@ void CodeEditor::contextMenuEvent(QContextMenuEvent *event) QString page, help; find_help(page, help); - // print augmented context menu if an entry was found auto *menu = createStandardContextMenu(); menu->addSeparator(); + if (textCursor().hasSelection()) { + auto action1 = menu->addAction("Comment out selection"); + action1->setIcon(QIcon(":/icons/expand-text.png")); + connect(action1, &QAction::triggered, this, &CodeEditor::comment_selection); + auto action2 = menu->addAction("Uncomment selection"); + action2->setIcon(QIcon(":/icons/expand-text.png")); + connect(action2, &QAction::triggered, this, &CodeEditor::uncomment_selection); + } else { + auto action1 = menu->addAction("Comment out line"); + action1->setIcon(QIcon(":/icons/expand-text.png")); + connect(action1, &QAction::triggered, this, &CodeEditor::comment_line); + auto action2 = menu->addAction("Uncomment line"); + action2->setIcon(QIcon(":/icons/expand-text.png")); + connect(action2, &QAction::triggered, this, &CodeEditor::uncomment_line); + } + menu->addSeparator(); + + // print augmented context menu if an entry was found if (!help.isEmpty()) { auto action = menu->addAction(QString("Display available completions for '%1'").arg(help)); action->setIcon(QIcon(":/icons/expand-text.png")); connect(action, &QAction::triggered, this, &CodeEditor::runCompletion); + menu->addSeparator(); } if (!page.isEmpty()) { - menu->addSeparator(); auto action = menu->addAction(QString("Reformat '%1' command").arg(help)); action->setIcon(QIcon(":/icons/format-indent-less-3.png")); connect(action, &QAction::triggered, this, &CodeEditor::reformatCurrentLine); @@ -741,6 +759,78 @@ void CodeEditor::reformatCurrentLine() } } +void CodeEditor::comment_line() +{ + auto cursor = textCursor(); + cursor.movePosition(QTextCursor::StartOfLine); + cursor.insertText("#"); +} + +void CodeEditor::comment_selection() +{ + auto cursor = textCursor(); + auto text = cursor.selection().toPlainText(); + auto lines = text.split('\n'); + QString newtext; + for (auto line : lines) { + newtext.append('#'); + newtext.append(line); + newtext.append('\n'); + } + if (newtext.isEmpty()) newtext = "#\n"; + cursor.insertText(newtext); + setTextCursor(cursor); +} + +void CodeEditor::uncomment_selection() +{ + auto cursor = textCursor(); + auto text = cursor.selection().toPlainText(); + auto lines = text.split('\n'); + QString newtext; + for (auto line : lines) { + QString newline; + bool start = true; + for (auto letter : line) { + if (start && (letter == '#')) { + start = false; + continue; + } + if (start && !letter.isSpace()) start = false; + newline.append(letter); + } + newtext.append(newline); + newtext.append('\n'); + } + cursor.insertText(newtext); + setTextCursor(cursor); +} + +void CodeEditor::uncomment_line() +{ + auto cursor = textCursor(); + auto text = cursor.block().text(); + QString newtext; + bool start = true; + for (auto letter : text) { + if (start && (letter == '#')) { + start = false; + continue; + } + if (start && !letter.isSpace()) start = false; + newtext.append(letter); + } + + // perform edit but only if text has changed + if (QString::compare(text, newtext)) { + cursor.beginEditBlock(); + cursor.movePosition(QTextCursor::StartOfLine); + cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor, 1); + cursor.insertText(newtext); + cursor.endEditBlock(); + } +} + void CodeEditor::runCompletion() { QAbstractItemView *popup = nullptr; diff --git a/tools/lammps-gui/codeeditor.h b/tools/lammps-gui/codeeditor.h index 703b2ffd3c..744953af06 100644 --- a/tools/lammps-gui/codeeditor.h +++ b/tools/lammps-gui/codeeditor.h @@ -81,6 +81,10 @@ private slots: void reformatCurrentLine(); void runCompletion(); void insertCompletedCommand(const QString &completion); + void comment_selection(); + void uncomment_selection(); + void comment_line(); + void uncomment_line(); private: QWidget *lineNumberArea; From 14f8d9989438b073b30dd1d63baf20e53cc490dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Oct 2023 23:21:46 -0400 Subject: [PATCH 314/417] update ReaxFF force field info and remove references to reax and reax/c pair styles --- doc/src/pair_reaxff.rst | 15 ++++++++------- potentials/README.reax | 22 +++++++--------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/doc/src/pair_reaxff.rst b/doc/src/pair_reaxff.rst index 067eb3afc3..d28e15b0a2 100644 --- a/doc/src/pair_reaxff.rst +++ b/doc/src/pair_reaxff.rst @@ -72,8 +72,7 @@ from LAMMPS after the 12 December 2018 version. LAMMPS provides several different versions of ffield.reax in its potentials dir, each called potentials/ffield.reax.label. These are -documented in potentials/README.reax. The default ffield.reax -contains parameterizations for the following elements: C, H, O, N. +documented in potentials/README.reax. The format of these files is identical to that used originally by van Duin. We have tested the accuracy of *pair_style reaxff* potential @@ -110,12 +109,14 @@ control variable. The format of the control file is described below. not agree. Examples using *pair_style reaxff* are provided in the examples/reax -subdirectory. +directory and its subdirectories. -Use of this pair style requires that a charge be defined for every -atom. See the :doc:`atom_style ` and -:doc:`read_data ` commands for details on how to specify -charges. +Use of this pair style requires using an :doc:`atom_style ` +that includes a per-atom charge property *or* using +:doc:`fix property/atom q `. Charges can be set +via :doc:`read_data ` or :doc:`set `. Using an initial +charge that is close to the result of charge equilibration will speed +up that process. The ReaxFF parameter files provided were created using a charge equilibration (QEq) model for handling the electrostatic interactions. diff --git a/potentials/README.reax b/potentials/README.reax index d23d3bfd59..5854c6e95f 100644 --- a/potentials/README.reax +++ b/potentials/README.reax @@ -1,14 +1,6 @@ Different parameterization of the ReaxFF potential have been used in different published works. A small number of these are provided in the -LAMMPS potentials directory, in the form of ffield.reax.[label] -files. These can be used with either the pair_styles reax and reax/c. - -For pair_style reax, the command should be as follows: - -# reax args: hbcut hbnewflag tripflag precision -pair_style reax 6.0 0 1 1.0e-6 - -except where described below. +LAMMPS potentials directory, in the form of ffield.reax.label files. The mapping from parameter files to publication is as follows: @@ -25,8 +17,7 @@ J. Budzien, A. P. Thompson, and S. V. Zybin, "Reactive Molecular Dynamics Simulations of Shock Through a Single Crystal of Pentaerythritol Tetranitrate," J. Phys. Chem., 113 13142 (2009). -ffield.reax.rdx: nitramines (RDX/HMX/TATB/PETN) -This version requires hbnewflag = 1 +ffield.reax.rdx: nitramines (RDX/HMX/TATB/PETN) Strachan, A.; et al. Phys. Rev. Lett. 2003, 91, 098301 Zhang, L., van Duin, A.C.T., Zybin, S. and Goddard, W.A. (2009) Carbon @@ -37,7 +28,6 @@ Reactive Molecular Dynamics Simulations, Journal of Physical Chemistry B 113, 10619-10640 ffield.reax.cho: Reactive MD-force field c/h/o combustion force field -This version requires tripflag = 0 and hbnewflag = 1 "ReaxFF Reactive Force Field for Molecular Dynamics Simulations of Hydrocarbon Oxidation" Kimberly Chenoweth, Adri C. T. van Duin, and @@ -58,8 +48,10 @@ M.; van Duin, A. C. T.; Kubicki, J. D. J. Phys. Chem. A 2010, 114, ffield.reax.V_O_C_H: Reactive MD-force field: V/O/C/H potential: Chenoweth, K.; et al. J. Phys. Chem. C, 2008, 112, 14645-14654. -ffield.reax.ZnOH: Reactive MD-force field: water/zinc: Raymand, D.; -van Duin, A. C. T.; Spangberg, D.; Goddard, W. A.; Hermansson, K. +ffield.reax.ZnOH: Reactive MD-force field: water/zinc: Raymand, D.; +van Duin, A. C. T.; Spangberg, D.; Goddard, W. A.; Hermansson, K. Surface Science 2010, 604, 9-10, 741-752. -ffield.reax.lg: Reactive MD-force field: nitramines (RDX/HMX/TATB/PETN))+lg: L. Liu, Y. Liu, S. V. Zybin, H. Sun and W. A. Goddard, Journal of Physical Chemistry A, 115, 11016-11022 (2011). +ffield.reax.lg: Reactive MD-force field: nitramines (RDX/HMX/TATB/PETN))+lg: +L. Liu, Y. Liu, S. V. Zybin, H. Sun and W. A. Goddard, Journal of +Physical Chemistry A, 115, 11016-11022 (2011). From e04dfc55bd6b819ec66c1f4c5b3c87a11a6ab268 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Oct 2023 23:24:54 -0400 Subject: [PATCH 315/417] replace UTF-8 characters with their ASCII counterparts --- doc/src/fix_deposit.rst | 2 +- doc/src/fix_pour.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index 08711001c5..2fb95c5630 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -291,7 +291,7 @@ operation of the fix continues in an uninterrupted fashion. None of the :doc:`fix_modify ` options are relevant to this fix. This fix computes a global scalar, which can be accessed by various output commands. The scalar is the cumulative number of insertions. The -scalar value calculated by this fix is “intensive”. No parameter of this +scalar value calculated by this fix is "intensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. diff --git a/doc/src/fix_pour.rst b/doc/src/fix_pour.rst index 0ad369bf29..3b4bb5c723 100644 --- a/doc/src/fix_pour.rst +++ b/doc/src/fix_pour.rst @@ -247,7 +247,7 @@ appropriately. None of the :doc:`fix_modify ` options are relevant to this fix. This fix computes a global scalar, which can be accessed by various output commands. The scalar is the cumulative number of insertions. The -scalar value calculated by this fix is “intensive”. No parameter +scalar value calculated by this fix is "intensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. From 41fb0a57007f0f0cc6fb80f046015505a9a1a56a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Oct 2023 09:34:32 -0400 Subject: [PATCH 316/417] make README consistent with potential file and implementation --- examples/nb3b/README.nb3b.screened | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/nb3b/README.nb3b.screened b/examples/nb3b/README.nb3b.screened index c0859c035a..686b329846 100644 --- a/examples/nb3b/README.nb3b.screened +++ b/examples/nb3b/README.nb3b.screened @@ -27,11 +27,11 @@ parameters for Si permutations appear but they are not employed in the current case. # i j k K theta0 rho cutoff -O P P 65.0 109.47 1.0 3.3 -O P Si 120.0 109.47 1.0 0.000 +O P P 32.5 109.47 1.0 3.3 +O P Si 60.0 109.47 1.0 0.000 O P O 0.000 0.000 1.0 0.000 -O Si P 120.0 109.47 1.0 0.000 -O Si Si 25.0 109.47 1.0 3.3 +O Si P 60.0 109.47 1.0 0.000 +O Si Si 12.5 109.47 1.0 3.3 (...) The rho value must be always higher than 0.0. Cutoff and rho are extracted From a4064e5202b2e2d463d11646d1655e99f87358a9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Oct 2023 09:37:38 -0400 Subject: [PATCH 317/417] update code owners for new pair style --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9b316fbeb9..b6892aa4ee 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -61,6 +61,7 @@ src/GPU/pair_vashishta_gpu.* @andeplane src/KOKKOS/pair_vashishta_kokkos.* @andeplane src/MANYBODY/pair_vashishta_table.* @andeplane src/MANYBODY/pair_atm.* @sergeylishchuk +src/MANYBODY/pair_nb3b_screened.* @flodesani src/REPLICA/*_grem.* @dstelter92 src/EXTRA-COMPUTE/compute_stress_mop*.* @RomainVermorel src/EXTRA-COMPUTE/compute_born_matrix.* @Bibobu @athomps From ac527e3d3ff823d561bc75eb3b9fcf9880d8181a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Oct 2023 10:07:53 -0400 Subject: [PATCH 318/417] store invrho instead of rho --- src/MANYBODY/pair_nb3b_harmonic.cpp | 16 ++++++++++------ src/MANYBODY/pair_nb3b_harmonic.h | 2 +- src/MANYBODY/pair_nb3b_screened.cpp | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/MANYBODY/pair_nb3b_harmonic.cpp b/src/MANYBODY/pair_nb3b_harmonic.cpp index d1ba719906..5bc930c186 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.cpp +++ b/src/MANYBODY/pair_nb3b_harmonic.cpp @@ -37,7 +37,7 @@ using MathConst::MY_PI; #define DELTA 4 #define SMALL 0.001 -static const char *substyle[] = { "nb3n/harmonic", "nb3b/screened" }; +static const char *substyle[] = {"nb3n/harmonic", "nb3b/screened"}; /* ---------------------------------------------------------------------- */ @@ -271,10 +271,14 @@ void PairNb3bHarmonic::read_file(char *file) params[nparams].kelement = kelement; params[nparams].k_theta = values.next_double(); params[nparams].theta0 = values.next_double(); - if (variant == SCREENED) - params[nparams].rho = values.next_double(); - else - params[nparams].rho = 1.0; // dummy value + params[nparams].invrho = 1.0; // dummy value + if (variant == SCREENED) { + double rho = values.next_double(); + if (rho > 0.0) + params[nparams].invrho = 1.0 / rho; + else + throw TokenizerException("Incorrect value for potential parameter", "rho"); + } params[nparams].cutoff = values.next_double(); if (unit_convert) params[nparams].k_theta *= conversion_factor; @@ -283,7 +287,7 @@ void PairNb3bHarmonic::read_file(char *file) } if ((params[nparams].k_theta < 0.0) || (params[nparams].theta0 < 0.0) || - (params[nparams].cutoff < 0.0) || (params[nparams].rho <= 0.0)) + (params[nparams].cutoff < 0.0)) error->one(FLERR, "Illegal {} parameter", substyle[variant]); nparams++; diff --git a/src/MANYBODY/pair_nb3b_harmonic.h b/src/MANYBODY/pair_nb3b_harmonic.h index 9e4b717780..e69668b5bd 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.h +++ b/src/MANYBODY/pair_nb3b_harmonic.h @@ -40,7 +40,7 @@ class PairNb3bHarmonic : public Pair { protected: struct Param { double k_theta, theta0, cutoff; - double rho; // added for screened harmonic style + double invrho; // for screened harmonic style double cut, cutsq; int ielement, jelement, kelement; }; diff --git a/src/MANYBODY/pair_nb3b_screened.cpp b/src/MANYBODY/pair_nb3b_screened.cpp index 48ca91c6db..d66945d563 100644 --- a/src/MANYBODY/pair_nb3b_screened.cpp +++ b/src/MANYBODY/pair_nb3b_screened.cpp @@ -63,8 +63,8 @@ void PairNb3bScreened::threebody(Param *paramij, Param *paramik, Param *paramijk // // Uijk=k/2(theta-theta0)**2 * exp[-(rij/rhoij+rik/rhoik)] // - rho1inv = paramij->rho; - rho2inv = paramik->rho; + rho1inv = paramij->invrho; + rho2inv = paramik->invrho; scr = exp(-r1 * rho1inv - r2 * rho2inv); dtheta = acos(c) - paramijk->theta0; From 4f3162888b38e485454798a5063434773e61bfbd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Oct 2023 12:55:49 -0400 Subject: [PATCH 319/417] remove debug code --- src/neighbor.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 46d46b7440..8d12edeef2 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2292,9 +2292,7 @@ int Neighbor::decide() if (must_check) { bigint n = update->ntimestep; if (restart_check && n == output->next_restart) return 1; - fprintf(stderr, "step %ld num fixes: %d\n", update->ntimestep, fixchecklist.size()); for (auto &ifix : fixchecklist) { - fprintf(stderr, " fix: %s %s next %ld\n", ifix->id, ifix->style, ifix->next_reneighbor); if (n == ifix->next_reneighbor) return 1; } } From 74efe0a00c317b474049b948ff9d7c14f93d0dc1 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 31 Oct 2023 16:02:49 -0600 Subject: [PATCH 320/417] add comm of ghost atom coords to compute cluster/atom and aggregate/atom --- src/compute_aggregate_atom.cpp | 5 +++++ src/compute_cluster_atom.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index e68062b73e..54da23c302 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -110,6 +110,11 @@ void ComputeAggregateAtom::compute_peratom() vector_atom = aggregateID; } + // communicate coords for ghost atoms if box can change, e.g. fix deform + // this ensures ghost atom coords are current + + comm->forward_comm(); + // invoke full neighbor list (will copy or build if necessary) // on the first step of a run, set preflag to one in neighbor->build_one(...) diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index ae44fbcd37..284a5dd23a 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -99,6 +99,11 @@ void ComputeClusterAtom::compute_peratom() vector_atom = clusterID; } + // communicate coords for ghost atoms if box can change, e.g. fix deform + // this ensures ghost atom coords are current + + comm->forward_comm(); + // invoke full neighbor list (will copy or build if necessary) // on the first step of a run, set preflag to one in neighbor->build_one(...) From da597880a56763bab75499420a4b29476805dba9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 1 Nov 2023 05:11:43 -0400 Subject: [PATCH 321/417] add code to avoid deadlock --- src/compute_aggregate_atom.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index 54da23c302..5a489092b7 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -35,6 +35,7 @@ using namespace LAMMPS_NS; +static constexpr int MAXLOOP = 100; /* ---------------------------------------------------------------------- */ ComputeAggregateAtom::ComputeAggregateAtom(LAMMPS *lmp, int narg, char **arg) : @@ -163,8 +164,11 @@ void ComputeAggregateAtom::compute_peratom() int change, done, anychange; - while (true) { + int counter = 0; + // stop after MAXLOOP iterations + while (counter < MAXLOOP) { comm->forward_comm(this); + ++counter; // reverse communication when bonds are not stored on every processor @@ -223,6 +227,8 @@ void ComputeAggregateAtom::compute_peratom() MPI_Allreduce(&change, &anychange, 1, MPI_INT, MPI_MAX, world); if (!anychange) break; } + if ((comm->me == 0) && (counter >= MAXLOOP)) + error->warning(FLERR, "Compute aggregate/atom did not converge after {} iterations", MAXLOOP); } /* ---------------------------------------------------------------------- */ From 925d006d191b81fa41f417690eee2d86ecd6451b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 2 Nov 2023 13:43:37 -0400 Subject: [PATCH 322/417] join wrapped strings --- src/read_dump.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 4a64a8be1d..f94e31e1d1 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -324,8 +324,7 @@ bigint ReadDump::seek(bigint nrequest, int exact) } if (eofflag) - error->one(FLERR,"Read dump parallel files " - "do not all have same timestep"); + error->one(FLERR,"Read dump parallel files do not all have same timestep"); } } @@ -426,8 +425,7 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip) } if (eofflag) - error->one(FLERR,"Read dump parallel files " - "do not all have same timestep"); + error->one(FLERR,"Read dump parallel files do not all have same timestep"); } } From 8c3cda0aeae5361c595dfc4efe55aec9e9ee3014 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 2 Nov 2023 13:05:18 -0600 Subject: [PATCH 323/417] Fix bug in fix_dt_reset_kokkos --- src/KOKKOS/fix_dt_reset_kokkos.cpp | 83 +++++++++++++----------------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/src/KOKKOS/fix_dt_reset_kokkos.cpp b/src/KOKKOS/fix_dt_reset_kokkos.cpp index 4c7545cee0..0e8d0d985c 100644 --- a/src/KOKKOS/fix_dt_reset_kokkos.cpp +++ b/src/KOKKOS/fix_dt_reset_kokkos.cpp @@ -52,14 +52,6 @@ void FixDtResetKokkos::init() { FixDtReset::init(); - k_emax = Kokkos::DualView("FixDtResetKokkos:gamma", 1); - - k_emax.h_view(0) = emax; - - - k_emax.template modify(); - k_emax.template sync(); - if (utils::strmatch(update->integrate_style,"^respa")) error->all(FLERR,"Cannot (yet) use respa with Kokkos"); } @@ -95,41 +87,38 @@ void FixDtResetKokkos::end_of_step() atomKK->modified(execution_space, F_MASK); - if (minbound) dt = MAX(dt, tmin); - if (maxbound) dt = MIN(dt, tmax); + if (minbound) dt = MAX(dt, tmin); + if (maxbound) dt = MIN(dt, tmax); - // if timestep didn't change, just return - // else reset update->dt and other classes that depend on it - // rRESPA, pair style, fixes + // if timestep didn't change, just return + // else reset update->dt and other classes that depend on it + // rRESPA, pair style, fixes - if (dt == update->dt) return; + if (dt == update->dt) return; - laststep = update->ntimestep; + laststep = update->ntimestep; - // calls to other classes that need to know timestep size changed - // similar logic is in Input::timestep() - - update->update_time(); - update->dt = dt; - update->dt_default = 0; - if (force->pair) force->pair->reset_dt(); - for (auto &ifix : modify->get_fix_list()) ifix->reset_dt(); - output->reset_dt(); + // calls to other classes that need to know timestep size changed + // similar logic is in Input::timestep() + update->update_time(); + update->dt = dt; + update->dt_default = 0; + if (force->pair) force->pair->reset_dt(); + for (auto &ifix : modify->get_fix_list()) ifix->reset_dt(); + output->reset_dt(); } /* ---------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION -void FixDtResetKokkos::operator()(TagFixDtResetMass, const int &i, double &k_dt) const { +void FixDtResetKokkos::operator()(TagFixDtResetMass, const int &i, double &dt_min) const { - double dtv, dtf, dte, dtsq; + double dt, dtv, dtf, dte, dtsq; double vsq, fsq, massinv; double delx, dely, delz, delr; - double emax = k_emax.d_view(0); - if (mask[i] & groupbit) { massinv = 1.0 / mass[type[i]]; @@ -138,32 +127,31 @@ void FixDtResetKokkos::operator()(TagFixDtResetMass, const int &i, d dtv = dtf = dte = BIG; if (vsq > 0.0) dtv = xmax / sqrt(vsq); if (fsq > 0.0) dtf = sqrt(2.0 * xmax / (ftm2v * sqrt(fsq) * massinv)); - k_dt = MIN(dtv, dtf); + dt = MIN(dtv, dtf); if ((emax > 0.0) && (fsq * vsq > 0.0)) { dte = emax / sqrt(fsq * vsq) / sqrt(ftm2v * mvv2e); - k_dt = MIN(dt, dte); + dt = MIN(dt, dte); } - dtsq = k_dt * k_dt; - delx = k_dt * v(i,0) + 0.5 * dtsq * massinv * f(i,0) * ftm2v; - dely = k_dt * v(i,1) + 0.5 * dtsq * massinv * f(i,1) * ftm2v; - delz = k_dt * v(i,2) + 0.5 * dtsq * massinv * f(i,2) * ftm2v; + dtsq = dt * dt; + delx = dt * v(i,0) + 0.5 * dtsq * massinv * f(i,0) * ftm2v; + dely = dt * v(i,1) + 0.5 * dtsq * massinv * f(i,1) * ftm2v; + delz = dt * v(i,2) + 0.5 * dtsq * massinv * f(i,2) * ftm2v; delr = sqrt(delx * delx + dely * dely + delz * delz); - if (delr > xmax) k_dt *= xmax / delr; + if (delr > xmax) dt *= xmax / delr; + dt_min = MIN(dt_min,dt); } - } +} /* ---------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION -void FixDtResetKokkos::operator()(TagFixDtResetRMass, const int &i, double &k_dt) const { +void FixDtResetKokkos::operator()(TagFixDtResetRMass, const int &i, double &dt_min) const { - double dtv, dtf, dte, dtsq; + double dt, dtv, dtf, dte, dtsq; double vsq, fsq, massinv; double delx, dely, delz, delr; - double emax = k_emax.d_view(0); - if (mask[i] & groupbit) { massinv = 1.0 / rmass[i]; @@ -172,17 +160,18 @@ void FixDtResetKokkos::operator()(TagFixDtResetRMass, const int &i, dtv = dtf = dte = BIG; if (vsq > 0.0) dtv = xmax / sqrt(vsq); if (fsq > 0.0) dtf = sqrt(2.0 * xmax / (ftm2v * sqrt(fsq) * massinv)); - k_dt = MIN(dtv, dtf); + dt = MIN(dtv, dtf); if ((emax > 0.0) && (fsq * vsq > 0.0)) { dte = emax / sqrt(fsq * vsq) / sqrt(ftm2v * mvv2e); - k_dt = MIN(dt, dte); + dt = MIN(dt, dte); } - dtsq = k_dt * k_dt; - delx = k_dt * v(i,0) + 0.5 * dtsq * massinv * f(i,0) * ftm2v; - dely = k_dt * v(i,1) + 0.5 * dtsq * massinv * f(i,1) * ftm2v; - delz = k_dt * v(i,2) + 0.5 * dtsq * massinv * f(i,2) * ftm2v; + dtsq = dt * dt; + delx = dt * v(i,0) + 0.5 * dtsq * massinv * f(i,0) * ftm2v; + dely = dt * v(i,1) + 0.5 * dtsq * massinv * f(i,1) * ftm2v; + delz = dt * v(i,2) + 0.5 * dtsq * massinv * f(i,2) * ftm2v; delr = sqrt(delx * delx + dely * dely + delz * delz); - if (delr > xmax) k_dt *= xmax / delr; + if (delr > xmax) dt *= xmax / delr; + dt_min = MIN(dt_min,dt); } } From 6102c2a46047236a8404c90bdcd6b8c8e088c491 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 2 Nov 2023 13:10:27 -0600 Subject: [PATCH 324/417] Forces are not modified --- src/KOKKOS/fix_dt_reset_kokkos.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/KOKKOS/fix_dt_reset_kokkos.cpp b/src/KOKKOS/fix_dt_reset_kokkos.cpp index 0e8d0d985c..6e7709ace1 100644 --- a/src/KOKKOS/fix_dt_reset_kokkos.cpp +++ b/src/KOKKOS/fix_dt_reset_kokkos.cpp @@ -85,8 +85,6 @@ void FixDtResetKokkos::end_of_step() MPI_Allreduce(MPI_IN_PLACE, &dt, 1, MPI_DOUBLE, MPI_MIN, world); - atomKK->modified(execution_space, F_MASK); - if (minbound) dt = MAX(dt, tmin); if (maxbound) dt = MIN(dt, tmax); From a0f7612f13f60c4fe377bf19c4abbf5a1a5fa4c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 3 Nov 2023 03:25:08 -0400 Subject: [PATCH 325/417] encode system box geometry into a class member --- src/read_dump.cpp | 70 +++++++++++++++++++++++++++++------------------ src/read_dump.h | 3 ++ 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/read_dump.cpp b/src/read_dump.cpp index f94e31e1d1..12323fe776 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -48,6 +48,19 @@ ReadDump::ReadDump(LAMMPS *lmp) : nfield = 0; readerstyle = utils::strdup("native"); + scaled = wrapped = 0; + + boxgeom = UNKNOWN; + if (domain->triclinic) + boxgeom |= TRICLINIC; + else + boxgeom |= ORTHOGONAL; + + if (domain->dimension == 2) + boxgeom |= TWO_D; + else + boxgeom |= THREE_D; + nreader = 0; clustercomm = MPI_COMM_NULL; filereader = 0; @@ -185,24 +198,27 @@ void ReadDump::setup_reader(int narg, char **arg) // multiproc_nfile < nprocs: multiproc_nfile readers, create clusters // see read_dump.h for explanation of these variables + const auto &me = comm->me; + const auto &nprocs = comm->nprocs; + if (multiproc == 0) { nreader = 1; firstfile = -1; - MPI_Comm_dup(world,&clustercomm); - } else if (multiproc_nfile >= comm->nprocs) { - firstfile = static_cast ((bigint) comm->me * multiproc_nfile/comm->nprocs); - int lastfile = static_cast ((bigint) (comm->me+1) * multiproc_nfile/comm->nprocs); + MPI_Comm_dup(world, &clustercomm); + } else if (multiproc_nfile >= nprocs) { + firstfile = static_cast ((bigint) me * multiproc_nfile/nprocs); + int lastfile = static_cast ((bigint) (me+1) * multiproc_nfile/nprocs); nreader = lastfile - firstfile; - MPI_Comm_split(world,comm->me,0,&clustercomm); - } else if (multiproc_nfile < comm->nprocs) { + MPI_Comm_split(world, me, 0, &clustercomm); + } else if (multiproc_nfile < nprocs) { nreader = 1; - int icluster = static_cast ((bigint) comm->me * multiproc_nfile/comm->nprocs); + int icluster = static_cast ((bigint) me * multiproc_nfile/nprocs); firstfile = icluster; - MPI_Comm_split(world,icluster,0,&clustercomm); + MPI_Comm_split(world, icluster, 0, &clustercomm); } - MPI_Comm_rank(clustercomm,&me_cluster); - MPI_Comm_size(clustercomm,&nprocs_cluster); + MPI_Comm_rank(clustercomm, &me_cluster); + MPI_Comm_size(clustercomm, &nprocs_cluster); if (me_cluster == 0) filereader = 1; else filereader = 0; @@ -230,9 +246,9 @@ void ReadDump::setup_reader(int narg, char **arg) // unrecognized style - } else error->all(FLERR,utils::check_packages_for_style("reader",readerstyle,lmp)); + } else error->all(FLERR, utils::check_packages_for_style("reader", readerstyle, lmp)); - if (utils::strmatch(readerstyle,"^adios")) { + if (utils::strmatch(readerstyle, "^adios")) { // everyone is a reader with adios parallel = 1; filereader = 1; @@ -242,7 +258,7 @@ void ReadDump::setup_reader(int narg, char **arg) if (narg > 0 && filereader) for (int i = 0; i < nreader; i++) - readers[i]->settings(narg,arg); + readers[i]->settings(narg, arg); } /* ---------------------------------------------------------------------- @@ -502,8 +518,8 @@ void ReadDump::header(int fieldinfo) if (boxflag) { if (!boxinfo) error->all(FLERR,"No box information in dump, must use 'box no'"); - else if ((triclinic_snap && !domain->triclinic) || - (!triclinic_snap && domain->triclinic)) + else if ((triclinic_snap && (boxgeom & ORTHOGONAL)) || + (!triclinic_snap && (boxgeom & TRICLINIC))) error->one(FLERR,"Read_dump triclinic status does not match simulation"); } @@ -547,11 +563,11 @@ void ReadDump::header(int fieldinfo) // set yindex,zindex = column index of Y and Z fields in fields array // needed for unscaling to absolute coords in xfield(), yfield(), zfield() - if (scaled && domain->triclinic == 1) { + if (scaled && (boxgeom & TRICLINIC)) { int flag = 0; if (xflag == Reader::UNSET) flag = 1; if (yflag == Reader::UNSET) flag = 1; - if (domain->dimension == 3 && zflag == Reader::UNSET) flag = 1; + if ((boxgeom & THREE_D) && zflag == Reader::UNSET) flag = 1; if (flag) error->one(FLERR,"All read_dump x,y,z fields must be specified for " "scaled, triclinic coords"); @@ -637,13 +653,13 @@ void ReadDump::atoms() domain->boxhi[0] = xhi; domain->boxlo[1] = ylo; domain->boxhi[1] = yhi; - if (domain->dimension == 3) { + if (boxgeom & THREE_D) { domain->boxlo[2] = zlo; domain->boxhi[2] = zhi; } - if (domain->triclinic) { + if (boxgeom & TRICLINIC) { domain->xy = xy; - if (domain->dimension == 3) { + if (boxgeom & THREE_D) { domain->xz = xz; domain->yz = yz; } @@ -1116,12 +1132,12 @@ void ReadDump::migrate_atoms_by_coords() int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); - if (domain->triclinic) domain->x2lamda(atom->nlocal); + if (boxgeom & TRICLINIC) domain->x2lamda(atom->nlocal); domain->reset_box(); auto irregular = new Irregular(lmp); irregular->migrate_atoms(1); delete irregular; - if (domain->triclinic) domain->lamda2x(atom->nlocal); + if (boxgeom & TRICLINIC) domain->lamda2x(atom->nlocal); } /* ---------------------------------------------------------------------- @@ -1169,7 +1185,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) if (fieldtype[nfield-1] == Reader::ID || fieldtype[nfield-1] == Reader::TYPE) error->all(FLERR,"Read_dump must use at least either 'id' or 'type' field"); - if (domain->dimension == 2) { + if (boxgeom & TWO_D) { for (int i = 0; i < nfield; i++) if (fieldtype[i] == Reader::Z || fieldtype[i] == Reader::VZ || fieldtype[i] == Reader::IZ || fieldtype[i] == Reader::FZ) @@ -1303,8 +1319,8 @@ int ReadDump::whichtype(char *str) double ReadDump::xfield(int i, int j) { if (!scaled) return fields[i][j]; - else if (!domain->triclinic) return fields[i][j]*xprd + xlo; - else if (domain->dimension == 2) + else if (boxgeom & ORTHOGONAL) return fields[i][j]*xprd + xlo; + else if (boxgeom & TWO_D) return xprd*fields[i][j] + xy*fields[i][yindex] + xlo; return xprd*fields[i][j] + xy*fields[i][yindex] + xz*fields[i][zindex] + xlo; } @@ -1312,8 +1328,8 @@ double ReadDump::xfield(int i, int j) double ReadDump::yfield(int i, int j) { if (!scaled) return fields[i][j]; - else if (!domain->triclinic) return fields[i][j]*yprd + ylo; - else if (domain->dimension == 2) return yprd*fields[i][j] + ylo; + else if (boxgeom & ORTHOGONAL) return fields[i][j]*yprd + ylo; + else if (boxgeom & TWO_D) return yprd*fields[i][j] + ylo; return yprd*fields[i][j] + yz*fields[i][zindex] + ylo; } diff --git a/src/read_dump.h b/src/read_dump.h index 4676a1819d..1c007e3d53 100644 --- a/src/read_dump.h +++ b/src/read_dump.h @@ -40,6 +40,8 @@ class ReadDump : public Command { void atoms(); int fields_and_keywords(int, char **); + enum { UNKNOWN = 0, ORTHOGONAL = 1 << 0, TRICLINIC = 1 << 1, TWO_D = 1 << 2, THREE_D = 1 << 3 }; + private: char **files; // list of input dump files to process int nfile; // # of dump files to process (each may be parallel) @@ -76,6 +78,7 @@ class ReadDump : public Command { int scaled; // 0/1 if dump file coords are unscaled/scaled int wrapped; // 0/1 if dump file coords are unwrapped/wrapped + int boxgeom; // indicate whether box is orthogonal/triclinic and 2d/3d double box[3][3]; // dump file box parameters double xlo, xhi, ylo, yhi, zlo, zhi, xy, xz, yz; // dump snapshot box params From 0fbe388cbdee43bda45bb3fb6d0e964c11278149 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 3 Nov 2023 16:40:18 -0400 Subject: [PATCH 326/417] undo "boxgeom" changes --- src/read_dump.cpp | 41 ++++++++++++++--------------------------- src/read_dump.h | 3 --- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 12323fe776..7f8d4d6559 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -48,19 +48,6 @@ ReadDump::ReadDump(LAMMPS *lmp) : nfield = 0; readerstyle = utils::strdup("native"); - scaled = wrapped = 0; - - boxgeom = UNKNOWN; - if (domain->triclinic) - boxgeom |= TRICLINIC; - else - boxgeom |= ORTHOGONAL; - - if (domain->dimension == 2) - boxgeom |= TWO_D; - else - boxgeom |= THREE_D; - nreader = 0; clustercomm = MPI_COMM_NULL; filereader = 0; @@ -518,8 +505,8 @@ void ReadDump::header(int fieldinfo) if (boxflag) { if (!boxinfo) error->all(FLERR,"No box information in dump, must use 'box no'"); - else if ((triclinic_snap && (boxgeom & ORTHOGONAL)) || - (!triclinic_snap && (boxgeom & TRICLINIC))) + else if ((triclinic_snap && !domain->triclinic) || + (!triclinic_snap && domain->triclinic)) error->one(FLERR,"Read_dump triclinic status does not match simulation"); } @@ -563,11 +550,11 @@ void ReadDump::header(int fieldinfo) // set yindex,zindex = column index of Y and Z fields in fields array // needed for unscaling to absolute coords in xfield(), yfield(), zfield() - if (scaled && (boxgeom & TRICLINIC)) { + if (scaled && domain->triclinic == 1) { int flag = 0; if (xflag == Reader::UNSET) flag = 1; if (yflag == Reader::UNSET) flag = 1; - if ((boxgeom & THREE_D) && zflag == Reader::UNSET) flag = 1; + if (domain->dimension == 3 && zflag == Reader::UNSET) flag = 1; if (flag) error->one(FLERR,"All read_dump x,y,z fields must be specified for " "scaled, triclinic coords"); @@ -653,13 +640,13 @@ void ReadDump::atoms() domain->boxhi[0] = xhi; domain->boxlo[1] = ylo; domain->boxhi[1] = yhi; - if (boxgeom & THREE_D) { + if (domain->dimension == 3) { domain->boxlo[2] = zlo; domain->boxhi[2] = zhi; } - if (boxgeom & TRICLINIC) { + if (domain->triclinic) { domain->xy = xy; - if (boxgeom & THREE_D) { + if (domain->dimension == 3) { domain->xz = xz; domain->yz = yz; } @@ -1132,12 +1119,12 @@ void ReadDump::migrate_atoms_by_coords() int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) domain->remap(x[i],image[i]); - if (boxgeom & TRICLINIC) domain->x2lamda(atom->nlocal); + if (domain->triclinic) domain->x2lamda(atom->nlocal); domain->reset_box(); auto irregular = new Irregular(lmp); irregular->migrate_atoms(1); delete irregular; - if (boxgeom & TRICLINIC) domain->lamda2x(atom->nlocal); + if (domain->triclinic) domain->lamda2x(atom->nlocal); } /* ---------------------------------------------------------------------- @@ -1185,7 +1172,7 @@ int ReadDump::fields_and_keywords(int narg, char **arg) if (fieldtype[nfield-1] == Reader::ID || fieldtype[nfield-1] == Reader::TYPE) error->all(FLERR,"Read_dump must use at least either 'id' or 'type' field"); - if (boxgeom & TWO_D) { + if (domain->dimension == 2) { for (int i = 0; i < nfield; i++) if (fieldtype[i] == Reader::Z || fieldtype[i] == Reader::VZ || fieldtype[i] == Reader::IZ || fieldtype[i] == Reader::FZ) @@ -1319,8 +1306,8 @@ int ReadDump::whichtype(char *str) double ReadDump::xfield(int i, int j) { if (!scaled) return fields[i][j]; - else if (boxgeom & ORTHOGONAL) return fields[i][j]*xprd + xlo; - else if (boxgeom & TWO_D) + else if (!domain->triclinic) return fields[i][j]*xprd + xlo; + else if (domain->dimension == 2) return xprd*fields[i][j] + xy*fields[i][yindex] + xlo; return xprd*fields[i][j] + xy*fields[i][yindex] + xz*fields[i][zindex] + xlo; } @@ -1328,8 +1315,8 @@ double ReadDump::xfield(int i, int j) double ReadDump::yfield(int i, int j) { if (!scaled) return fields[i][j]; - else if (boxgeom & ORTHOGONAL) return fields[i][j]*yprd + ylo; - else if (boxgeom & TWO_D) return yprd*fields[i][j] + ylo; + else if (!domain->triclinic) return fields[i][j]*yprd + ylo; + else if (domain->dimension == 2) return yprd*fields[i][j] + ylo; return yprd*fields[i][j] + yz*fields[i][zindex] + ylo; } diff --git a/src/read_dump.h b/src/read_dump.h index 1c007e3d53..4676a1819d 100644 --- a/src/read_dump.h +++ b/src/read_dump.h @@ -40,8 +40,6 @@ class ReadDump : public Command { void atoms(); int fields_and_keywords(int, char **); - enum { UNKNOWN = 0, ORTHOGONAL = 1 << 0, TRICLINIC = 1 << 1, TWO_D = 1 << 2, THREE_D = 1 << 3 }; - private: char **files; // list of input dump files to process int nfile; // # of dump files to process (each may be parallel) @@ -78,7 +76,6 @@ class ReadDump : public Command { int scaled; // 0/1 if dump file coords are unscaled/scaled int wrapped; // 0/1 if dump file coords are unwrapped/wrapped - int boxgeom; // indicate whether box is orthogonal/triclinic and 2d/3d double box[3][3]; // dump file box parameters double xlo, xhi, ylo, yhi, zlo, zhi, xy, xz, yz; // dump snapshot box params From 9b88ba595d0f05e384cbe6c94cd42870ad15f3bc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 3 Nov 2023 16:52:35 -0400 Subject: [PATCH 327/417] reduce timestep to get correct runs and no crashes. update logs. --- examples/balance/in.balance | 1 + examples/balance/in.balance.bond.fast | 1 + examples/balance/in.balance.bond.slow | 1 + .../log.27Nov18.balance.bond.fast.g++.2 | 242 -------- .../log.27Nov18.balance.bond.fast.g++.4 | 242 -------- .../log.27Nov18.balance.bond.slow.g++.2 | 541 ----------------- .../log.27Nov18.balance.bond.slow.g++.4 | 541 ----------------- .../log.27Nov18.balance.clock.dynamic.g++.2 | 227 -------- .../log.27Nov18.balance.clock.dynamic.g++.4 | 227 -------- .../log.27Nov18.balance.clock.static.g++.2 | 195 ------- .../log.27Nov18.balance.clock.static.g++.4 | 195 ------- examples/balance/log.27Nov18.balance.g++.2 | 209 ------- examples/balance/log.27Nov18.balance.g++.4 | 209 ------- .../log.27Nov18.balance.group.dynamic.g++.2 | 110 ---- .../log.27Nov18.balance.group.dynamic.g++.4 | 110 ---- .../log.27Nov18.balance.group.static.g++.2 | 146 ----- .../log.27Nov18.balance.group.static.g++.4 | 146 ----- .../balance/log.27Nov18.balance.kspace.g++.2 | 117 ---- .../balance/log.27Nov18.balance.kspace.g++.4 | 117 ---- .../log.27Nov18.balance.neigh.dynamic.g++.2 | 228 -------- .../log.27Nov18.balance.neigh.dynamic.g++.4 | 228 -------- .../log.27Nov18.balance.neigh.rcb.g++.2 | 141 ----- .../log.27Nov18.balance.neigh.rcb.g++.4 | 141 ----- .../log.27Nov18.balance.neigh.static.g++.2 | 211 ------- .../log.27Nov18.balance.neigh.static.g++.4 | 211 ------- .../log.27Nov18.balance.var.dynamic.g++.2 | 257 -------- .../log.27Nov18.balance.var.dynamic.g++.4 | 257 -------- .../log.3Nov23.balance.bond.fast.g++.2 | 255 ++++++++ .../log.3Nov23.balance.bond.fast.g++.4 | 255 ++++++++ .../log.3Nov23.balance.bond.slow.g++.2 | 550 ++++++++++++++++++ .../log.3Nov23.balance.bond.slow.g++.4 | 550 ++++++++++++++++++ .../log.3Nov23.balance.clock.dynamic.g++.2 | 234 ++++++++ .../log.3Nov23.balance.clock.dynamic.g++.4 | 234 ++++++++ .../log.3Nov23.balance.clock.static.g++.2 | 207 +++++++ .../log.3Nov23.balance.clock.static.g++.4 | 207 +++++++ examples/balance/log.3Nov23.balance.g++.2 | 213 +++++++ examples/balance/log.3Nov23.balance.g++.4 | 213 +++++++ .../log.3Nov23.balance.group.dynamic.g++.2 | 116 ++++ .../log.3Nov23.balance.group.dynamic.g++.4 | 116 ++++ .../log.3Nov23.balance.group.static.g++.2 | 160 +++++ .../log.3Nov23.balance.group.static.g++.4 | 160 +++++ .../balance/log.3Nov23.balance.kspace.g++.2 | 120 ++++ .../balance/log.3Nov23.balance.kspace.g++.4 | 120 ++++ .../log.3Nov23.balance.neigh.dynamic.g++.2 | 235 ++++++++ .../log.3Nov23.balance.neigh.dynamic.g++.4 | 235 ++++++++ .../log.3Nov23.balance.neigh.rcb.g++.2 | 146 +++++ .../log.3Nov23.balance.neigh.rcb.g++.4 | 146 +++++ .../log.3Nov23.balance.neigh.static.g++.2 | 229 ++++++++ .../log.3Nov23.balance.neigh.static.g++.4 | 229 ++++++++ .../log.3Nov23.balance.var.dynamic.g++.2 | 268 +++++++++ .../log.3Nov23.balance.var.dynamic.g++.4 | 268 +++++++++ 51 files changed, 5469 insertions(+), 5248 deletions(-) delete mode 100644 examples/balance/log.27Nov18.balance.bond.fast.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.bond.fast.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.bond.slow.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.bond.slow.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.clock.dynamic.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.clock.dynamic.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.clock.static.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.clock.static.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.group.dynamic.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.group.dynamic.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.group.static.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.group.static.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.kspace.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.kspace.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.neigh.dynamic.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.neigh.dynamic.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.neigh.rcb.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.neigh.rcb.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.neigh.static.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.neigh.static.g++.4 delete mode 100644 examples/balance/log.27Nov18.balance.var.dynamic.g++.2 delete mode 100644 examples/balance/log.27Nov18.balance.var.dynamic.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.bond.fast.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.bond.fast.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.bond.slow.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.bond.slow.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.clock.dynamic.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.clock.dynamic.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.clock.static.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.clock.static.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.group.dynamic.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.group.dynamic.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.group.static.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.group.static.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.kspace.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.kspace.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.neigh.dynamic.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.neigh.dynamic.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.neigh.rcb.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.neigh.rcb.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.neigh.static.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.neigh.static.g++.4 create mode 100644 examples/balance/log.3Nov23.balance.var.dynamic.g++.2 create mode 100644 examples/balance/log.3Nov23.balance.var.dynamic.g++.4 diff --git a/examples/balance/in.balance b/examples/balance/in.balance index 3a1298acfd..c10500f86b 100644 --- a/examples/balance/in.balance +++ b/examples/balance/in.balance @@ -50,5 +50,6 @@ fix 10 all balance 50 0.9 rcb thermo_style custom step temp epair press f_10[3] f_10 thermo 100 +timestep 0.001 run 10000 diff --git a/examples/balance/in.balance.bond.fast b/examples/balance/in.balance.bond.fast index ff54fb94cc..cbc76272e0 100644 --- a/examples/balance/in.balance.bond.fast +++ b/examples/balance/in.balance.bond.fast @@ -59,5 +59,6 @@ fix 10 all balance 50 0.9 rcb thermo_style custom step temp epair press f_10[3] f_10 thermo 100 +timestep 0.001 run 10000 diff --git a/examples/balance/in.balance.bond.slow b/examples/balance/in.balance.bond.slow index 1fd4ae4c85..5e0f9e0568 100644 --- a/examples/balance/in.balance.bond.slow +++ b/examples/balance/in.balance.bond.slow @@ -58,5 +58,6 @@ fix 10 all balance 50 0.9 rcb thermo_style custom step temp epair press f_10[3] f_10 thermo 100 +timestep 0.001 run 40000 diff --git a/examples/balance/log.27Nov18.balance.bond.fast.g++.2 b/examples/balance/log.27Nov18.balance.bond.fast.g++.2 deleted file mode 100644 index 0cc1495368..0000000000 --- a/examples/balance/log.27Nov18.balance.bond.fast.g++.2 +++ /dev/null @@ -1,242 +0,0 @@ -LAMMPS (27 Nov 2018) - 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 bond -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 bond/types 1 extra/bond/per/atom 6 -Created orthogonal box = (0 0 -0.582767) to (58.2767 40.3753 0.582767) - 2 by 1 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.000778913 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 - -bond_style harmonic -bond_coeff 1 10.0 1.2 - -# need to preserve 1-3, 1-4 pairwise interactions during hard collisions - -special_bonds lj/coul 0 1 1 - 0 = max # of 1-2 neighbors - 1 = max # of special neighbors -create_bonds many all all 1 1.0 1.5 -Neighbor list info ... - update every 1 steps, delay 10 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 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) command create_bonds, occasional - attributes: full, newton on - pair build: full/bin - stencil: full/bin/2d - bin: standard - (2) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Added 1014 bonds, new total = 1014 - 6 = max # of 1-2 neighbors - 6 = max # of special neighbors - -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 -comm_modify cutoff 10.0 # because bonds stretch a long ways -fix 10 all balance 50 0.9 rcb - -#compute 1 all property/atom proc -#variable p atom (c_1%10)+1 -#dump 2 all custom 50 tmp.dump id v_p x y z - -#dump 3 all image 50 image.*.jpg v_p type bond atom 0.25 # 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 10000 -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 = 10 - 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/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 5.156 | 5.167 | 5.177 Mbytes -Step Temp E_pair Press f_10[3] f_10 - 0 25.701528 -2.2032569 3.1039469 2 1.0193906 - 100 27.623422 -6.228166 2.6542136 1.0803324 1.0027701 - 200 33.35302 -15.746749 3.2018248 1.1246537 1.0027701 - 300 39.17734 -24.1557 4.9116986 1.1468144 1.0027701 - 400 41.660701 -27.615203 8.6214678 1.2077562 1.0027701 - 500 37.154935 -24.096954 3.2656298 1.2243767 1.0083102 - 600 35.062196 -21.527799 2.3688444 1.1800554 1.0027701 - 700 36.962955 -22.265373 3.0233424 1.1800554 1.0083102 - 800 38.514356 -24.625735 5.2876402 1.2077562 1.0027701 - 900 37.840168 -24.069158 4.443617 1.2022161 1.0083102 - 1000 36.429396 -23.978878 7.2603394 1.1966759 1.0027701 - 1100 34.75827 -22.743232 6.6304628 1.1745152 1.0083102 - 1200 31.057199 -21.46544 3.7869701 1.1634349 1.0083102 - 1300 33.127345 -22.426161 5.824726 1.0858726 1.0027701 - 1400 31.678654 -21.604473 3.2219261 1.0360111 1.0083102 - 1500 28.345212 -18.030807 0.93335223 1.1191136 1.0027701 - 1600 26.031412 -15.389052 0.82549542 1.1080332 1.0027701 - 1700 25.082832 -13.48625 1.0006592 1.0858726 1.0027701 - 1800 25.673875 -13.965883 0.54607043 1.0692521 1.0027701 - 1900 26.530842 -13.979318 2.0285449 1.1024931 1.0027701 - 2000 25.910771 -14.244515 1.9592232 1.1191136 1.0027701 - 2100 28.505636 -16.220559 1.7154775 1.1191136 1.0027701 - 2200 28.142753 -15.564302 2.9946076 1.1135734 1.0027701 - 2300 26.606225 -13.734442 1.4589278 1.0083102 1.0083102 - 2400 25.664988 -12.389759 1.3450183 1.0360111 1.0027701 - 2500 25.145328 -11.815173 0.48162788 1.0360111 1.0027701 - 2600 26.654868 -13.916929 2.8361012 1.0581717 1.0083102 - 2700 27.3758 -15.495452 4.1206412 1.0360111 1.0027701 - 2800 23.60864 -14.520038 1.8948923 1.0193906 1.0027701 - 2900 20.604557 -12.901121 0.17526991 1.0138504 1.0027701 - 3000 20.852473 -12.756946 -0.44987285 1.0360111 1.0027701 - 3100 21.934986 -12.797691 0.76186765 1.0415512 1.0027701 - 3200 23.293263 -12.368233 0.021937309 1.0526316 1.0027701 - 3300 22.091492 -10.88605 0.013006632 1.0415512 1.0083102 - 3400 23.535429 -10.937804 2.0738989 1.0360111 1.0027701 - 3500 24.503573 -12.202994 1.126785 1.0581717 1.0027701 - 3600 23.54503 -12.745709 0.39022194 1.0858726 1.0027701 - 3700 22.658187 -10.986188 -0.18869692 1.0692521 1.0027701 - 3800 21.282045 -9.7879088 -0.061253454 1.0193906 1.0027701 - 3900 20.571754 -9.1157993 -1.0178917 1.0526316 1.0027701 - 4000 23.779702 -10.230328 1.0778525 1.0581717 1.0083102 - 4100 23.675854 -10.63724 0.59402249 1.0415512 1.0027701 - 4200 24.058963 -11.89505 0.3866378 1.0526316 1.0027701 - 4300 22.683721 -11.358978 1.8269036 1.0470914 1.0083102 - 4400 23.002345 -11.081443 0.4529456 1.0415512 1.0027701 - 4500 21.984542 -10.233276 -0.60718244 1.0415512 1.0083102 - 4600 22.079237 -9.979061 0.53013572 1.0415512 1.0027701 - 4700 22.336961 -10.323583 -0.37512832 1.0249307 1.0027701 - 4800 23.351699 -10.143724 0.95694397 1.0470914 1.0027701 - 4900 23.643954 -10.687354 1.6062522 1.0858726 1.0083102 - 5000 25.158132 -11.532398 1.3083639 1.0914127 1.0027701 - 5100 23.755521 -10.978548 0.60587307 1.0470914 1.0027701 - 5200 21.842692 -10.443216 -0.41185899 1.0637119 1.0027701 - 5300 22.828066 -10.871114 1.1754353 1.0470914 1.0027701 - 5400 24.883977 -12.39165 0.65101173 1.0470914 1.0027701 - 5500 22.908286 -11.419431 1.4712698 1.0637119 1.0027701 - 5600 22.718634 -12.083974 1.5706808 1.0526316 1.0027701 - 5700 23.080763 -11.464882 1.2979578 1.0304709 1.0083102 - 5800 21.877026 -11.483185 0.279772 1.0360111 1.0027701 - 5900 22.526809 -10.868636 0.37121786 1.0637119 1.0083102 - 6000 22.908857 -10.311118 0.58244569 1.0526316 1.0083102 - 6100 22.399847 -10.222706 0.87875674 1.0858726 1.0027701 - 6200 22.623463 -10.035541 -0.25811274 1.0304709 1.0027701 - 6300 21.518006 -10.017552 -0.98187611 1.0470914 1.0083102 - 6400 21.269816 -11.297716 0.20058535 1.0138504 1.0027701 - 6500 23.362834 -11.263306 0.47670072 1.0692521 1.0027701 - 6600 23.705236 -12.358492 -0.63286237 1.0027701 1.0027701 - 6700 22.410623 -10.849516 0.57027834 1.0581717 1.0083102 - 6800 21.661639 -9.3981379 0.38726515 1.0470914 1.0027701 - 6900 21.856521 -8.8451751 0.053822789 1.0304709 1.0027701 - 7000 21.069495 -8.6443387 -0.10412144 1.0193906 1.0027701 - 7100 22.305494 -10.098469 -0.22662961 1.0581717 1.0027701 - 7200 23.52884 -11.055929 -0.099869868 1.0692521 1.0027701 - 7300 24.042008 -11.411758 2.0528788 1.0415512 1.0027701 - 7400 22.870777 -12.408763 0.33346225 1.0249307 1.0027701 - 7500 21.290152 -10.963058 0.26940112 1.0083102 1.0027701 - 7600 21.702686 -10.36214 0.84057004 1.0083102 1.0027701 - 7700 22.478034 -10.832724 -0.70855164 1.0747922 1.0027701 - 7800 22.856853 -11.161008 -0.88354803 1.0083102 1.0083102 - 7900 22.579842 -10.789899 0.40865274 1.0360111 1.0027701 - 8000 24.364281 -12.116023 -0.44788445 1.0249307 1.0083102 - 8100 22.993409 -10.261331 0.44712215 1.0193906 1.0027701 - 8200 23.006207 -10.723372 1.2357091 1.0415512 1.0083102 - 8300 23.292233 -10.041314 2.143692 1.0581717 1.0027701 - 8400 21.658087 -10.089378 -0.25838681 1.0083102 1.0027701 - 8500 23.268456 -10.356603 0.089787317 1.0526316 1.0083102 - 8600 22.572019 -10.32801 0.12320758 1.0526316 1.0027701 - 8700 22.970465 -10.662456 0.57027398 1.0581717 1.0083102 - 8800 23.515552 -10.415842 1.0048598 1.0138504 1.0083102 - 8900 22.733961 -10.343495 0.19917627 1.0360111 1.0083102 - 9000 21.835458 -9.8740971 -1.0653164 1.0193906 1.0027701 - 9100 22.062821 -9.2303832 0.21428267 1.0415512 1.0083102 - 9200 23.020404 -10.321542 -0.48757848 1.0193906 1.0083102 - 9300 22.529362 -9.2916938 0.57056277 1.0415512 1.0027701 - 9400 23.301911 -10.538876 0.80637627 1.0138504 1.0027701 - 9500 21.984286 -9.4754676 -0.19048233 1.0193906 1.0027701 - 9600 23.710224 -10.274983 0.72268146 1.0249307 1.0027701 - 9700 22.317038 -9.3509008 -0.45727658 1.0360111 1.0027701 - 9800 23.41615 -10.026331 -0.45909049 1.0415512 1.0027701 - 9900 22.130299 -11.18528 -0.15359132 1.0747922 1.0027701 - 10000 23.273859 -11.337403 0.4036321 1.0304709 1.0083102 -Loop time of 1.18289 on 2 procs for 10000 steps with 361 atoms - -Performance: 3652073.393 tau/day, 8453.874 timesteps/s -97.0% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.25191 | 0.25685 | 0.2618 | 1.0 | 21.71 -Bond | 0.097655 | 0.098332 | 0.099009 | 0.2 | 8.31 -Neigh | 0.53258 | 0.53993 | 0.54728 | 1.0 | 45.65 -Comm | 0.13457 | 0.15372 | 0.17288 | 4.9 | 13.00 -Output | 0.0013587 | 0.0016007 | 0.0018427 | 0.6 | 0.14 -Modify | 0.074109 | 0.074314 | 0.074518 | 0.1 | 6.28 -Other | | 0.05813 | | | 4.91 - -Nlocal: 180.5 ave 182 max 179 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 172.5 ave 175 max 170 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 1421 ave 1488 max 1354 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 2842 -Ave neighs/atom = 7.87258 -Ave special neighs/atom = 5.61773 -Neighbor list builds = 4884 -Dangerous builds = 0 -Total wall time: 0:00:01 diff --git a/examples/balance/log.27Nov18.balance.bond.fast.g++.4 b/examples/balance/log.27Nov18.balance.bond.fast.g++.4 deleted file mode 100644 index 5cd072cf66..0000000000 --- a/examples/balance/log.27Nov18.balance.bond.fast.g++.4 +++ /dev/null @@ -1,242 +0,0 @@ -LAMMPS (27 Nov 2018) - 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 bond -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 bond/types 1 extra/bond/per/atom 6 -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.00067687 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 - -bond_style harmonic -bond_coeff 1 10.0 1.2 - -# need to preserve 1-3, 1-4 pairwise interactions during hard collisions - -special_bonds lj/coul 0 1 1 - 0 = max # of 1-2 neighbors - 1 = max # of special neighbors -create_bonds many all all 1 1.0 1.5 -Neighbor list info ... - update every 1 steps, delay 10 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 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) command create_bonds, occasional - attributes: full, newton on - pair build: full/bin - stencil: full/bin/2d - bin: standard - (2) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Added 1014 bonds, new total = 1014 - 6 = max # of 1-2 neighbors - 6 = max # of special neighbors - -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 -comm_modify cutoff 10.0 # because bonds stretch a long ways -fix 10 all balance 50 0.9 rcb - -#compute 1 all property/atom proc -#variable p atom (c_1%10)+1 -#dump 2 all custom 50 tmp.dump id v_p x y z - -#dump 3 all image 50 image.*.jpg v_p type bond atom 0.25 # 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 10000 -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 = 10 - 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/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 5.122 | 5.141 | 5.174 Mbytes -Step Temp E_pair Press f_10[3] f_10 - 0 25.701528 -2.2032569 3.1039469 3.2354571 1.0526316 - 100 27.623422 -6.228166 2.6542136 1.2631579 1.0083102 - 200 33.35302 -15.746749 3.2018248 1.2963989 1.0193906 - 300 39.17734 -24.1557 4.9116986 1.2963989 1.0193906 - 400 41.660701 -27.615203 8.6214679 1.3518006 1.0083102 - 500 37.154928 -24.096946 3.2656177 1.3296399 1.0304709 - 600 35.059873 -21.524223 2.3729526 1.3296399 1.0083102 - 700 36.735117 -22.012675 3.266197 1.3296399 1.0083102 - 800 39.218223 -25.076176 4.7162461 1.4182825 1.0193906 - 900 38.003628 -24.598176 3.4651756 1.4958449 1.0083102 - 1000 37.599298 -25.117714 4.6714491 1.2963989 1.0193906 - 1100 35.587211 -24.476201 4.8766816 1.2077562 1.0083102 - 1200 33.05745 -21.457847 4.7304313 1.2188366 1.0193906 - 1300 35.505899 -20.103017 7.0543469 1.1523546 1.0193906 - 1400 32.687958 -18.411286 2.8022421 1.1523546 1.0083102 - 1500 30.681103 -13.979491 1.5780815 1.1523546 1.0083102 - 1600 28.134276 -12.408217 1.4370834 1.2188366 1.0193906 - 1700 29.150676 -12.486223 1.7118526 1.1745152 1.0083102 - 1800 29.456937 -11.386522 2.0484739 1.1966759 1.0193906 - 1900 28.029998 -11.168436 0.38519481 1.1080332 1.0193906 - 2000 29.476997 -12.337678 1.8878345 1.1523546 1.0083102 - 2100 30.113294 -12.201714 2.8003366 1.1634349 1.0193906 - 2200 31.599067 -13.710787 2.5654923 1.2188366 1.0083102 - 2300 31.333799 -12.269386 1.9573739 1.1412742 1.0193906 - 2400 28.587094 -10.98229 2.090581 1.1745152 1.0083102 - 2500 28.012332 -11.416553 2.3293146 1.1855956 1.0083102 - 2600 28.703189 -13.33369 2.7247345 1.1080332 1.0083102 - 2700 26.933934 -13.546384 0.71447362 1.0415512 1.0304709 - 2800 24.556936 -12.231427 0.012081842 1.0526316 1.0193906 - 2900 24.362943 -10.921093 -0.6063159 1.0858726 1.0193906 - 3000 24.583358 -10.025143 0.35975315 1.0637119 1.0083102 - 3100 26.119046 -10.124317 0.75140102 1.0415512 1.0193906 - 3200 27.665317 -11.418452 0.39942176 1.1301939 1.0083102 - 3300 27.771434 -9.9777413 0.94693011 1.1080332 1.0083102 - 3400 25.692188 -9.9016885 2.2582772 1.0415512 1.0083102 - 3500 27.009276 -10.504438 0.98279258 1.1301939 1.0083102 - 3600 26.082843 -9.4359595 -0.030819747 1.1301939 1.0083102 - 3700 23.956851 -8.4601884 -0.45748969 1.0858726 1.0304709 - 3800 24.92141 -8.3315871 -0.19512647 1.0969529 1.0083102 - 3900 26.048044 -9.6299934 0.40522014 1.0858726 1.0083102 - 4000 26.558961 -10.032084 0.56213613 1.1745152 1.0083102 - 4100 26.949686 -10.133598 1.0140825 1.0747922 1.0083102 - 4200 25.868196 -9.3971859 1.2758465 1.0969529 1.0083102 - 4300 24.563369 -9.5992996 0.17389949 1.1191136 1.0193906 - 4400 24.032818 -10.002668 0.10233743 1.0969529 1.0083102 - 4500 25.281577 -9.948799 0.7590423 1.1523546 1.0083102 - 4600 25.010901 -10.195479 -0.24424931 1.0747922 1.0193906 - 4700 25.062368 -9.2973021 1.1755931 1.0858726 1.0193906 - 4800 25.70912 -8.890895 1.0780397 1.1080332 1.0193906 - 4900 26.027757 -10.205469 1.0644859 1.1080332 1.0083102 - 5000 25.845739 -9.8511049 0.49059257 1.1301939 1.0193906 - 5100 25.614064 -9.0396911 0.40825814 1.0526316 1.0304709 - 5200 25.548135 -9.000613 0.81571441 1.1080332 1.0083102 - 5300 26.592601 -9.2385129 1.4983434 1.0637119 1.0193906 - 5400 26.230779 -9.8226036 1.0072462 1.0858726 1.0083102 - 5500 26.809887 -9.9569954 1.4074968 1.0415512 1.0083102 - 5600 25.722206 -10.240487 -0.5216434 1.0747922 1.0193906 - 5700 24.973866 -9.0820997 0.92104357 1.0193906 1.0083102 - 5800 24.257134 -9.5439897 -0.75290789 1.0858726 1.0083102 - 5900 25.524917 -8.9920216 1.2049479 1.1191136 1.0083102 - 6000 24.816532 -9.5865764 -0.66634446 1.0637119 1.0193906 - 6100 27.034385 -9.4017037 1.0769494 1.0969529 1.0083102 - 6200 24.19144 -8.2292864 0.97913204 1.0415512 1.0193906 - 6300 26.112877 -9.1531212 0.77578963 1.0526316 1.0193906 - 6400 25.820541 -9.9662231 -0.092724413 1.0969529 1.0193906 - 6500 26.181404 -9.5875764 -0.30106405 1.1634349 1.0083102 - 6600 27.770851 -8.8366116 0.94545206 1.0304709 1.0193906 - 6700 26.065489 -9.8223382 0.24640067 1.0526316 1.0193906 - 6800 27.468165 -10.160923 2.7263738 1.0747922 1.0304709 - 6900 27.317955 -10.356911 1.131609 1.0526316 1.0304709 - 7000 26.343789 -9.9153453 1.0385354 1.0858726 1.0193906 - 7100 24.366577 -8.9243936 0.37685043 1.0526316 1.0193906 - 7200 25.570042 -8.9195237 0.44206575 1.0637119 1.0193906 - 7300 24.635046 -8.4524117 -0.20581694 1.0193906 1.0193906 - 7400 27.161863 -7.9885934 1.1323072 1.0858726 1.0193906 - 7500 26.8044 -9.5703931 0.69476535 1.0858726 1.0193906 - 7600 27.381006 -10.702178 -0.20230101 1.0526316 1.0083102 - 7700 26.507406 -9.828117 0.50115907 1.0415512 1.0193906 - 7800 25.945271 -8.9912842 0.89121191 1.0747922 1.0083102 - 7900 24.498681 -7.7193231 -0.63874494 1.0858726 1.0083102 - 8000 24.517408 -7.6046107 -0.91642337 1.0415512 1.0083102 - 8100 26.388387 -8.1883906 0.093136981 1.1080332 1.0193906 - 8200 26.261054 -8.7223732 -0.086859057 1.0747922 1.0083102 - 8300 26.287026 -9.2583895 0.79506804 1.0858726 1.0083102 - 8400 24.691375 -9.0701909 -0.40058151 1.0637119 1.0193906 - 8500 25.390612 -7.9499801 0.59874113 1.1412742 1.0193906 - 8600 26.84383 -8.5520984 0.37618599 1.0637119 1.0083102 - 8700 25.685137 -7.688836 0.035978149 1.0415512 1.0193906 - 8800 26.614591 -9.0444146 0.20671465 1.0193906 1.0083102 - 8900 25.782718 -8.2594705 0.54378816 1.0747922 1.0304709 - 9000 26.026886 -8.6777252 0.25418163 1.1191136 1.0083102 - 9100 27.246916 -9.0307861 1.211131 1.0526316 1.0193906 - 9200 27.282948 -9.180029 -0.0056269613 1.0747922 1.0083102 - 9300 27.029692 -8.7791461 0.35971649 1.0304709 1.0083102 - 9400 26.549013 -7.5083174 0.77607249 1.0969529 1.0193906 - 9500 25.533731 -9.2763668 0.28360762 1.0969529 1.0083102 - 9600 27.997538 -9.2766769 1.6968428 1.0637119 1.0083102 - 9700 26.977436 -9.21372 1.8007256 1.0637119 1.0083102 - 9800 25.547091 -9.1024445 -0.29158273 1.0969529 1.0193906 - 9900 26.378841 -8.7645665 1.0385835 1.1080332 1.0083102 - 10000 26.699368 -8.5450739 0.19591452 1.0526316 1.0193906 -Loop time of 0.916576 on 4 procs for 10000 steps with 361 atoms - -Performance: 4713193.307 tau/day, 10910.170 timesteps/s -92.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.10915 | 0.12374 | 0.14167 | 3.5 | 13.50 -Bond | 0.047075 | 0.049849 | 0.054161 | 1.2 | 5.44 -Neigh | 0.31176 | 0.3246 | 0.3384 | 1.7 | 35.41 -Comm | 0.24271 | 0.26717 | 0.30549 | 4.9 | 29.15 -Output | 0.0017068 | 0.0021075 | 0.0031145 | 1.3 | 0.23 -Modify | 0.064639 | 0.065705 | 0.067641 | 0.5 | 7.17 -Other | | 0.08341 | | | 9.10 - -Nlocal: 90.25 ave 92 max 89 min -Histogram: 1 0 0 2 0 0 0 0 0 1 -Nghost: 248.25 ave 264 max 230 min -Histogram: 1 0 0 0 0 2 0 0 0 1 -Neighs: 569.5 ave 657 max 519 min -Histogram: 2 0 0 0 1 0 0 0 0 1 - -Total # of neighbors = 2278 -Ave neighs/atom = 6.31025 -Ave special neighs/atom = 5.61773 -Neighbor list builds = 4964 -Dangerous builds = 14 -Total wall time: 0:00:00 diff --git a/examples/balance/log.27Nov18.balance.bond.slow.g++.2 b/examples/balance/log.27Nov18.balance.bond.slow.g++.2 deleted file mode 100644 index 5e23613f1f..0000000000 --- a/examples/balance/log.27Nov18.balance.bond.slow.g++.2 +++ /dev/null @@ -1,541 +0,0 @@ -LAMMPS (27 Nov 2018) - 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 - -# careful not to slam into wall too hard - -variable v index 0.3 -variable w index 0.08 - -units lj -dimension 2 -atom_style bond -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 bond/types 1 extra/bond/per/atom 6 -Created orthogonal box = (0 0 -0.582767) to (58.2767 40.3753 0.582767) - 2 by 1 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.000762701 secs -mass 1 1.0 - -velocity all create 0.5 87287 loop geom -velocity all set $v $w 0 sum yes -velocity all set 0.3 $w 0 sum yes -velocity all set 0.3 0.08 0 sum yes - -pair_style lj/cut 2.5 -pair_coeff 1 1 10.0 1.0 2.5 - -bond_style harmonic -bond_coeff 1 10.0 1.2 - -create_bonds many all all 1 1.0 1.5 -Neighbor list info ... - update every 1 steps, delay 10 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 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) command create_bonds, occasional - attributes: full, newton on - pair build: full/bin - stencil: full/bin/2d - bin: standard - (2) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Added 1014 bonds, new total = 1014 - 6 = max # of 1-2 neighbors - 30 = max # of 1-3 neighbors - 180 = max # of 1-4 neighbors - 36 = max # of special neighbors - -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)+1 -#dump 2 all custom 50 tmp.dump id v_p x y z - -#dump 3 all image 200 image.*.jpg v_p type bond atom 0.25 # 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 40000 -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/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 7.079 | 7.108 | 7.137 Mbytes -Step Temp E_pair Press f_10[3] f_10 - 0 0.57437856 0 0.26099453 2 1.0193906 - 100 0.29756515 0 0.10149401 1.0027701 1.0027701 - 200 0.35394813 0 0.075159099 1.0027701 1.0083102 - 300 0.39245849 0 0.033002384 1.0027701 1.0027701 - 400 0.34078347 0 -0.020825841 1.0083102 1.0027701 - 500 0.35201095 0 -0.062637506 1.0027701 1.0027701 - 600 0.34014717 0 -0.11122965 1.0249307 1.0027701 - 700 0.3323524 0 -0.11598015 1.0083102 1.0027701 - 800 0.35116047 0 -0.096162395 1.0138504 1.0027701 - 900 0.35695352 0 -0.01385176 1.0249307 1.0027701 - 1000 0.36986539 0 0.056772858 1.0027701 1.0027701 - 1100 0.34584644 0 0.084941323 1.0138504 1.0027701 - 1200 0.31921435 0 0.10545078 1.0138504 1.0027701 - 1300 0.32952819 0 0.124902 1.0027701 1.0027701 - 1400 0.34497365 0 0.12662081 1.0138504 1.0027701 - 1500 0.33429243 0 0.096230972 1.0193906 1.0027701 - 1600 0.33765387 0 0.025800542 1.0193906 1.0027701 - 1700 0.35134464 0 -0.04422593 1.0083102 1.0027701 - 1800 0.35003859 0 -0.096745576 1.0083102 1.0083102 - 1900 0.33839618 0 -0.095465943 1.0027701 1.0027701 - 2000 0.33732078 0 -0.094652802 1.0027701 1.0027701 - 2100 0.34552238 0 -0.076729261 1.0083102 1.0027701 - 2200 0.34893142 0 -0.036853228 1.0083102 1.0083102 - 2300 0.35379341 0 0.021124847 1.0193906 1.0027701 - 2400 0.34829744 0 0.09230184 1.0027701 1.0027701 - 2500 0.33038141 0 0.1399855 1.0027701 1.0083102 - 2600 0.30983019 0 0.12754742 1.0083102 1.0027701 - 2700 0.32992561 0 0.10485138 1.0193906 1.0027701 - 2800 0.34604747 0 0.066174138 1.0083102 1.0027701 - 2900 0.3444791 0 0.036590652 1.0083102 1.0083102 - 3000 0.34721342 0 -0.023793368 1.0138504 1.0027701 - 3100 0.33404314 0 -0.08374223 1.0083102 1.0027701 - 3200 0.33019355 0 -0.12715599 1.0083102 1.0027701 - 3300 0.33515177 0 -0.12217394 1.0083102 1.0027701 - 3400 0.33628481 0 -0.070877624 1.0083102 1.0027701 - 3500 0.34257038 0 -0.021612062 1.0027701 1.0027701 - 3600 0.32838009 0 0.030131228 1.0027701 1.0027701 - 3700 0.34462142 0 0.074586378 1.0138504 1.0027701 - 3800 0.30891825 0 0.10605673 1.0138504 1.0027701 - 3900 0.33847951 0 0.13956139 1.0027701 1.0027701 - 4000 0.32952079 0 0.12688129 1.0027701 1.0027701 - 4100 0.32646772 0 0.081089042 1.0083102 1.0027701 - 4200 0.35399503 0 0.013422873 1.0027701 1.0027701 - 4300 0.33154914 0 -0.050919508 1.0027701 1.0083102 - 4400 0.34113556 0 -0.083171 1.0249307 1.0027701 - 4500 0.32651708 0 -0.1063133 1.0193906 1.0027701 - 4600 0.34359609 0 -0.1076395 1.0027701 1.0027701 - 4700 0.34973537 0 -0.088231606 1.0138504 1.0027701 - 4800 0.35198515 0 -0.020901044 1.0027701 1.0027701 - 4900 0.35187284 0 0.043645941 1.0193906 1.0027701 - 5000 0.34887336 0 0.095698609 1.0027701 1.0027701 - 5100 0.30308163 0 0.11649328 1.0138504 1.0027701 - 5200 0.32401285 0 0.12072411 1.0083102 1.0083102 - 5300 0.33025072 0 0.10933161 1.0138504 1.0027701 - 5400 0.33288012 0 0.078356448 1.0083102 1.0027701 - 5500 0.35142492 0 0.036958063 1.0027701 1.0027701 - 5600 0.35125368 0 -0.041371343 1.0193906 1.0027701 - 5700 0.34547744 0 -0.096450846 1.0193906 1.0027701 - 5800 0.30939887 0 -0.12356656 1.0027701 1.0083102 - 5900 0.32315628 0 -0.11338676 1.0083102 1.0027701 - 6000 0.34117485 0 -0.066198961 1.0027701 1.0027701 - 6100 0.35298043 0 -0.016172816 1.0138504 1.0027701 - 6200 0.35130653 0 0.027660468 1.0027701 1.0027701 - 6300 0.35398766 0 0.087221238 1.0027701 1.0027701 - 6400 0.30963379 0 0.11990957 1.0138504 1.0027701 - 6500 0.3174541 0 0.14103528 1.0083102 1.0083102 - 6600 0.31989791 0 0.11575506 1.0083102 1.0083102 - 6700 0.33811477 0 0.060747353 1.0083102 1.0083102 - 6800 0.3424043 0 0.010357152 1.0083102 1.0027701 - 6900 0.34804319 0 -0.042621786 1.0083102 1.0027701 - 7000 0.35357865 0 -0.067248959 1.0027701 1.0027701 - 7100 0.33556885 0 -0.10983726 1.0083102 1.0027701 - 7200 0.33531101 0 -0.112179 1.0027701 1.0027701 - 7300 0.35742607 0 -0.078405267 1.0083102 1.0027701 - 7400 0.34577559 0 -0.01985432 1.0027701 1.0083102 - 7500 0.3498641 0 0.052289439 1.0027701 1.0027701 - 7600 0.33773715 0 0.092939035 1.0027701 1.0027701 - 7700 0.33093497 0 0.11924405 1.0083102 1.0027701 - 7800 0.31435814 0 0.12701724 1.0027701 1.0027701 - 7900 0.33132217 0 0.10793075 1.0083102 1.0027701 - 8000 0.33451798 0 0.077993125 1.0027701 1.0027701 - 8100 0.35188371 0 0.019929977 1.0083102 1.0083102 - 8200 0.33645742 0 -0.039302079 1.0027701 1.0027701 - 8300 0.3415632 0 -0.098067982 1.0138504 1.0027701 - 8400 0.30619282 0 -0.12952879 1.0138504 1.0027701 - 8500 0.34446484 0 -0.098084709 1.0027701 1.0027701 - 8600 0.33761673 0 -0.07069818 1.0027701 1.0027701 - 8700 0.34495452 0 -0.022458056 1.0083102 1.0027701 - 8800 0.33502983 0 0.027742411 1.0027701 1.0027701 - 8900 0.35418591 0 0.092390134 1.0083102 1.0083102 - 9000 0.31648387 0 0.12467398 1.0083102 1.0027701 - 9100 0.33994825 0 0.14460327 1.0138504 1.0027701 - 9200 0.33822571 0 0.11273284 1.0027701 1.0027701 - 9300 0.33260773 0 0.060063671 1.0083102 1.0083102 - 9400 0.36140305 0 0.021427642 1.0138504 1.0027701 - 9500 0.34273562 0 -0.034064202 1.0083102 1.0027701 - 9600 0.33867054 0 -0.089076906 1.0138504 1.0027701 - 9700 0.32088235 0 -0.12027075 1.0138504 1.0083102 - 9800 0.3320823 0 -0.11602794 1.0138504 1.0027701 - 9900 0.33916442 0 -0.080281044 1.0083102 1.0027701 - 10000 0.34852268 0 -0.01000914 1.0083102 1.0083102 - 10100 0.32955942 0 0.04258493 1.0027701 1.0083102 - 10200 0.34487898 0 0.086971308 1.0083102 1.0027701 - 10300 0.32325593 0 0.11558149 1.0138504 1.0027701 - 10400 0.30927871 0 0.12239437 1.0027701 1.0027701 - 10500 0.33176799 0 0.12285937 1.0138504 1.0083102 - 10600 0.35120027 0 0.084897432 1.0027701 1.0027701 - 10700 0.33129697 0 0.0053089279 1.0138504 1.0027701 - 10800 0.36028769 0 -0.04280715 1.0083102 1.0027701 - 10900 0.35552287 0 -0.084955999 1.0138504 1.0027701 - 11000 0.3406024 0 -0.096554577 1.0027701 1.0027701 - 11100 0.33041202 0 -0.10703492 1.0138504 1.0027701 - 11200 0.32442686 0 -0.084328121 1.0193906 1.0027701 - 11300 0.35952468 0 -0.020191965 1.0083102 1.0027701 - 11400 0.34610624 0 0.03440148 1.0138504 1.0027701 - 11500 0.3415612 0 0.1041929 1.0027701 1.0027701 - 11600 0.34040042 0 0.13215705 1.0138504 1.0027701 - 11700 0.33555094 0 0.12738686 1.0193906 1.0027701 - 11800 0.3458647 0 0.10963398 1.0027701 1.0083102 - 11900 0.33836678 0 0.067253864 1.0138504 1.0027701 - 12000 0.34853314 0 0.03201448 1.0027701 1.0027701 - 12100 0.34600048 0 -0.034833402 1.0083102 1.0027701 - 12200 0.33145631 0 -0.09865675 1.0083102 1.0027701 - 12300 0.32848884 0 -0.1248489 1.0083102 1.0027701 - 12400 0.3321344 0 -0.11266575 1.0027701 1.0083102 - 12500 0.32622305 0 -0.061634993 1.0083102 1.0083102 - 12600 0.36213537 0 -0.0090593315 1.0138504 1.0027701 - 12700 0.34673866 0 0.036734645 1.0138504 1.0027701 - 12800 0.34606618 0 0.086267678 1.0138504 1.0027701 - 12900 0.34271431 0 0.12415522 1.0027701 1.0027701 - 13000 0.31993287 0 0.13879926 1.0027701 1.0083102 - 13100 0.3422918 0 0.11978905 1.0083102 1.0027701 - 13200 0.33055236 0 0.062620483 1.0083102 1.0027701 - 13300 0.34652207 0 0.0043833459 1.0138504 1.0027701 - 13400 0.33574661 0 -0.04691024 1.0027701 1.0027701 - 13500 0.33940837 0 -0.074241604 1.0027701 1.0083102 - 13600 0.32093414 0 -0.1078027 1.0138504 1.0083102 - 13700 0.34336597 0 -0.10544097 1.0027701 1.0027701 - 13800 0.35806461 0 -0.072531559 1.0027701 1.0027701 - 13900 0.35209713 0 -0.018851408 1.0083102 1.0083102 - 14000 0.35702629 0 0.061046366 1.0027701 1.0027701 - 14100 0.33234093 0 0.094086465 1.0027701 1.0027701 - 14200 0.3459466 0 0.12186656 1.0027701 1.0027701 - 14300 0.3327428 0 0.11396572 1.0027701 1.0027701 - 14400 0.32409443 0 0.10658903 1.0083102 1.0083102 - 14500 0.35022184 0 0.083558031 1.0083102 1.0083102 - 14600 0.34823843 0 0.024605569 1.0083102 1.0083102 - 14700 0.35298973 0 -0.040418888 1.0027701 1.0027701 - 14800 0.33679845 0 -0.10067728 1.0027701 1.0027701 - 14900 0.32790966 0 -0.10925568 1.0083102 1.0027701 - 15000 0.34208495 0 -0.09568004 1.0193906 1.0027701 - 15100 0.33647529 0 -0.055652929 1.0027701 1.0027701 - 15200 0.35328398 0 -0.020236536 1.0083102 1.0027701 - 15300 0.34252669 0 0.026434179 1.0083102 1.0027701 - 15400 0.34409435 0 0.094410599 1.0027701 1.0027701 - 15500 0.32288994 0 0.12034455 1.0083102 1.0027701 - 15600 0.32109689 0 0.13645185 1.0083102 1.0027701 - 15700 0.33681572 0 0.098607746 1.0083102 1.0027701 - 15800 0.33635195 0 0.05570715 1.0083102 1.0083102 - 15900 0.34289757 0 0.013849092 1.0083102 1.0027701 - 16000 0.34225547 0 -0.035597548 1.0193906 1.0027701 - 16100 0.33660991 0 -0.076931881 1.0027701 1.0027701 - 16200 0.32802152 0 -0.12765884 1.0083102 1.0027701 - 16300 0.3469374 0 -0.10785455 1.0083102 1.0083102 - 16400 0.34053641 0 -0.070259853 1.0027701 1.0027701 - 16500 0.34610591 0 -0.014315306 1.0083102 1.0027701 - 16600 0.35109001 0 0.041251169 1.0138504 1.0027701 - 16700 0.34336905 0 0.077996627 1.0193906 1.0027701 - 16800 0.33277414 0 0.11053634 1.0027701 1.0083102 - 16900 0.32183338 0 0.11680626 1.0027701 1.0027701 - 17000 0.34044352 0 0.10806555 1.0138504 1.0027701 - 17100 0.32967873 0 0.067759786 1.0138504 1.0027701 - 17200 0.36172278 0 -0.0048631904 1.0083102 1.0083102 - 17300 0.35619435 0 -0.04215545 1.0027701 1.0027701 - 17400 0.34540936 0 -0.093994174 1.0083102 1.0027701 - 17500 0.33193585 0 -0.098831315 1.0083102 1.0027701 - 17600 0.3544756 0 -0.085660403 1.0083102 1.0083102 - 17700 0.34505209 0 -0.069640515 1.0193906 1.0083102 - 17800 0.36291124 0 -0.0063088133 1.0027701 1.0027701 - 17900 0.34255705 0 0.046794555 1.0027701 1.0027701 - 18000 0.34163238 0 0.11767705 1.0138504 1.0027701 - 18100 0.3466445 0 0.1351712 1.0193906 1.0083102 - 18200 0.33037668 0 0.12703659 1.0027701 1.0027701 - 18300 0.33677404 0 0.10956306 1.0027701 1.0083102 - 18400 0.34978954 0 0.087193072 1.0027701 1.0027701 - 18500 0.33354363 0 0.051095814 1.0138504 1.0027701 - 18600 0.34651729 0 0.0056245561 1.0027701 1.0027701 - 18700 0.32622232 0 -0.047319269 1.0027701 1.0083102 - 18800 0.32978847 0 -0.054929416 1.0138504 1.0027701 - 18900 0.34192451 0 -0.037252471 1.0027701 1.0027701 - 19000 0.34061294 0 -0.001167235 1.0083102 1.0027701 - 19100 0.34194478 0 0.016945224 1.0083102 1.0027701 - 19200 0.33321765 0 0.050665354 1.0193906 1.0027701 - 19300 0.33197783 0 0.080470585 1.0138504 1.0027701 - 19400 0.33284715 0 0.12423599 1.0193906 1.0027701 - 19500 0.33867856 0 0.12689524 1.0027701 1.0027701 - 19600 0.36092786 0 0.11417704 1.0027701 1.0027701 - 19700 0.34270183 0 0.069038291 1.0249307 1.0083102 - 19800 0.34880695 0 0.042483681 1.0083102 1.0083102 - 19900 0.33903644 0 0.034788638 1.0027701 1.0027701 - 20000 0.32590125 0 0.011383785 1.0083102 1.0083102 - 20100 0.30358859 0 0.0030743554 1.0138504 1.0027701 - 20200 0.31830224 0 0.017637826 1.0027701 1.0027701 - 20300 0.34195438 0 0.072811099 1.0193906 1.0083102 - 20400 0.31249563 0 0.10063541 1.0083102 1.0027701 - 20500 0.31544938 0 0.1405794 1.0027701 1.0027701 - 20600 0.30071644 0 0.12763486 1.0027701 1.0027701 - 20700 0.2890265 0 0.1136651 1.0083102 1.0027701 - 20800 0.28962296 0 0.094481978 1.0083102 1.0027701 - 20900 0.29447212 0 0.0967165 1.0138504 1.0083102 - 21000 0.31159961 0 0.067307231 1.0027701 1.0027701 - 21100 0.30490648 0 0.017689358 1.0027701 1.0083102 - 21200 0.30687262 0 -0.016055512 1.0027701 1.0083102 - 21300 0.30083286 0 -0.0014988997 1.0083102 1.0027701 - 21400 0.32070426 0 0.015960302 1.0083102 1.0083102 - 21500 0.31439311 0 0.038170385 1.0083102 1.0083102 - 21600 0.32617832 0 0.043263788 1.0083102 1.0027701 - 21700 0.35151793 0 0.066302727 1.0083102 1.0083102 - 21800 0.35912885 0 0.070099103 1.0027701 1.0027701 - 21900 0.32451958 0 0.068935768 1.0083102 1.0027701 - 22000 0.35219298 0 0.067161227 1.0138504 1.0083102 - 22100 0.34857705 0 0.032731746 1.0138504 1.0027701 - 22200 0.34750227 0 0.0056917695 1.0027701 1.0027701 - 22300 0.34766017 0 -0.0027090483 1.0027701 1.0083102 - 22400 0.33426062 0 -0.023196063 1.0027701 1.0083102 - 22500 0.34174625 0 -0.025019717 1.0083102 1.0027701 - 22600 0.3356145 0 -0.029707418 1.0138504 1.0027701 - 22700 0.3362653 0 -0.035815733 1.0083102 1.0027701 - 22800 0.33973405 0 -0.0024705835 1.0193906 1.0027701 - 22900 0.33813085 0 0.0077527467 1.0027701 1.0027701 - 23000 0.33339981 0 0.028340744 1.0027701 1.0027701 - 23100 0.34079832 0 0.018521302 1.0249307 1.0027701 - 23200 0.33074548 0 0.032378405 1.0138504 1.0083102 - 23300 0.32965664 0 0.035989589 1.0138504 1.0027701 - 23400 0.30927749 0 0.024581106 1.0083102 1.0027701 - 23500 0.32890632 0 0.01092479 1.0138504 1.0083102 - 23600 0.34137438 0 0.0094839745 1.0083102 1.0027701 - 23700 0.34512638 0 -0.012392771 1.0138504 1.0027701 - 23800 0.31781354 0 -0.012908449 1.0027701 1.0027701 - 23900 0.32405513 0 -0.015018071 1.0027701 1.0027701 - 24000 0.33549728 0 -0.012812915 1.0083102 1.0083102 - 24100 0.31368736 0 -0.020818372 1.0027701 1.0027701 - 24200 0.33533836 0 0.0056121057 1.0027701 1.0027701 - 24300 0.32530627 0 0.018183931 1.0249307 1.0027701 - 24400 0.31930662 0 0.027446878 1.0027701 1.0083102 - 24500 0.33540302 0 0.040307455 1.0193906 1.0027701 - 24600 0.34020431 0 0.027403921 1.0027701 1.0027701 - 24700 0.3291814 0 0.01204865 1.0083102 1.0027701 - 24800 0.31552604 0 0.019654111 1.0083102 1.0083102 - 24900 0.34727253 0 0.01670543 1.0027701 1.0027701 - 25000 0.35120105 0 0.0038617562 1.0083102 1.0027701 - 25100 0.32706871 0 -0.021196623 1.0193906 1.0083102 - 25200 0.32915282 0 -0.017146508 1.0083102 1.0027701 - 25300 0.32577518 0 -0.01312495 1.0083102 1.0027701 - 25400 0.33286855 0 0.0014726193 1.0138504 1.0027701 - 25500 0.33002601 0 0.0080974022 1.0083102 1.0027701 - 25600 0.34127655 0 0.014296091 1.0138504 1.0083102 - 25700 0.34048065 0 0.022513032 1.0083102 1.0027701 - 25800 0.33029079 0 0.038733531 1.0138504 1.0027701 - 25900 0.33031324 0 0.026156982 1.0027701 1.0027701 - 26000 0.32967371 0 0.028727383 1.0027701 1.0083102 - 26100 0.33775718 0 0.015607478 1.0027701 1.0083102 - 26200 0.35097144 0 0.012291703 1.0027701 1.0027701 - 26300 0.34303792 0 0.00094823191 1.0027701 1.0083102 - 26400 0.33632665 0 -0.0026904889 1.0027701 1.0083102 - 26500 0.33580127 0 -0.0074168555 1.0138504 1.0083102 - 26600 0.33063188 0 -0.020378601 1.0027701 1.0083102 - 26700 0.33581846 0 -0.00084397268 1.0027701 1.0027701 - 26800 0.32998532 0 0.015932208 1.0083102 1.0083102 - 26900 0.33825444 0 0.010428603 1.0193906 1.0027701 - 27000 0.32081518 0 0.019818223 1.0083102 1.0083102 - 27100 0.31448098 0 0.020093416 1.0027701 1.0027701 - 27200 0.32643684 0 0.021934917 1.0083102 1.0027701 - 27300 0.33289466 0 0.023713072 1.0138504 1.0083102 - 27400 0.32310744 0 0.024110945 1.0193906 1.0027701 - 27500 0.33115619 0 0.0025776713 1.0193906 1.0027701 - 27600 0.33295887 0 -0.010710764 1.0083102 1.0083102 - 27700 0.32968876 0 -0.0064595905 1.0083102 1.0027701 - 27800 0.34064581 0 -0.0086519116 1.0027701 1.0027701 - 27900 0.33559187 0 -0.0055753593 1.0249307 1.0027701 - 28000 0.32300727 0 -0.0004153384 1.0138504 1.0027701 - 28100 0.32147461 0 -0.0058543412 1.0083102 1.0083102 - 28200 0.35532383 0 0.013646951 1.0083102 1.0083102 - 28300 0.31507942 0 0.026532255 1.0083102 1.0027701 - 28400 0.32711006 0 0.033214981 1.0083102 1.0027701 - 28500 0.34472462 0 0.028050837 1.0027701 1.0027701 - 28600 0.33708059 0 0.019115676 1.0027701 1.0027701 - 28700 0.34478087 0 0.023743689 1.0193906 1.0027701 - 28800 0.34546686 0 0.0081772997 1.0083102 1.0027701 - 28900 0.34004886 0 0.017771865 1.0138504 1.0027701 - 29000 0.33604232 0 -0.010505671 1.0027701 1.0027701 - 29100 0.33541374 0 -0.016273261 1.0027701 1.0027701 - 29200 0.34347489 0 -0.010002306 1.0083102 1.0027701 - 29300 0.34083904 0 0.0089701784 1.0083102 1.0027701 - 29400 0.34846892 0 0.020765104 1.0027701 1.0027701 - 29500 0.3416255 0 0.022650856 1.0083102 1.0027701 - 29600 0.33725496 0 0.020693083 1.0027701 1.0027701 - 29700 0.34480638 0 0.024317128 1.0138504 1.0027701 - 29800 0.31459471 0 0.023097895 1.0027701 1.0027701 - 29900 0.33014448 0 0.03114046 1.0138504 1.0027701 - 30000 0.33741498 0 0.015624314 1.0083102 1.0027701 - 30100 0.32598657 0 -0.0018860541 1.0138504 1.0027701 - 30200 0.34855815 0 0.0017983372 1.0027701 1.0027701 - 30300 0.33375921 0 0.0010991235 1.0083102 1.0083102 - 30400 0.35008944 0 -0.0027316177 1.0027701 1.0027701 - 30500 0.33279729 0 -0.0035788551 1.0027701 1.0027701 - 30600 0.33868746 0 -0.0016249482 1.0027701 1.0027701 - 30700 0.33597034 0 -0.0014524001 1.0193906 1.0083102 - 30800 0.3227257 0 0.016353457 1.0193906 1.0027701 - 30900 0.32676516 0 0.027396654 1.0027701 1.0027701 - 31000 0.34083982 0 0.031606413 1.0138504 1.0083102 - 31100 0.32165238 0 0.013583368 1.0027701 1.0027701 - 31200 0.3428492 0 0.020486611 1.0138504 1.0027701 - 31300 0.32372541 0 0.01215566 1.0027701 1.0027701 - 31400 0.32734692 0 0.016229397 1.0083102 1.0027701 - 31500 0.33089262 0 0.0060426618 1.0027701 1.0027701 - 31600 0.34273493 0 -0.013456537 1.0083102 1.0083102 - 31700 0.32723905 0 -0.019243766 1.0027701 1.0027701 - 31800 0.33636488 0 0.0027814902 1.0027701 1.0083102 - 31900 0.32834805 0 0.00706877 1.0083102 1.0027701 - 32000 0.33995148 0 0.0018383309 1.0083102 1.0083102 - 32100 0.33412282 0 0.0076455933 1.0027701 1.0083102 - 32200 0.34334884 0 0.023586129 1.0083102 1.0027701 - 32300 0.32778925 0 0.020564321 1.0193906 1.0083102 - 32400 0.33163443 0 0.038878463 1.0083102 1.0027701 - 32500 0.32290345 0 0.022247461 1.0027701 1.0027701 - 32600 0.34113954 0 0.010966365 1.0138504 1.0027701 - 32700 0.33390633 0 0.0037777555 1.0083102 1.0083102 - 32800 0.34385341 0 0.010556575 1.0138504 1.0083102 - 32900 0.32137047 0 0.00022027143 1.0138504 1.0027701 - 33000 0.32079172 0 -0.017261272 1.0083102 1.0027701 - 33100 0.33570882 0 -0.0051942206 1.0027701 1.0027701 - 33200 0.34320894 0 -0.011515281 1.0138504 1.0027701 - 33300 0.32794746 0 -0.0018153673 1.0027701 1.0027701 - 33400 0.33060982 0 0.027118146 1.0027701 1.0027701 - 33500 0.33641809 0 0.02143035 1.0083102 1.0027701 - 33600 0.33643061 0 0.020833068 1.0083102 1.0027701 - 33700 0.3485949 0 0.030918751 1.0083102 1.0027701 - 33800 0.3283985 0 0.01947613 1.0193906 1.0027701 - 33900 0.31959761 0 0.021128147 1.0027701 1.0027701 - 34000 0.33897984 0 0.015270986 1.0027701 1.0083102 - 34100 0.32392267 0 0.0020130852 1.0083102 1.0027701 - 34200 0.33084514 0 -0.024316708 1.0027701 1.0027701 - 34300 0.3342259 0 -0.0059047764 1.0138504 1.0027701 - 34400 0.33385098 0 0.0063818721 1.0027701 1.0027701 - 34500 0.33255603 0 -0.01023837 1.0027701 1.0083102 - 34600 0.34766173 0 0.0056703013 1.0083102 1.0027701 - 34700 0.339822 0 0.0061648559 1.0083102 1.0027701 - 34800 0.33902329 0 0.030037037 1.0027701 1.0083102 - 34900 0.3216153 0 0.027996689 1.0027701 1.0027701 - 35000 0.32701056 0 0.024778517 1.0083102 1.0027701 - 35100 0.3124942 0 0.011316548 1.0027701 1.0027701 - 35200 0.34486416 0 0.011670127 1.0027701 1.0027701 - 35300 0.33275353 0 0.020491246 1.0027701 1.0027701 - 35400 0.33618763 0 0.014678874 1.0083102 1.0027701 - 35500 0.32352282 0 -0.018568683 1.0027701 1.0027701 - 35600 0.32617903 0 -0.012796912 1.0083102 1.0027701 - 35700 0.32378048 0 -0.021318585 1.0027701 1.0083102 - 35800 0.3371086 0 -0.0023678632 1.0027701 1.0083102 - 35900 0.33818476 0 0.011197742 1.0083102 1.0027701 - 36000 0.35142144 0 0.022520935 1.0083102 1.0027701 - 36100 0.35147297 0 0.020277852 1.0083102 1.0027701 - 36200 0.33489465 0 0.014564878 1.0193906 1.0027701 - 36300 0.33841515 0 0.036439962 1.0027701 1.0027701 - 36400 0.32301096 0 0.019966746 1.0027701 1.0027701 - 36500 0.35612028 0 0.036509556 1.0027701 1.0027701 - 36600 0.33841597 0 -0.0042180605 1.0083102 1.0083102 - 36700 0.34477654 0 -0.0052770853 1.0193906 1.0083102 - 36800 0.33804317 0 -0.013751733 1.0027701 1.0027701 - 36900 0.35003816 0 -0.0021184393 1.0027701 1.0027701 - 37000 0.32965041 0 -0.020900951 1.0083102 1.0027701 - 37100 0.34653095 0 -0.013667977 1.0027701 1.0027701 - 37200 0.35019871 0 -0.0071740923 1.0027701 1.0027701 - 37300 0.34859745 0 0.02006041 1.0138504 1.0027701 - 37400 0.35739859 0 0.020892822 1.0083102 1.0027701 - 37500 0.34128859 0 0.041072111 1.0083102 1.0083102 - 37600 0.33781905 0 0.023376738 1.0083102 1.0083102 - 37700 0.32961874 0 0.030953741 1.0138504 1.0027701 - 37800 0.343987 0 0.029579795 1.0083102 1.0027701 - 37900 0.33610448 0 0.036836828 1.0138504 1.0027701 - 38000 0.32757228 0 0.020902031 1.0027701 1.0027701 - 38100 0.32735808 0 0.019544751 1.0138504 1.0083102 - 38200 0.35646953 0 0.044607528 1.0027701 1.0083102 - 38300 0.32509773 0 0.03610738 1.0138504 1.0027701 - 38400 0.32111741 0 0.034474043 1.0083102 1.0083102 - 38500 0.30590608 0 0.053461212 1.0083102 1.0027701 - 38600 0.32322402 0 0.053453832 1.0138504 1.0083102 - 38700 0.33843057 0 0.076264534 1.0027701 1.0027701 - 38800 0.31350741 0 0.064733869 1.0083102 1.0027701 - 38900 0.31943061 0 0.067836769 1.0083102 1.0027701 - 39000 0.33775583 0 0.0788316 1.0083102 1.0083102 - 39100 0.34256036 0 0.075874935 1.0027701 1.0027701 - 39200 0.33128527 0 0.071610976 1.0193906 1.0027701 - 39300 0.34519653 0 0.046257301 1.0083102 1.0083102 - 39400 0.34351844 0 0.052422917 1.0027701 1.0027701 - 39500 0.35716037 0 0.048916058 1.0083102 1.0027701 - 39600 0.34000737 0 0.016149089 1.0083102 1.0027701 - 39700 0.34587892 0 0.021619621 1.0083102 1.0083102 - 39800 0.34878036 0 0.0092881327 1.0083102 1.0027701 - 39900 0.35225411 0 -0.011341599 1.0083102 1.0027701 - 40000 0.36309266 0 0.0050869295 1.0304709 1.0027701 -Loop time of 1.30389 on 2 procs for 40000 steps with 361 atoms - -Performance: 13252650.572 tau/day, 30677.432 timesteps/s -97.6% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.041365 | 0.041785 | 0.042204 | 0.2 | 3.20 -Bond | 0.35501 | 0.37082 | 0.38664 | 2.6 | 28.44 -Neigh | 0.30901 | 0.31013 | 0.31125 | 0.2 | 23.78 -Comm | 0.12939 | 0.15871 | 0.18803 | 7.4 | 12.17 -Output | 0.00489 | 0.005671 | 0.0064521 | 1.0 | 0.43 -Modify | 0.28208 | 0.28362 | 0.28516 | 0.3 | 21.75 -Other | | 0.1332 | | | 10.21 - -Nlocal: 180.5 ave 181 max 180 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 52.5 ave 53 max 52 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 0 ave 0 max 0 min -Histogram: 2 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 0 -Ave neighs/atom = 0 -Ave special neighs/atom = 31.0249 -Neighbor list builds = 3079 -Dangerous builds = 0 -Total wall time: 0:00:01 diff --git a/examples/balance/log.27Nov18.balance.bond.slow.g++.4 b/examples/balance/log.27Nov18.balance.bond.slow.g++.4 deleted file mode 100644 index c799657e53..0000000000 --- a/examples/balance/log.27Nov18.balance.bond.slow.g++.4 +++ /dev/null @@ -1,541 +0,0 @@ -LAMMPS (27 Nov 2018) - 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 - -# careful not to slam into wall too hard - -variable v index 0.3 -variable w index 0.08 - -units lj -dimension 2 -atom_style bond -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 bond/types 1 extra/bond/per/atom 6 -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.000665188 secs -mass 1 1.0 - -velocity all create 0.5 87287 loop geom -velocity all set $v $w 0 sum yes -velocity all set 0.3 $w 0 sum yes -velocity all set 0.3 0.08 0 sum yes - -pair_style lj/cut 2.5 -pair_coeff 1 1 10.0 1.0 2.5 - -bond_style harmonic -bond_coeff 1 10.0 1.2 - -create_bonds many all all 1 1.0 1.5 -Neighbor list info ... - update every 1 steps, delay 10 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 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) command create_bonds, occasional - attributes: full, newton on - pair build: full/bin - stencil: full/bin/2d - bin: standard - (2) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/2d/newton - bin: standard -Added 1014 bonds, new total = 1014 - 6 = max # of 1-2 neighbors - 30 = max # of 1-3 neighbors - 180 = max # of 1-4 neighbors - 36 = max # of special neighbors - -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)+1 -#dump 2 all custom 50 tmp.dump id v_p x y z - -#dump 3 all image 200 image.*.jpg v_p type bond atom 0.25 # 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 40000 -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/newton - stencil: half/bin/2d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 7.02 | 7.048 | 7.096 Mbytes -Step Temp E_pair Press f_10[3] f_10 - 0 0.57437856 0 0.26099453 3.2354571 1.0526316 - 100 0.29756515 0 0.10149401 1.0193906 1.0083102 - 200 0.35394813 0 0.075159099 1.0304709 1.0193906 - 300 0.39245849 0 0.033002384 1.0083102 1.0193906 - 400 0.34078347 0 -0.020825841 1.0304709 1.0083102 - 500 0.35201095 0 -0.062637506 1.0193906 1.0083102 - 600 0.34014717 0 -0.11122965 1.0415512 1.0083102 - 700 0.3323524 0 -0.11598015 1.0193906 1.0083102 - 800 0.35116047 0 -0.096162395 1.0193906 1.0193906 - 900 0.35695352 0 -0.01385176 1.0526316 1.0193906 - 1000 0.36986539 0 0.056772858 1.0083102 1.0083102 - 1100 0.34584644 0 0.084941323 1.0304709 1.0083102 - 1200 0.31921435 0 0.10545078 1.0415512 1.0083102 - 1300 0.32952819 0 0.124902 1.0083102 1.0193906 - 1400 0.34497365 0 0.12662081 1.0193906 1.0083102 - 1500 0.33429243 0 0.096230972 1.0193906 1.0193906 - 1600 0.33765387 0 0.025800542 1.0304709 1.0083102 - 1700 0.35134464 0 -0.04422593 1.0415512 1.0083102 - 1800 0.35003859 0 -0.096745576 1.0304709 1.0083102 - 1900 0.33839618 0 -0.095465943 1.0193906 1.0083102 - 2000 0.33732078 0 -0.094652802 1.0083102 1.0083102 - 2100 0.34552238 0 -0.076729261 1.0304709 1.0083102 - 2200 0.34893142 0 -0.036853228 1.0304709 1.0083102 - 2300 0.35379341 0 0.021124847 1.0304709 1.0193906 - 2400 0.34829744 0 0.09230184 1.0304709 1.0083102 - 2500 0.33038141 0 0.1399855 1.0193906 1.0193906 - 2600 0.30983019 0 0.12754742 1.0083102 1.0083102 - 2700 0.32992561 0 0.10485138 1.0415512 1.0083102 - 2800 0.34604747 0 0.066174138 1.0083102 1.0083102 - 2900 0.3444791 0 0.036590652 1.0193906 1.0193906 - 3000 0.34721342 0 -0.023793368 1.0193906 1.0193906 - 3100 0.33404314 0 -0.08374223 1.0415512 1.0083102 - 3200 0.33019355 0 -0.12715599 1.0083102 1.0304709 - 3300 0.33515177 0 -0.12217394 1.0193906 1.0083102 - 3400 0.33628481 0 -0.070877624 1.0193906 1.0083102 - 3500 0.34257038 0 -0.021612062 1.0304709 1.0083102 - 3600 0.32838009 0 0.030131228 1.0083102 1.0083102 - 3700 0.34462142 0 0.074586378 1.0526316 1.0193906 - 3800 0.30891825 0 0.10605673 1.0304709 1.0083102 - 3900 0.33847951 0 0.13956139 1.0083102 1.0083102 - 4000 0.32952079 0 0.12688129 1.0193906 1.0304709 - 4100 0.32646772 0 0.081089042 1.0304709 1.0193906 - 4200 0.35399503 0 0.013422873 1.0083102 1.0083102 - 4300 0.33154914 0 -0.050919508 1.0193906 1.0193906 - 4400 0.34113556 0 -0.083171 1.0304709 1.0083102 - 4500 0.32651708 0 -0.1063133 1.0304709 1.0083102 - 4600 0.34359609 0 -0.1076395 1.0083102 1.0083102 - 4700 0.34973537 0 -0.088231606 1.0415512 1.0083102 - 4800 0.35198515 0 -0.020901044 1.0415512 1.0083102 - 4900 0.35187284 0 0.043645941 1.0415512 1.0083102 - 5000 0.34887336 0 0.095698609 1.0193906 1.0083102 - 5100 0.30308163 0 0.11649328 1.0193906 1.0083102 - 5200 0.32401285 0 0.12072411 1.0193906 1.0083102 - 5300 0.33025072 0 0.10933161 1.0193906 1.0083102 - 5400 0.33288012 0 0.078356448 1.0083102 1.0193906 - 5500 0.35142492 0 0.036958063 1.0193906 1.0083102 - 5600 0.35125368 0 -0.041371343 1.0304709 1.0083102 - 5700 0.34547744 0 -0.096450846 1.0637119 1.0083102 - 5800 0.30939887 0 -0.12356656 1.0083102 1.0193906 - 5900 0.32315628 0 -0.11338676 1.0193906 1.0193906 - 6000 0.34117485 0 -0.066198961 1.0193906 1.0083102 - 6100 0.35298043 0 -0.016172816 1.0304709 1.0193906 - 6200 0.35130653 0 0.027660468 1.0415512 1.0083102 - 6300 0.35398766 0 0.087221238 1.0083102 1.0083102 - 6400 0.30963379 0 0.11990957 1.0415512 1.0083102 - 6500 0.3174541 0 0.14103528 1.0193906 1.0193906 - 6600 0.31989791 0 0.11575506 1.0304709 1.0193906 - 6700 0.33811477 0 0.060747353 1.0415512 1.0193906 - 6800 0.3424043 0 0.010357152 1.0193906 1.0083102 - 6900 0.34804319 0 -0.042621786 1.0193906 1.0083102 - 7000 0.35357865 0 -0.067248959 1.0083102 1.0083102 - 7100 0.33556885 0 -0.10983726 1.0193906 1.0083102 - 7200 0.33531101 0 -0.112179 1.0304709 1.0083102 - 7300 0.35742607 0 -0.078405267 1.0304709 1.0193906 - 7400 0.34577559 0 -0.01985432 1.0193906 1.0083102 - 7500 0.3498641 0 0.052289439 1.0526316 1.0083102 - 7600 0.33773715 0 0.092939035 1.0083102 1.0193906 - 7700 0.33093497 0 0.11924405 1.0304709 1.0083102 - 7800 0.31435814 0 0.12701724 1.0083102 1.0304709 - 7900 0.33132217 0 0.10793075 1.0083102 1.0083102 - 8000 0.33451798 0 0.077993125 1.0304709 1.0193906 - 8100 0.35188371 0 0.019929977 1.0193906 1.0083102 - 8200 0.33645742 0 -0.039302079 1.0193906 1.0193906 - 8300 0.3415632 0 -0.098067982 1.0193906 1.0083102 - 8400 0.30619282 0 -0.12952879 1.0304709 1.0193906 - 8500 0.34446484 0 -0.098084709 1.0083102 1.0083102 - 8600 0.33761673 0 -0.07069818 1.0193906 1.0083102 - 8700 0.34495452 0 -0.022458056 1.0193906 1.0083102 - 8800 0.33502983 0 0.027742411 1.0193906 1.0083102 - 8900 0.35418591 0 0.092390134 1.0083102 1.0193906 - 9000 0.31648387 0 0.12467398 1.0193906 1.0083102 - 9100 0.33994825 0 0.14460327 1.0193906 1.0083102 - 9200 0.33822571 0 0.11273284 1.0193906 1.0083102 - 9300 0.33260773 0 0.060063671 1.0083102 1.0193906 - 9400 0.36140305 0 0.021427642 1.0193906 1.0083102 - 9500 0.34273562 0 -0.034064202 1.0193906 1.0083102 - 9600 0.33867054 0 -0.089076906 1.0193906 1.0083102 - 9700 0.32088235 0 -0.12027075 1.0193906 1.0083102 - 9800 0.3320823 0 -0.11602794 1.0415512 1.0083102 - 9900 0.33916442 0 -0.080281044 1.0083102 1.0083102 - 10000 0.34852268 0 -0.01000914 1.0193906 1.0083102 - 10100 0.32955942 0 0.04258493 1.0083102 1.0083102 - 10200 0.34487898 0 0.086971308 1.0304709 1.0083102 - 10300 0.32325593 0 0.11558149 1.0304709 1.0193906 - 10400 0.30927871 0 0.12239437 1.0083102 1.0083102 - 10500 0.33176799 0 0.12285937 1.0193906 1.0083102 - 10600 0.35120027 0 0.084897432 1.0415512 1.0083102 - 10700 0.33129697 0 0.0053089279 1.0193906 1.0193906 - 10800 0.36028769 0 -0.04280715 1.0193906 1.0083102 - 10900 0.35552287 0 -0.084955999 1.0193906 1.0193906 - 11000 0.3406024 0 -0.096554577 1.0083102 1.0083102 - 11100 0.33041202 0 -0.10703492 1.0304709 1.0193906 - 11200 0.32442686 0 -0.084328121 1.0304709 1.0193906 - 11300 0.35952468 0 -0.020191965 1.0304709 1.0083102 - 11400 0.34610624 0 0.03440148 1.0193906 1.0193906 - 11500 0.3415612 0 0.1041929 1.0193906 1.0083102 - 11600 0.34040042 0 0.13215705 1.0304709 1.0083102 - 11700 0.33555094 0 0.12738686 1.0415512 1.0193906 - 11800 0.3458647 0 0.10963398 1.0083102 1.0193906 - 11900 0.33836678 0 0.067253864 1.0193906 1.0193906 - 12000 0.34853314 0 0.03201448 1.0193906 1.0083102 - 12100 0.34600048 0 -0.034833402 1.0304709 1.0193906 - 12200 0.33145631 0 -0.09865675 1.0193906 1.0193906 - 12300 0.32848884 0 -0.1248489 1.0193906 1.0083102 - 12400 0.3321344 0 -0.11266575 1.0083102 1.0083102 - 12500 0.32622305 0 -0.061634993 1.0304709 1.0083102 - 12600 0.36213537 0 -0.0090593315 1.0526316 1.0083102 - 12700 0.34673866 0 0.036734645 1.0193906 1.0083102 - 12800 0.34606618 0 0.086267678 1.0193906 1.0083102 - 12900 0.34271431 0 0.12415522 1.0193906 1.0083102 - 13000 0.31993287 0 0.13879926 1.0193906 1.0193906 - 13100 0.3422918 0 0.11978905 1.0083102 1.0083102 - 13200 0.33055236 0 0.062620483 1.0083102 1.0083102 - 13300 0.34652207 0 0.0043833459 1.0304709 1.0083102 - 13400 0.33574661 0 -0.04691024 1.0304709 1.0083102 - 13500 0.33940837 0 -0.074241604 1.0304709 1.0083102 - 13600 0.32093414 0 -0.1078027 1.0193906 1.0083102 - 13700 0.34336597 0 -0.10544097 1.0193906 1.0083102 - 13800 0.35806461 0 -0.072531559 1.0193906 1.0083102 - 13900 0.35209713 0 -0.018851408 1.0193906 1.0083102 - 14000 0.35702629 0 0.061046366 1.0083102 1.0083102 - 14100 0.33234093 0 0.094086465 1.0083102 1.0083102 - 14200 0.3459466 0 0.12186656 1.0193906 1.0193906 - 14300 0.3327428 0 0.11396572 1.0193906 1.0083102 - 14400 0.32409443 0 0.10658903 1.0193906 1.0193906 - 14500 0.35022184 0 0.083558031 1.0083102 1.0083102 - 14600 0.34823843 0 0.024605569 1.0083102 1.0193906 - 14700 0.35298973 0 -0.040418888 1.0193906 1.0083102 - 14800 0.33679845 0 -0.10067728 1.0193906 1.0083102 - 14900 0.32790966 0 -0.10925568 1.0193906 1.0193906 - 15000 0.34208495 0 -0.09568004 1.0193906 1.0083102 - 15100 0.33647529 0 -0.055652929 1.0083102 1.0083102 - 15200 0.35328398 0 -0.020236536 1.0415512 1.0193906 - 15300 0.34252669 0 0.026434179 1.0304709 1.0083102 - 15400 0.34409435 0 0.094410599 1.0304709 1.0083102 - 15500 0.32288994 0 0.12034455 1.0304709 1.0193906 - 15600 0.32109689 0 0.13645185 1.0193906 1.0083102 - 15700 0.33681572 0 0.098607746 1.0415512 1.0193906 - 15800 0.33635195 0 0.05570715 1.0193906 1.0083102 - 15900 0.34289757 0 0.013849092 1.0304709 1.0083102 - 16000 0.34225547 0 -0.035597548 1.0304709 1.0083102 - 16100 0.33660991 0 -0.076931881 1.0193906 1.0193906 - 16200 0.32802152 0 -0.12765884 1.0083102 1.0193906 - 16300 0.3469374 0 -0.10785455 1.0083102 1.0083102 - 16400 0.34053641 0 -0.070259853 1.0193906 1.0083102 - 16500 0.34610591 0 -0.014315306 1.0193906 1.0193906 - 16600 0.35109001 0 0.041251169 1.0304709 1.0083102 - 16700 0.34336905 0 0.077996627 1.0193906 1.0083102 - 16800 0.33277414 0 0.11053634 1.0083102 1.0083102 - 16900 0.32183338 0 0.11680626 1.0193906 1.0083102 - 17000 0.34044352 0 0.10806555 1.0193906 1.0083102 - 17100 0.32967873 0 0.067759786 1.0193906 1.0193906 - 17200 0.36172278 0 -0.0048631904 1.0304709 1.0083102 - 17300 0.35619435 0 -0.04215545 1.0193906 1.0083102 - 17400 0.34540936 0 -0.093994174 1.0193906 1.0083102 - 17500 0.33193585 0 -0.098831315 1.0083102 1.0193906 - 17600 0.3544756 0 -0.085660403 1.0193906 1.0083102 - 17700 0.34505209 0 -0.069640515 1.0304709 1.0193906 - 17800 0.36291124 0 -0.0063088133 1.0083102 1.0193906 - 17900 0.34255705 0 0.046794555 1.0304709 1.0193906 - 18000 0.34163238 0 0.11767705 1.0193906 1.0193906 - 18100 0.3466445 0 0.1351712 1.0415512 1.0193906 - 18200 0.33037668 0 0.12703659 1.0083102 1.0083102 - 18300 0.33677404 0 0.10956306 1.0083102 1.0304709 - 18400 0.34978954 0 0.087193072 1.0193906 1.0193906 - 18500 0.33354363 0 0.051095814 1.0526316 1.0193906 - 18600 0.34651729 0 0.0056245561 1.0304709 1.0193906 - 18700 0.32622232 0 -0.047319269 1.0083102 1.0193906 - 18800 0.32978847 0 -0.054929416 1.0304709 1.0193906 - 18900 0.34192451 0 -0.037252471 1.0193906 1.0083102 - 19000 0.34061294 0 -0.001167235 1.0083102 1.0083102 - 19100 0.34194478 0 0.016945224 1.0526316 1.0193906 - 19200 0.33321765 0 0.050665354 1.0526316 1.0083102 - 19300 0.33197783 0 0.080470585 1.0193906 1.0083102 - 19400 0.33284715 0 0.12423599 1.0304709 1.0304709 - 19500 0.33867856 0 0.12689524 1.0083102 1.0083102 - 19600 0.36092786 0 0.11417704 1.0193906 1.0083102 - 19700 0.34270183 0 0.069038291 1.0415512 1.0083102 - 19800 0.34880695 0 0.042483681 1.0193906 1.0083102 - 19900 0.33903644 0 0.034788638 1.0083102 1.0193906 - 20000 0.32590125 0 0.011383785 1.0193906 1.0083102 - 20100 0.30358859 0 0.0030743554 1.0526316 1.0193906 - 20200 0.31830224 0 0.017637826 1.0193906 1.0193906 - 20300 0.34195438 0 0.072811099 1.0304709 1.0193906 - 20400 0.31249563 0 0.10063541 1.0415512 1.0083102 - 20500 0.31544938 0 0.1405794 1.0083102 1.0083102 - 20600 0.30071644 0 0.12763486 1.0193906 1.0193906 - 20700 0.2890265 0 0.1136651 1.0083102 1.0083102 - 20800 0.28962296 0 0.094481978 1.0193906 1.0083102 - 20900 0.29447212 0 0.0967165 1.0193906 1.0193906 - 21000 0.31159961 0 0.067307231 1.0083102 1.0083102 - 21100 0.30490648 0 0.017689358 1.0083102 1.0304709 - 21200 0.30687262 0 -0.016055512 1.0193906 1.0193906 - 21300 0.30083286 0 -0.0014988997 1.0193906 1.0083102 - 21400 0.32070426 0 0.015960302 1.0083102 1.0083102 - 21500 0.31439311 0 0.038170385 1.0304709 1.0083102 - 21600 0.32617832 0 0.043263788 1.0083102 1.0083102 - 21700 0.35151793 0 0.066302727 1.0193906 1.0083102 - 21800 0.35912885 0 0.070099103 1.0193906 1.0083102 - 21900 0.32451958 0 0.068935768 1.0304709 1.0193906 - 22000 0.35219298 0 0.067161227 1.0193906 1.0193906 - 22100 0.34857705 0 0.032731746 1.0193906 1.0083102 - 22200 0.34750227 0 0.0056917695 1.0193906 1.0083102 - 22300 0.34766017 0 -0.0027090483 1.0193906 1.0083102 - 22400 0.33426062 0 -0.023196063 1.0304709 1.0083102 - 22500 0.34174625 0 -0.025019717 1.0083102 1.0083102 - 22600 0.3356145 0 -0.029707418 1.0304709 1.0193906 - 22700 0.3362653 0 -0.035815733 1.0193906 1.0193906 - 22800 0.33973405 0 -0.0024705835 1.0193906 1.0083102 - 22900 0.33813085 0 0.0077527467 1.0083102 1.0193906 - 23000 0.33339981 0 0.028340744 1.0193906 1.0083102 - 23100 0.34079832 0 0.018521302 1.0415512 1.0193906 - 23200 0.33074548 0 0.032378405 1.0193906 1.0083102 - 23300 0.32965664 0 0.035989589 1.0193906 1.0083102 - 23400 0.30927749 0 0.024581106 1.0193906 1.0083102 - 23500 0.32890632 0 0.01092479 1.0304709 1.0193906 - 23600 0.34137438 0 0.0094839745 1.0193906 1.0193906 - 23700 0.34512638 0 -0.012392771 1.0304709 1.0193906 - 23800 0.31781354 0 -0.012908449 1.0193906 1.0083102 - 23900 0.32405513 0 -0.015018071 1.0415512 1.0193906 - 24000 0.33549728 0 -0.012812915 1.0193906 1.0193906 - 24100 0.31368736 0 -0.020818372 1.0083102 1.0083102 - 24200 0.33533836 0 0.0056121057 1.0304709 1.0193906 - 24300 0.32530627 0 0.018183931 1.0415512 1.0083102 - 24400 0.31930662 0 0.027446878 1.0083102 1.0193906 - 24500 0.33540302 0 0.040307455 1.0304709 1.0083102 - 24600 0.34020431 0 0.027403921 1.0083102 1.0083102 - 24700 0.3291814 0 0.01204865 1.0193906 1.0083102 - 24800 0.31552604 0 0.019654111 1.0083102 1.0193906 - 24900 0.34727253 0 0.01670543 1.0193906 1.0083102 - 25000 0.35120105 0 0.0038617562 1.0193906 1.0083102 - 25100 0.32706871 0 -0.021196623 1.0415512 1.0193906 - 25200 0.32915282 0 -0.017146508 1.0083102 1.0193906 - 25300 0.32577518 0 -0.01312495 1.0193906 1.0083102 - 25400 0.33286855 0 0.0014726193 1.0415512 1.0193906 - 25500 0.33002601 0 0.0080974022 1.0193906 1.0083102 - 25600 0.34127655 0 0.014296091 1.0526316 1.0083102 - 25700 0.34048065 0 0.022513032 1.0193906 1.0083102 - 25800 0.33029079 0 0.038733531 1.0526316 1.0083102 - 25900 0.33031324 0 0.026156982 1.0083102 1.0193906 - 26000 0.32967371 0 0.028727383 1.0083102 1.0193906 - 26100 0.33775718 0 0.015607478 1.0083102 1.0193906 - 26200 0.35097144 0 0.012291703 1.0083102 1.0083102 - 26300 0.34303792 0 0.00094823191 1.0083102 1.0193906 - 26400 0.33632665 0 -0.0026904889 1.0193906 1.0193906 - 26500 0.33580127 0 -0.0074168555 1.0193906 1.0193906 - 26600 0.33063188 0 -0.020378601 1.0083102 1.0193906 - 26700 0.33581846 0 -0.00084397268 1.0083102 1.0193906 - 26800 0.32998532 0 0.015932208 1.0304709 1.0193906 - 26900 0.33825444 0 0.010428603 1.0304709 1.0083102 - 27000 0.32081518 0 0.019818223 1.0415512 1.0193906 - 27100 0.31448098 0 0.020093416 1.0193906 1.0083102 - 27200 0.32643684 0 0.021934917 1.0193906 1.0083102 - 27300 0.33289466 0 0.023713072 1.0415512 1.0083102 - 27400 0.32310744 0 0.024110945 1.0415512 1.0083102 - 27500 0.33115619 0 0.0025776713 1.0304709 1.0193906 - 27600 0.33295887 0 -0.010710764 1.0193906 1.0193906 - 27700 0.32968876 0 -0.0064595905 1.0193906 1.0193906 - 27800 0.34064581 0 -0.0086519116 1.0193906 1.0083102 - 27900 0.33559187 0 -0.0055753593 1.0526316 1.0083102 - 28000 0.32300727 0 -0.0004153384 1.0304709 1.0083102 - 28100 0.32147461 0 -0.0058543412 1.0083102 1.0083102 - 28200 0.35532383 0 0.013646951 1.0304709 1.0083102 - 28300 0.31507942 0 0.026532255 1.0415512 1.0193906 - 28400 0.32711006 0 0.033214981 1.0193906 1.0083102 - 28500 0.34472462 0 0.028050837 1.0304709 1.0193906 - 28600 0.33708059 0 0.019115676 1.0083102 1.0083102 - 28700 0.34478087 0 0.023743689 1.0304709 1.0083102 - 28800 0.34546686 0 0.0081772997 1.0304709 1.0083102 - 28900 0.34004886 0 0.017771865 1.0415512 1.0193906 - 29000 0.33604232 0 -0.010505671 1.0304709 1.0193906 - 29100 0.33541374 0 -0.016273261 1.0083102 1.0083102 - 29200 0.34347489 0 -0.010002306 1.0083102 1.0083102 - 29300 0.34083904 0 0.0089701784 1.0193906 1.0193906 - 29400 0.34846892 0 0.020765104 1.0083102 1.0083102 - 29500 0.3416255 0 0.022650856 1.0304709 1.0083102 - 29600 0.33725496 0 0.020693083 1.0193906 1.0193906 - 29700 0.34480638 0 0.024317128 1.0304709 1.0083102 - 29800 0.31459471 0 0.023097895 1.0083102 1.0083102 - 29900 0.33014448 0 0.03114046 1.0193906 1.0083102 - 30000 0.33741498 0 0.015624314 1.0083102 1.0193906 - 30100 0.32598657 0 -0.0018860541 1.0415512 1.0193906 - 30200 0.34855815 0 0.0017983372 1.0083102 1.0083102 - 30300 0.33375921 0 0.0010991235 1.0083102 1.0193906 - 30400 0.35008944 0 -0.0027316177 1.0193906 1.0083102 - 30500 0.33279729 0 -0.0035788551 1.0193906 1.0193906 - 30600 0.33868746 0 -0.0016249482 1.0083102 1.0193906 - 30700 0.33597034 0 -0.0014524001 1.0193906 1.0193906 - 30800 0.3227257 0 0.016353457 1.0193906 1.0193906 - 30900 0.32676516 0 0.027396654 1.0193906 1.0083102 - 31000 0.34083982 0 0.031606413 1.0415512 1.0193906 - 31100 0.32165238 0 0.013583368 1.0083102 1.0083102 - 31200 0.3428492 0 0.020486611 1.0304709 1.0083102 - 31300 0.32372541 0 0.01215566 1.0083102 1.0083102 - 31400 0.32734692 0 0.016229397 1.0083102 1.0083102 - 31500 0.33089262 0 0.0060426618 1.0083102 1.0083102 - 31600 0.34273493 0 -0.013456537 1.0083102 1.0193906 - 31700 0.32723905 0 -0.019243766 1.0193906 1.0083102 - 31800 0.33636488 0 0.0027814902 1.0083102 1.0083102 - 31900 0.32834805 0 0.00706877 1.0083102 1.0193906 - 32000 0.33995148 0 0.0018383309 1.0193906 1.0193906 - 32100 0.33412282 0 0.0076455933 1.0083102 1.0083102 - 32200 0.34334884 0 0.023586129 1.0083102 1.0083102 - 32300 0.32778925 0 0.020564321 1.0193906 1.0083102 - 32400 0.33163443 0 0.038878463 1.0193906 1.0083102 - 32500 0.32290345 0 0.022247461 1.0193906 1.0083102 - 32600 0.34113954 0 0.010966365 1.0304709 1.0193906 - 32700 0.33390633 0 0.0037777555 1.0193906 1.0083102 - 32800 0.34385341 0 0.010556575 1.0193906 1.0193906 - 32900 0.32137047 0 0.00022027143 1.0304709 1.0193906 - 33000 0.32079172 0 -0.017261272 1.0193906 1.0083102 - 33100 0.33570882 0 -0.0051942206 1.0083102 1.0083102 - 33200 0.34320894 0 -0.011515281 1.0193906 1.0083102 - 33300 0.32794746 0 -0.0018153673 1.0083102 1.0193906 - 33400 0.33060982 0 0.027118146 1.0193906 1.0083102 - 33500 0.33641809 0 0.02143035 1.0083102 1.0193906 - 33600 0.33643061 0 0.020833068 1.0304709 1.0083102 - 33700 0.3485949 0 0.030918751 1.0193906 1.0083102 - 33800 0.3283985 0 0.01947613 1.0193906 1.0083102 - 33900 0.31959761 0 0.021128147 1.0083102 1.0304709 - 34000 0.33897984 0 0.015270986 1.0193906 1.0083102 - 34100 0.32392267 0 0.0020130852 1.0304709 1.0193906 - 34200 0.33084514 0 -0.024316708 1.0193906 1.0193906 - 34300 0.3342259 0 -0.0059047764 1.0193906 1.0304709 - 34400 0.33385098 0 0.0063818721 1.0193906 1.0083102 - 34500 0.33255603 0 -0.01023837 1.0083102 1.0304709 - 34600 0.34766173 0 0.0056703013 1.0193906 1.0083102 - 34700 0.339822 0 0.0061648559 1.0193906 1.0193906 - 34800 0.33902329 0 0.030037037 1.0415512 1.0193906 - 34900 0.3216153 0 0.027996689 1.0083102 1.0083102 - 35000 0.32701056 0 0.024778517 1.0193906 1.0083102 - 35100 0.3124942 0 0.011316548 1.0304709 1.0193906 - 35200 0.34486416 0 0.011670127 1.0083102 1.0083102 - 35300 0.33275353 0 0.020491246 1.0193906 1.0193906 - 35400 0.33618763 0 0.014678874 1.0083102 1.0083102 - 35500 0.32352282 0 -0.018568683 1.0193906 1.0193906 - 35600 0.32617903 0 -0.012796912 1.0193906 1.0304709 - 35700 0.32378048 0 -0.021318585 1.0193906 1.0193906 - 35800 0.3371086 0 -0.0023678632 1.0193906 1.0193906 - 35900 0.33818476 0 0.011197742 1.0193906 1.0083102 - 36000 0.35142144 0 0.022520935 1.0083102 1.0193906 - 36100 0.35147297 0 0.020277852 1.0193906 1.0083102 - 36200 0.33489465 0 0.014564878 1.0415512 1.0193906 - 36300 0.33841515 0 0.036439962 1.0193906 1.0083102 - 36400 0.32301096 0 0.019966746 1.0304709 1.0083102 - 36500 0.35612028 0 0.036509556 1.0083102 1.0083102 - 36600 0.33841597 0 -0.0042180605 1.0193906 1.0193906 - 36700 0.34477654 0 -0.0052770853 1.0193906 1.0083102 - 36800 0.33804317 0 -0.013751733 1.0083102 1.0083102 - 36900 0.35003816 0 -0.0021184393 1.0083102 1.0083102 - 37000 0.32965041 0 -0.020900951 1.0193906 1.0083102 - 37100 0.34653095 0 -0.013667977 1.0193906 1.0083102 - 37200 0.35019871 0 -0.0071740923 1.0193906 1.0304709 - 37300 0.34859745 0 0.02006041 1.0304709 1.0083102 - 37400 0.35739859 0 0.020892822 1.0304709 1.0083102 - 37500 0.34128859 0 0.041072111 1.0193906 1.0193906 - 37600 0.33781905 0 0.023376738 1.0193906 1.0083102 - 37700 0.32961874 0 0.030953741 1.0193906 1.0083102 - 37800 0.343987 0 0.029579795 1.0083102 1.0083102 - 37900 0.33610448 0 0.036836828 1.0415512 1.0304709 - 38000 0.32757228 0 0.020902031 1.0193906 1.0193906 - 38100 0.32735808 0 0.019544751 1.0193906 1.0083102 - 38200 0.35646953 0 0.044607528 1.0083102 1.0304709 - 38300 0.32509773 0 0.03610738 1.0193906 1.0083102 - 38400 0.32111741 0 0.034474043 1.0193906 1.0193906 - 38500 0.30590608 0 0.053461212 1.0304709 1.0083102 - 38600 0.32322402 0 0.053453832 1.0193906 1.0304709 - 38700 0.33843057 0 0.076264534 1.0083102 1.0193906 - 38800 0.31350741 0 0.064733869 1.0415512 1.0083102 - 38900 0.31943061 0 0.067836769 1.0304709 1.0193906 - 39000 0.33775583 0 0.0788316 1.0193906 1.0193906 - 39100 0.34256036 0 0.075874935 1.0083102 1.0193906 - 39200 0.33128527 0 0.071610976 1.0193906 1.0083102 - 39300 0.34519653 0 0.046257301 1.0193906 1.0083102 - 39400 0.34351844 0 0.052422917 1.0304709 1.0304709 - 39500 0.35716037 0 0.048916058 1.0304709 1.0083102 - 39600 0.34000737 0 0.016149089 1.0304709 1.0083102 - 39700 0.34587892 0 0.021619621 1.0526316 1.0083102 - 39800 0.34878036 0 0.0092881327 1.0083102 1.0193906 - 39900 0.35225411 0 -0.011341599 1.0083102 1.0193906 - 40000 0.36309266 0 0.0050869295 1.0304709 1.0083102 -Loop time of 1.12306 on 4 procs for 40000 steps with 361 atoms - -Performance: 15386559.518 tau/day, 35617.036 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.023094 | 0.023348 | 0.023582 | 0.1 | 2.08 -Bond | 0.17827 | 0.19268 | 0.21984 | 3.7 | 17.16 -Neigh | 0.18144 | 0.18231 | 0.18323 | 0.1 | 16.23 -Comm | 0.23759 | 0.28095 | 0.30794 | 5.0 | 25.02 -Output | 0.0062952 | 0.013342 | 0.034226 | 10.4 | 1.19 -Modify | 0.2379 | 0.24327 | 0.25076 | 0.9 | 21.66 -Other | | 0.1871 | | | 16.66 - -Nlocal: 90.25 ave 91 max 89 min -Histogram: 1 0 0 0 0 1 0 0 0 2 -Nghost: 59.25 ave 61 max 56 min -Histogram: 1 0 0 0 0 0 0 0 2 1 -Neighs: 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 -Ave special neighs/atom = 31.0249 -Neighbor list builds = 3079 -Dangerous builds = 0 -Total wall time: 0:00:01 diff --git a/examples/balance/log.27Nov18.balance.clock.dynamic.g++.2 b/examples/balance/log.27Nov18.balance.clock.dynamic.g++.2 deleted file mode 100644 index 781a609bd2..0000000000 --- a/examples/balance/log.27Nov18.balance.clock.dynamic.g++.2 +++ /dev/null @@ -1,227 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000549078 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -compute p all property/atom d_WEIGHT -fix 0 all balance 50 1.0 shift x 10 1.0 weight time 1.0 weight store WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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 -run 500 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -Per MPI rank memory allocation (min/avg/max) = 4.562 | 4.753 | 4.944 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 - 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 - 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 - 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 - 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 -Loop time of 3.7099 on 2 procs for 500 steps with 4000 atoms - -Performance: 58222.644 tau/day, 134.775 timesteps/s -99.2% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.5145 | 2.5951 | 2.6756 | 5.0 | 69.95 -Neigh | 0.8388 | 0.88634 | 0.93387 | 5.0 | 23.89 -Comm | 0.17027 | 0.20258 | 0.23489 | 7.2 | 5.46 -Output | 0.00029612 | 0.00032723 | 0.00035834 | 0.0 | 0.01 -Modify | 0.016136 | 0.017057 | 0.017979 | 0.7 | 0.46 -Other | | 0.008504 | | | 0.23 - -Nlocal: 2000 ave 2157 max 1843 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10465.5 ave 10840 max 10091 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298070 ave 305706 max 290433 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596139 -Ave neighs/atom = 149.035 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.944 | 4.947 | 4.951 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 - 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 4738.2137 - 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 4738.2137 - 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 4738.2137 - 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 4738.2137 - 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 4738.2137 - 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 4738.2137 - 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 4738.2137 - 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 4738.2137 - 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 4738.2137 - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 -Loop time of 3.70634 on 2 procs for 500 steps with 4000 atoms - -Performance: 58278.514 tau/day, 134.904 timesteps/s -99.0% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.5536 | 2.6173 | 2.6811 | 3.9 | 70.62 -Neigh | 0.82942 | 0.88683 | 0.94424 | 6.1 | 23.93 -Comm | 0.16927 | 0.17474 | 0.1802 | 1.3 | 4.71 -Output | 0.00030422 | 0.00033307 | 0.00036192 | 0.0 | 0.01 -Modify | 0.016714 | 0.017824 | 0.018933 | 0.8 | 0.48 -Other | | 0.009277 | | | 0.25 - -Nlocal: 2000 ave 2136 max 1864 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10413.5 ave 10877 max 9950 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 300836 ave 312313 max 289358 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 601671 -Ave neighs/atom = 150.418 -Neighbor list builds = 51 -Dangerous builds = 0 -fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.5 weight time 0.66 weight store WEIGHT -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.951 | 5.142 | 5.334 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 - 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 4738.2137 - 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 4738.2137 - 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 4738.2137 - 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 4738.2137 - 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418133 4738.2137 - 1300 0.54430333 -6.260995 0 -5.4447442 -1.856351 4738.2137 - 1350 0.55097839 -6.2715909 0 -5.4453299 -1.9014337 4738.2137 - 1400 0.53858139 -6.2526781 0 -5.445008 -1.7965773 4738.2137 - 1450 0.5421844 -6.2574683 0 -5.444395 -1.7901189 4738.2137 - 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 -Loop time of 4.8272 on 2 procs for 500 steps with 4000 atoms - -Performance: 44746.478 tau/day, 103.580 timesteps/s -98.5% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.9951 | 2.6814 | 3.3676 | 41.9 | 55.55 -Neigh | 0.82826 | 0.90961 | 0.99095 | 8.5 | 18.84 -Comm | 0.44043 | 1.2083 | 1.9762 | 69.9 | 25.03 -Output | 0.00034881 | 0.0003655 | 0.00038218 | 0.0 | 0.01 -Modify | 0.016762 | 0.01755 | 0.018337 | 0.6 | 0.36 -Other | | 0.01001 | | | 0.21 - -Nlocal: 2000 ave 2564 max 1436 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10334 ave 10752 max 9916 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 302958 ave 499873 max 106044 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 605917 -Ave neighs/atom = 151.479 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.955 | 5.336 | 5.717 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 - 1550 0.53713591 -6.2504068 0 -5.4449044 -1.7647087 4738.2137 - 1600 0.5467956 -6.2646482 0 -5.4446599 -1.8115778 4738.2137 - 1650 0.53806575 -6.2519004 0 -5.4450036 -1.7409135 4738.2137 - 1700 0.5347949 -6.2468958 0 -5.444904 -1.7162322 4738.2137 - 1750 0.53714528 -6.2506529 0 -5.4451365 -1.7340402 4738.2137 - 1800 0.5274989 -6.2358675 0 -5.444817 -1.6874989 4738.2137 - 1850 0.54585906 -6.2629475 0 -5.4443636 -1.7758918 4738.2137 - 1900 0.5301071 -6.2387551 0 -5.4437932 -1.6381903 4738.2137 - 1950 0.54288149 -6.2582818 0 -5.4441632 -1.7367819 4738.2137 - 2000 0.52766162 -6.2348587 0 -5.4435642 -1.5589151 4738.2137 -Loop time of 4.90351 on 2 procs for 500 steps with 4000 atoms - -Performance: 44050.062 tau/day, 101.968 timesteps/s -98.1% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.9937 | 2.6502 | 3.3067 | 40.3 | 54.05 -Neigh | 0.81645 | 0.88655 | 0.95664 | 7.4 | 18.08 -Comm | 0.61197 | 1.3389 | 2.0659 | 62.8 | 27.31 -Output | 0.00036287 | 0.0003773 | 0.00039172 | 0.0 | 0.01 -Modify | 0.016585 | 0.017429 | 0.018274 | 0.6 | 0.36 -Other | | 0.01003 | | | 0.20 - -Nlocal: 2000 ave 2564 max 1436 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10256 ave 10620 max 9892 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 303988 ave 502064 max 105911 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 607975 -Ave neighs/atom = 151.994 -Neighbor list builds = 51 -Dangerous builds = 0 -Total wall time: 0:00:17 diff --git a/examples/balance/log.27Nov18.balance.clock.dynamic.g++.4 b/examples/balance/log.27Nov18.balance.clock.dynamic.g++.4 deleted file mode 100644 index 94780b14df..0000000000 --- a/examples/balance/log.27Nov18.balance.clock.dynamic.g++.4 +++ /dev/null @@ -1,227 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000421762 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -compute p all property/atom d_WEIGHT -fix 0 all balance 50 1.0 shift x 10 1.0 weight time 1.0 weight store WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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 -run 500 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -Per MPI rank memory allocation (min/avg/max) = 3.691 | 4.072 | 4.454 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 - 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 - 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 - 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 - 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 -Loop time of 2.69458 on 4 procs for 500 steps with 4000 atoms - -Performance: 80160.913 tau/day, 185.558 timesteps/s -94.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 | 1.0903 | 1.4509 | 1.7199 | 22.5 | 53.84 -Neigh | 0.31688 | 0.47906 | 0.71852 | 24.2 | 17.78 -Comm | 0.60463 | 0.72402 | 0.84257 | 12.7 | 26.87 -Output | 0.00035119 | 0.00067121 | 0.0015202 | 0.0 | 0.02 -Modify | 0.00811 | 0.010936 | 0.014029 | 2.7 | 0.41 -Other | | 0.02904 | | | 1.08 - -Nlocal: 1000 ave 1504 max 634 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8759.25 ave 9896 max 8021 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 149308 ave 179946 max 116419 min -Histogram: 1 1 0 0 0 0 0 0 1 1 - -Total # of neighbors = 597231 -Ave neighs/atom = 149.308 -Neighbor list builds = 50 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.097 | 4.288 | 4.475 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 - 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 4738.2137 - 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 4738.2137 - 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 4738.2137 - 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 4738.2137 - 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 4738.2137 - 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 4738.2137 - 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 4738.2137 - 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 4738.2137 - 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 4738.2137 - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 -Loop time of 2.64502 on 4 procs for 500 steps with 4000 atoms - -Performance: 81662.873 tau/day, 189.034 timesteps/s -93.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.1279 | 1.4127 | 1.6268 | 18.0 | 53.41 -Neigh | 0.32225 | 0.49572 | 0.76053 | 26.2 | 18.74 -Comm | 0.64504 | 0.6974 | 0.75498 | 5.7 | 26.37 -Output | 0.00035477 | 0.00062996 | 0.001343 | 0.0 | 0.02 -Modify | 0.0077929 | 0.010538 | 0.013856 | 2.6 | 0.40 -Other | | 0.02803 | | | 1.06 - -Nlocal: 1000 ave 1437 max 597 min -Histogram: 1 1 0 0 0 0 0 1 0 1 -Nghost: 8674 ave 9370 max 8013 min -Histogram: 1 0 1 0 0 0 0 1 0 1 -Neighs: 150170 ave 187030 max 102149 min -Histogram: 1 0 0 0 0 1 0 1 0 1 - -Total # of neighbors = 600678 -Ave neighs/atom = 150.169 -Neighbor list builds = 53 -Dangerous builds = 0 -fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.5 weight time 0.66 weight store WEIGHT -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.08 | 4.269 | 4.458 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 - 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 4738.2137 - 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 4738.2137 - 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 4738.2137 - 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 4738.2137 - 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 4738.2137 - 1300 0.54134321 -6.2590728 0 -5.447261 -1.9170271 4738.2137 - 1350 0.53564389 -6.2501521 0 -5.4468871 -1.8642306 4738.2137 - 1400 0.53726924 -6.2518379 0 -5.4461355 -1.8544028 4738.2137 - 1450 0.54525935 -6.2632653 0 -5.4455808 -1.9072158 4738.2137 - 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866984 4738.2137 -Loop time of 2.61342 on 4 procs for 500 steps with 4000 atoms - -Performance: 82650.254 tau/day, 191.320 timesteps/s -93.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 | 1.222 | 1.4442 | 1.5812 | 12.3 | 55.26 -Neigh | 0.29672 | 0.48201 | 0.73859 | 27.6 | 18.44 -Comm | 0.59138 | 0.65738 | 0.70906 | 6.5 | 25.15 -Output | 0.00036502 | 0.00091559 | 0.0020845 | 0.0 | 0.04 -Modify | 0.0095406 | 0.012674 | 0.017643 | 2.8 | 0.48 -Other | | 0.01621 | | | 0.62 - -Nlocal: 1000 ave 1446 max 670 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8641 ave 9376 max 8019 min -Histogram: 1 1 0 0 0 0 0 1 0 1 -Neighs: 150494 ave 184085 max 105390 min -Histogram: 1 0 1 0 0 0 0 0 0 2 - -Total # of neighbors = 601974 -Ave neighs/atom = 150.494 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.08 | 4.269 | 4.458 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866984 4738.2137 - 1550 0.55327018 -6.2750125 0 -5.4453148 -1.9506585 4738.2137 - 1600 0.5441901 -6.2612622 0 -5.4451811 -1.8559436 4738.2137 - 1650 0.54710046 -6.2661938 0 -5.4457483 -1.8882766 4738.2137 - 1700 0.5366569 -6.2504957 0 -5.4457116 -1.8067998 4738.2137 - 1750 0.5486468 -6.2681121 0 -5.4453476 -1.8662631 4738.2137 - 1800 0.54476176 -6.2615037 0 -5.4445653 -1.8352743 4738.2137 - 1850 0.5414305 -6.2555519 0 -5.4436091 -1.8005747 4738.2137 - 1900 0.53992655 -6.2541344 0 -5.444447 -1.7768718 4738.2137 - 1950 0.54666071 -6.2640943 0 -5.4443082 -1.7947052 4738.2137 - 2000 0.54556196 -6.2625262 0 -5.4443879 -1.8071631 4738.2137 -Loop time of 2.81593 on 4 procs for 500 steps with 4000 atoms - -Performance: 76706.532 tau/day, 177.561 timesteps/s -90.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.2508 | 1.4839 | 1.6521 | 13.4 | 52.70 -Neigh | 0.34188 | 0.54016 | 0.82358 | 27.6 | 19.18 -Comm | 0.70575 | 0.75254 | 0.80167 | 4.6 | 26.72 -Output | 0.00041604 | 0.001362 | 0.0041099 | 4.3 | 0.05 -Modify | 0.010564 | 0.013653 | 0.018 | 2.7 | 0.48 -Other | | 0.02432 | | | 0.86 - -Nlocal: 1000 ave 1555 max 569 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 8672.75 ave 9821 max 7993 min -Histogram: 2 0 0 0 1 0 0 0 0 1 -Neighs: 151656 ave 164603 max 133455 min -Histogram: 1 0 0 0 0 0 1 1 0 1 - -Total # of neighbors = 606625 -Ave neighs/atom = 151.656 -Neighbor list builds = 56 -Dangerous builds = 0 -Total wall time: 0:00:10 diff --git a/examples/balance/log.27Nov18.balance.clock.static.g++.2 b/examples/balance/log.27Nov18.balance.clock.static.g++.2 deleted file mode 100644 index 6f96ac4fef..0000000000 --- a/examples/balance/log.27Nov18.balance.clock.static.g++.2 +++ /dev/null @@ -1,195 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000517368 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000522375 seconds - iteration count = 1 - time weight factor: 1 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -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 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.297 | 4.488 | 4.678 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 1 -6.9453205 0 -5.4456955 -5.6812358 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 -Loop time of 1.96356 on 2 procs for 250 steps with 4000 atoms - -Performance: 55002.186 tau/day, 127.320 timesteps/s -99.4% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.0024 | 1.243 | 1.4835 | 21.6 | 63.30 -Neigh | 0.3963 | 0.41601 | 0.43572 | 3.1 | 21.19 -Comm | 0.032948 | 0.29324 | 0.55353 | 48.1 | 14.93 -Output | 0.00013924 | 0.00014722 | 0.00015521 | 0.0 | 0.01 -Modify | 0.0072696 | 0.0073524 | 0.0074351 | 0.1 | 0.37 -Other | | 0.003842 | | | 0.20 - -Nlocal: 2000 ave 2051 max 1949 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10443 ave 10506 max 10380 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298332 ave 363449 max 233215 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596664 -Ave neighs/atom = 149.166 -Neighbor list builds = 24 -Dangerous builds = 0 -balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt - rebalancing time: 0.000424623 seconds - iteration count = 3 - time weight factor: 1 - initial/final max load/proc = 1.91926 1.6972 - initial/final imbalance factor = 1.15689 1.02304 - x cuts: 0 0.4375 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.681 | 4.683 | 4.685 Mbytes -Step Temp E_pair E_mol TotEng Press - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 - 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 - 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 - 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 - 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 -Loop time of 1.84751 on 2 procs for 250 steps with 4000 atoms - -Performance: 58457.127 tau/day, 135.317 timesteps/s -99.5% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.1214 | 1.2291 | 1.3368 | 9.7 | 66.53 -Neigh | 0.37418 | 0.41926 | 0.46434 | 7.0 | 22.69 -Comm | 0.033842 | 0.18738 | 0.34091 | 35.5 | 10.14 -Output | 0.00016665 | 0.00018752 | 0.00020838 | 0.0 | 0.01 -Modify | 0.0062993 | 0.0072798 | 0.0082603 | 1.1 | 0.39 -Other | | 0.00428 | | | 0.23 - -Nlocal: 2000 ave 2284 max 1716 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10450 ave 10742 max 10158 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298063 ave 326003 max 270123 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596126 -Ave neighs/atom = 149.031 -Neighbor list builds = 25 -Dangerous builds = 0 -balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt - rebalancing time: 0.000502825 seconds - iteration count = 3 - time weight factor: 1 - initial/final max load/proc = 1.80118 1.79434 - initial/final imbalance factor = 1.0927 1.08854 - x cuts: 0 0.507812 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.681 | 4.683 | 4.686 Mbytes -Step Temp E_pair E_mol TotEng Press - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 - 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 - 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 - 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 - 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 - 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 -Loop time of 2.03694 on 2 procs for 250 steps with 4000 atoms - -Performance: 53020.655 tau/day, 122.733 timesteps/s -99.3% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.92132 | 1.2301 | 1.5389 | 27.8 | 60.39 -Neigh | 0.3924 | 0.42313 | 0.45386 | 4.7 | 20.77 -Comm | 0.032816 | 0.37246 | 0.71211 | 55.7 | 18.29 -Output | 0.00013733 | 0.00014532 | 0.0001533 | 0.0 | 0.01 -Modify | 0.0069692 | 0.0072372 | 0.0075052 | 0.3 | 0.36 -Other | | 0.003856 | | | 0.19 - -Nlocal: 2000 ave 2097 max 1903 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10439.5 ave 10561 max 10318 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 299628 ave 378859 max 220397 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 599256 -Ave neighs/atom = 149.814 -Neighbor list builds = 25 -Dangerous builds = 0 -Total wall time: 0:00:05 diff --git a/examples/balance/log.27Nov18.balance.clock.static.g++.4 b/examples/balance/log.27Nov18.balance.clock.static.g++.4 deleted file mode 100644 index 45bae5631f..0000000000 --- a/examples/balance/log.27Nov18.balance.clock.static.g++.4 +++ /dev/null @@ -1,195 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000427961 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000848055 seconds - iteration count = 2 - time weight factor: 1 - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.6875 1 - y cuts: 0 1 - z cuts: 0 1 - -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 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.426 | 3.713 | 4.188 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 1 -6.9453205 0 -5.4456955 -5.6812358 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 -Loop time of 1.50594 on 4 procs for 250 steps with 4000 atoms - -Performance: 71716.080 tau/day, 166.009 timesteps/s -96.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.34764 | 0.66777 | 1.2288 | 43.4 | 44.34 -Neigh | 0.1594 | 0.20524 | 0.2451 | 7.5 | 13.63 -Comm | 0.039175 | 0.62421 | 0.93047 | 45.4 | 41.45 -Output | 0.00015855 | 0.00024235 | 0.00047231 | 0.0 | 0.02 -Modify | 0.0028908 | 0.0039527 | 0.0049407 | 1.2 | 0.26 -Other | | 0.004522 | | | 0.30 - -Nlocal: 1000 ave 1263 max 712 min -Histogram: 1 0 0 0 1 0 1 0 0 1 -Nghost: 8711.5 ave 9045 max 8325 min -Histogram: 1 0 0 0 0 1 1 0 0 1 -Neighs: 149325 ave 275165 max 77227 min -Histogram: 2 0 0 0 1 0 0 0 0 1 - -Total # of neighbors = 597299 -Ave neighs/atom = 149.325 -Neighbor list builds = 23 -Dangerous builds = 0 -balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt - rebalancing time: 0.000421047 seconds - iteration count = 4 - time weight factor: 1 - initial/final max load/proc = 1.45871 0.956175 - initial/final imbalance factor = 1.6709 1.09526 - x cuts: 0 0.296875 0.453125 0.628906 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.787 | 3.907 | 4.192 Mbytes -Step Temp E_pair E_mol TotEng Press - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 - 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 - 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 - 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 - 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 -Loop time of 1.24397 on 4 procs for 250 steps with 4000 atoms - -Performance: 86819.073 tau/day, 200.970 timesteps/s -95.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.4612 | 0.67729 | 0.88321 | 20.9 | 54.45 -Neigh | 0.14175 | 0.20919 | 0.28903 | 13.7 | 16.82 -Comm | 0.19855 | 0.34785 | 0.48428 | 18.8 | 27.96 -Output | 0.00016665 | 0.00030792 | 0.00066757 | 0.0 | 0.02 -Modify | 0.0027177 | 0.0053391 | 0.010109 | 4.1 | 0.43 -Other | | 0.003992 | | | 0.32 - -Nlocal: 1000 ave 1462 max 652 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8657 ave 9421 max 7969 min -Histogram: 1 1 0 0 0 0 0 1 0 1 -Neighs: 149356 ave 195930 max 106343 min -Histogram: 1 1 0 0 0 0 0 1 0 1 - -Total # of neighbors = 597424 -Ave neighs/atom = 149.356 -Neighbor list builds = 24 -Dangerous builds = 0 -balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt - rebalancing time: 0.000288963 seconds - iteration count = 5 - time weight factor: 1 - initial/final max load/proc = 1.03814 0.978524 - initial/final imbalance factor = 1.17108 1.10383 - x cuts: 0 0.301758 0.448242 0.60144 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.804 | 3.927 | 4.209 Mbytes -Step Temp E_pair E_mol TotEng Press - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 - 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 - 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 - 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 - 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 - 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 -Loop time of 1.14445 on 4 procs for 250 steps with 4000 atoms - -Performance: 94368.537 tau/day, 218.446 timesteps/s -98.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.52287 | 0.67351 | 0.79602 | 13.2 | 58.85 -Neigh | 0.14306 | 0.21848 | 0.31638 | 16.2 | 19.09 -Comm | 0.19457 | 0.24404 | 0.29562 | 7.2 | 21.32 -Output | 0.00016236 | 0.00029993 | 0.00065851 | 0.0 | 0.03 -Modify | 0.0024104 | 0.0038835 | 0.0057485 | 2.3 | 0.34 -Other | | 0.004232 | | | 0.37 - -Nlocal: 1000 ave 1522 max 593 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8754 ave 9866 max 8002 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 149124 ave 182694 max 120516 min -Histogram: 1 0 1 0 0 0 1 0 0 1 - -Total # of neighbors = 596497 -Ave neighs/atom = 149.124 -Neighbor list builds = 25 -Dangerous builds = 0 -Total wall time: 0:00:03 diff --git a/examples/balance/log.27Nov18.balance.g++.2 b/examples/balance/log.27Nov18.balance.g++.2 deleted file mode 100644 index 6b0d0baa88..0000000000 --- a/examples/balance/log.27Nov18.balance.g++.2 +++ /dev/null @@ -1,209 +0,0 @@ -LAMMPS (27 Nov 2018) - 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 1 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.000478506 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 tmp.dump id v_p x y z - -#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 10000 -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) = 3.061 | 3.065 | 3.07 Mbytes -Step Temp E_pair Press f_10[3] f_10 - 0 25.701528 -29.143179 -1.2407285 2 1.0193906 - 100 26.269576 -29.713313 7.9052334 1.1135734 1.0027701 - 200 26.368336 -29.809962 1.6412462 1.0803324 1.0027701 - 300 26.479082 -29.920083 2.3678653 1.1578947 1.0083102 - 400 26.522239 -29.965537 6.6787858 1.1578947 1.0083102 - 500 25.725591 -29.168034 0.67065285 1.1024931 1.0083102 - 600 26.247693 -29.692706 7.9887712 1.1301939 1.0027701 - 700 26.237368 -29.676926 1.5987214 1.1578947 1.0027701 - 800 25.889643 -29.431589 4.6160859 1.1523546 1.0027701 - 900 23.635295 -27.372963 9.029962 1.1468144 1.0027701 - 1000 22.571904 -25.87422 1.8936085 1.1191136 1.0083102 - 1100 17.493795 -21.447274 9.502619 1.0747922 1.0027701 - 1200 17.214459 -20.726965 6.3578919 1.0193906 1.0083102 - 1300 16.424217 -19.757401 3.9026861 1.0083102 1.0027701 - 1400 15.051731 -18.13464 1.7558146 1.0249307 1.0027701 - 1500 13.966718 -17.051915 1.4843674 1.0470914 1.0027701 - 1600 13.615641 -16.582695 1.7845355 1.0415512 1.0027701 - 1700 13.278822 -16.278248 1.8263176 1.0470914 1.0083102 - 1800 12.680841 -15.81089 2.0096239 1.0415512 1.0027701 - 1900 12.039167 -14.99225 1.4379549 1.0360111 1.0027701 - 2000 12.298923 -15.188233 1.6287319 1.0249307 1.0027701 - 2100 12.048347 -14.947484 1.0583787 1.0304709 1.0027701 - 2200 12.024664 -14.91864 1.0617555 1.0304709 1.0027701 - 2300 11.878263 -14.769923 1.2892425 1.0360111 1.0027701 - 2400 11.578448 -14.525725 1.2925126 1.0083102 1.0027701 - 2500 11.948793 -14.736647 1.5473169 1.0249307 1.0027701 - 2600 11.933924 -14.725605 1.3673896 1.0249307 1.0027701 - 2700 11.622855 -14.414518 1.3035925 1.0304709 1.0083102 - 2800 10.600538 -13.451379 1.3422508 1.0138504 1.0027701 - 2900 10.404739 -13.242902 1.3070821 1.0083102 1.0027701 - 3000 10.73199 -13.60699 0.92518136 1.0138504 1.0027701 - 3100 10.807664 -13.624775 1.3037969 1.0193906 1.0027701 - 3200 10.393964 -13.212022 0.72081929 1.0027701 1.0027701 - 3300 9.8733371 -12.65719 1.1606833 1.0138504 1.0027701 - 3400 9.6206594 -12.349773 0.69859994 1.0138504 1.0027701 - 3500 9.5882688 -12.32291 1.0028888 1.0138504 1.0027701 - 3600 9.693129 -12.441628 0.94751509 1.0193906 1.0083102 - 3700 9.3727837 -12.162354 1.9639195 1.0027701 1.0027701 - 3800 9.1011581 -11.860999 1.0253876 1.0083102 1.0027701 - 3900 8.6637799 -11.44226 1.4848652 1.0027701 1.0027701 - 4000 9.0454579 -11.770928 0.82719098 1.0083102 1.0083102 - 4100 8.5574492 -11.30614 0.82422479 1.0193906 1.0027701 - 4200 8.5903538 -11.322978 0.45091349 1.0027701 1.0027701 - 4300 8.540208 -11.282844 0.55403945 1.0027701 1.0027701 - 4400 7.7043293 -10.372194 0.80170046 1.0027701 1.0027701 - 4500 7.3429905 -9.9970461 0.77097228 1.0193906 1.0027701 - 4600 7.35485 -9.9992837 0.66531873 1.0027701 1.0027701 - 4700 7.3278467 -9.9885021 0.99577458 1.0193906 1.0027701 - 4800 7.8179777 -10.468758 0.56434522 1.0138504 1.0083102 - 4900 7.571002 -10.215558 0.81064116 1.0138504 1.0027701 - 5000 7.5326417 -10.224594 0.86387082 1.0083102 1.0027701 - 5100 7.8120521 -10.468885 0.86739094 1.0027701 1.0027701 - 5200 7.2949975 -10.041278 1.0298349 1.0027701 1.0027701 - 5300 7.6564811 -10.297993 0.71060925 1.0027701 1.0083102 - 5400 7.7359804 -10.373635 0.61872932 1.0027701 1.0083102 - 5500 7.6511513 -10.279058 0.87569767 1.0027701 1.0027701 - 5600 7.2927879 -9.9378811 1.1573049 1.0083102 1.0083102 - 5700 7.1836162 -9.8357325 0.43012076 1.0083102 1.0083102 - 5800 7.3405818 -9.9780947 0.69346928 1.0083102 1.0027701 - 5900 7.6636501 -10.323536 0.82554433 1.0027701 1.0027701 - 6000 7.3515582 -9.9803466 1.09521 1.0138504 1.0027701 - 6100 7.0275875 -9.6739554 0.48460922 1.0027701 1.0027701 - 6200 7.1449226 -9.7541904 0.83007096 1.0193906 1.0083102 - 6300 7.036185 -9.6445595 1.0982599 1.0193906 1.0027701 - 6400 7.1288989 -9.7501637 1.0103414 1.0138504 1.0027701 - 6500 6.6559525 -9.256798 0.58741228 1.0027701 1.0027701 - 6600 7.0559949 -9.6563848 0.53504661 1.0027701 1.0027701 - 6700 7.124289 -9.7613906 0.70816625 1.0027701 1.0027701 - 6800 7.0141849 -9.6298357 0.55987809 1.0083102 1.0027701 - 6900 6.8617323 -9.4376408 0.62371253 1.0193906 1.0083102 - 7000 6.7496366 -9.3379578 0.83540012 1.0027701 1.0083102 - 7100 7.0418565 -9.664915 0.68231111 1.0083102 1.0027701 - 7200 6.6175362 -9.2066737 0.31371885 1.0138504 1.0027701 - 7300 7.076179 -9.6917457 1.0827515 1.0083102 1.0027701 - 7400 6.5263123 -9.1321276 1.1892921 1.0027701 1.0027701 - 7500 6.8072952 -9.3976358 0.60458526 1.0138504 1.0027701 - 7600 6.610006 -9.1934492 0.54359615 1.0193906 1.0027701 - 7700 6.3533198 -8.943515 0.91970357 1.0138504 1.0027701 - 7800 6.7226774 -9.3164434 0.81151352 1.0027701 1.0083102 - 7900 6.2329222 -8.8531998 0.59439797 1.0083102 1.0027701 - 8000 6.5818943 -9.2025911 0.66303132 1.0083102 1.0027701 - 8100 6.372739 -8.9403406 0.81325975 1.0138504 1.0027701 - 8200 6.462003 -9.0346265 0.54917879 1.0083102 1.0027701 - 8300 6.5947825 -9.2171877 0.9005455 1.0027701 1.0027701 - 8400 6.7803374 -9.4179158 0.37270772 1.0027701 1.0027701 - 8500 6.7122886 -9.3363107 0.77011047 1.0083102 1.0027701 - 8600 6.8286386 -9.4264779 0.35815593 1.0027701 1.0027701 - 8700 6.4796483 -9.0676554 0.84568363 1.0138504 1.0027701 - 8800 6.551896 -9.1793668 1.0319947 1.0083102 1.0027701 - 8900 6.1879163 -8.7590749 0.34445309 1.0027701 1.0027701 - 9000 6.2374494 -8.7872159 0.46749314 1.0027701 1.0027701 - 9100 6.3605933 -8.9335681 0.86786624 1.0027701 1.0027701 - 9200 6.4387791 -9.0144583 0.56089061 1.0083102 1.0027701 - 9300 6.2745383 -8.9019836 0.58565081 1.0083102 1.0027701 - 9400 6.1957924 -8.7638279 0.65785826 1.0027701 1.0083102 - 9500 6.079287 -8.6556289 0.47532552 1.0083102 1.0027701 - 9600 6.7679205 -9.3427341 0.48539851 1.0083102 1.0027701 - 9700 6.4007616 -8.9753463 0.58689382 1.0138504 1.0027701 - 9800 6.2137021 -8.7670545 0.80327882 1.0249307 1.0027701 - 9900 6.063559 -8.6359278 0.34977555 1.0083102 1.0027701 - 10000 6.5604562 -9.1417599 0.49589297 1.0083102 1.0027701 -Loop time of 0.469504 on 2 procs for 10000 steps with 361 atoms - -Performance: 9201197.252 tau/day, 21299.068 timesteps/s -94.4% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.13648 | 0.14553 | 0.15459 | 2.4 | 31.00 -Neigh | 0.13867 | 0.14128 | 0.1439 | 0.7 | 30.09 -Comm | 0.05533 | 0.06494 | 0.07455 | 3.8 | 13.83 -Output | 0.0012147 | 0.0013802 | 0.0015457 | 0.4 | 0.29 -Modify | 0.071393 | 0.071421 | 0.07145 | 0.0 | 15.21 -Other | | 0.04494 | | | 9.57 - -Nlocal: 180.5 ave 181 max 180 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 30 ave 34 max 26 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 579.5 ave 644 max 515 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 1159 -Ave neighs/atom = 3.21053 -Neighbor list builds = 3510 -Dangerous builds = 0 -Total wall time: 0:00:00 diff --git a/examples/balance/log.27Nov18.balance.g++.4 b/examples/balance/log.27Nov18.balance.g++.4 deleted file mode 100644 index 7889eff888..0000000000 --- a/examples/balance/log.27Nov18.balance.g++.4 +++ /dev/null @@ -1,209 +0,0 @@ -LAMMPS (27 Nov 2018) - 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.000404358 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 tmp.dump id v_p x y z - -#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 10000 -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) = 3.041 | 3.047 | 3.059 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 - 300 26.479082 -29.920083 2.3678653 1.2299169 1.0193906 - 400 26.522239 -29.965537 6.6787858 1.1855956 1.0083102 - 500 25.725591 -29.168034 0.67065285 1.2520776 1.0193906 - 600 26.247693 -29.692706 7.9887712 1.3074792 1.0193906 - 700 26.237368 -29.676926 1.5987214 1.2409972 1.0083102 - 800 25.889643 -29.431589 4.6160859 1.2631579 1.0083102 - 900 23.635295 -27.372963 9.029962 1.1634349 1.0083102 - 1000 22.571904 -25.87422 1.8936085 1.1301939 1.0193906 - 1100 17.493795 -21.447274 9.502619 1.0858726 1.0193906 - 1200 17.214459 -20.726965 6.3578918 1.0304709 1.0083102 - 1300 16.42412 -19.757358 3.9027527 1.1191136 1.0193906 - 1400 15.030721 -18.114099 1.7564242 1.1523546 1.0193906 - 1500 13.81681 -16.902783 1.1577715 1.0858726 1.0083102 - 1600 13.686443 -16.661545 1.5415714 1.0969529 1.0083102 - 1700 13.019794 -16.066239 2.0360985 1.0526316 1.0083102 - 1800 12.297559 -15.3505 2.3411708 1.0858726 1.0083102 - 1900 12.279142 -15.287559 1.6641576 1.0415512 1.0083102 - 2000 12.230052 -15.192836 1.0975388 1.0415512 1.0193906 - 2100 11.697549 -14.599737 1.6237216 1.0969529 1.0083102 - 2200 11.682062 -14.610972 1.4641234 1.0747922 1.0083102 - 2300 11.075799 -13.986408 1.3034228 1.0637119 1.0083102 - 2400 11.362073 -14.290331 1.4934327 1.0304709 1.0083102 - 2500 11.100258 -14.006922 1.5476543 1.0415512 1.0193906 - 2600 11.12995 -14.013738 1.648208 1.0526316 1.0193906 - 2700 10.709161 -13.560172 1.396234 1.0193906 1.0083102 - 2800 10.827433 -13.654426 1.0691842 1.0304709 1.0083102 - 2900 10.653946 -13.622298 1.0985321 1.0304709 1.0083102 - 3000 10.277755 -13.110194 0.80184675 1.0304709 1.0083102 - 3100 9.9099809 -12.702359 1.0351594 1.0304709 1.0193906 - 3200 9.7539825 -12.558768 0.54465848 1.0526316 1.0083102 - 3300 10.126666 -12.949441 0.64914734 1.0304709 1.0083102 - 3400 9.5324496 -12.338741 1.2896056 1.0193906 1.0193906 - 3500 9.4041639 -12.170248 0.72157285 1.0304709 1.0083102 - 3600 9.2601291 -12.094438 1.1638062 1.0415512 1.0193906 - 3700 9.7052324 -12.503428 1.0681965 1.0193906 1.0193906 - 3800 9.1757619 -11.95576 1.2517655 1.0637119 1.0083102 - 3900 9.2622488 -12.036744 0.49874718 1.0193906 1.0083102 - 4000 8.8510215 -11.634558 1.0887428 1.0415512 1.0193906 - 4100 8.3821331 -11.145234 0.91008971 1.0193906 1.0083102 - 4200 8.2295054 -10.970304 0.5181043 1.0304709 1.0083102 - 4300 8.2161013 -10.942353 0.42128421 1.0304709 1.0193906 - 4400 7.7366945 -10.4592 0.79646198 1.0304709 1.0193906 - 4500 7.6089407 -10.446852 1.0059975 1.0083102 1.0193906 - 4600 7.6662499 -10.406613 1.7369986 1.0193906 1.0083102 - 4700 7.9515739 -10.665324 0.73173058 1.0193906 1.0083102 - 4800 7.7580664 -10.520311 1.1065958 1.0304709 1.0083102 - 4900 7.561205 -10.291568 0.97923495 1.0083102 1.0193906 - 5000 7.4169102 -10.130439 1.1566293 1.0193906 1.0193906 - 5100 7.5994418 -10.310725 1.1081236 1.0193906 1.0193906 - 5200 7.4637026 -10.211945 0.46308591 1.0193906 1.0083102 - 5300 7.5864081 -10.289039 0.55146387 1.0415512 1.0083102 - 5400 7.2190688 -9.8943729 0.56255805 1.0193906 1.0193906 - 5500 7.3953465 -10.112294 0.49166363 1.0193906 1.0193906 - 5600 7.3584536 -10.027488 0.69227871 1.0193906 1.0193906 - 5700 6.932639 -9.6121874 0.67344283 1.0304709 1.0083102 - 5800 7.088604 -9.7715725 0.20307999 1.0193906 1.0193906 - 5900 6.9761247 -9.6446998 0.90406994 1.0083102 1.0083102 - 6000 6.8763621 -9.5236579 0.57873884 1.0415512 1.0083102 - 6100 6.939987 -9.5929188 0.36904108 1.0304709 1.0083102 - 6200 6.820038 -9.4635599 0.63193653 1.0304709 1.0083102 - 6300 6.8288347 -9.4833639 0.41971515 1.0415512 1.0304709 - 6400 6.8690672 -9.5446244 1.0201589 1.0415512 1.0193906 - 6500 6.4727631 -9.1148404 0.80775699 1.0193906 1.0193906 - 6600 6.7113328 -9.3554765 0.61684835 1.0083102 1.0083102 - 6700 6.5896516 -9.2696941 0.58593745 1.0526316 1.0193906 - 6800 6.5609717 -9.2314045 1.2897992 1.0193906 1.0083102 - 6900 6.6225137 -9.2809347 0.47677707 1.0415512 1.0083102 - 7000 6.6617661 -9.3147214 0.72415312 1.0304709 1.0193906 - 7100 6.5773856 -9.2843036 0.7800794 1.0304709 1.0083102 - 7200 6.7300254 -9.4233488 0.73403634 1.0193906 1.0193906 - 7300 6.8497011 -9.4992354 0.97755826 1.0304709 1.0193906 - 7400 6.5848304 -9.2649536 0.89449647 1.0526316 1.0193906 - 7500 6.6468599 -9.3004561 0.53259674 1.0304709 1.0083102 - 7600 6.7096387 -9.3824628 0.40095675 1.0193906 1.0083102 - 7700 6.6205931 -9.2612947 0.44113095 1.0083102 1.0083102 - 7800 6.444935 -9.073124 0.47355329 1.0193906 1.0083102 - 7900 6.6143353 -9.2763501 0.57936627 1.0193906 1.0083102 - 8000 6.5718284 -9.2099799 0.88048189 1.0637119 1.0083102 - 8100 6.9155381 -9.5644544 0.36029314 1.0415512 1.0083102 - 8200 6.4217261 -9.0582117 0.4577164 1.0193906 1.0193906 - 8300 6.4639521 -9.0911283 0.50560328 1.0193906 1.0193906 - 8400 6.2047897 -8.8357836 0.71150301 1.0083102 1.0083102 - 8500 6.5688691 -9.2701491 0.5963871 1.0193906 1.0083102 - 8600 6.6803448 -9.3311473 0.47008064 1.0304709 1.0083102 - 8700 6.4794219 -9.1136868 0.97764575 1.0193906 1.0193906 - 8800 6.3899651 -9.0655629 0.72557611 1.0083102 1.0193906 - 8900 6.4446062 -9.1121453 0.53050589 1.0193906 1.0083102 - 9000 6.7012614 -9.3365992 0.63041848 1.0415512 1.0083102 - 9100 6.3982388 -9.0510004 0.34575359 1.0415512 1.0083102 - 9200 6.9775773 -9.6647109 0.97993232 1.0304709 1.0193906 - 9300 6.5504231 -9.2113542 0.58697844 1.0193906 1.0193906 - 9400 6.6900283 -9.3954145 0.40867465 1.0083102 1.0193906 - 9500 6.3553229 -8.9965934 0.60133843 1.0526316 1.0193906 - 9600 6.4861076 -9.1404384 1.0033387 1.0193906 1.0193906 - 9700 6.469481 -9.1202491 0.85523385 1.0083102 1.0193906 - 9800 6.5508552 -9.188341 0.6068644 1.0304709 1.0083102 - 9900 6.4355199 -9.1044882 0.83288252 1.0304709 1.0193906 - 10000 6.4850092 -9.1433721 0.58691238 1.0193906 1.0193906 -Loop time of 0.418243 on 4 procs for 10000 steps with 361 atoms - -Performance: 10328920.895 tau/day, 23909.539 timesteps/s -87.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.062269 | 0.073833 | 0.096031 | 4.9 | 17.65 -Neigh | 0.066658 | 0.072882 | 0.084956 | 2.7 | 17.43 -Comm | 0.10814 | 0.13013 | 0.14677 | 4.4 | 31.11 -Output | 0.0015733 | 0.0017747 | 0.0023153 | 0.7 | 0.42 -Modify | 0.060045 | 0.060904 | 0.061674 | 0.3 | 14.56 -Other | | 0.07872 | | | 18.82 - -Nlocal: 90.25 ave 92 max 89 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 33.25 ave 57 max 13 min -Histogram: 1 0 0 0 2 0 0 0 0 1 -Neighs: 309.25 ave 496 max 125 min -Histogram: 1 0 0 1 0 0 1 0 0 1 - -Total # of neighbors = 1237 -Ave neighs/atom = 3.42659 -Neighbor list builds = 3620 -Dangerous builds = 0 -Total wall time: 0:00:00 diff --git a/examples/balance/log.27Nov18.balance.group.dynamic.g++.2 b/examples/balance/log.27Nov18.balance.group.dynamic.g++.2 deleted file mode 100644 index b88593b718..0000000000 --- a/examples/balance/log.27Nov18.balance.group.dynamic.g++.2 +++ /dev/null @@ -1,110 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000552893 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted.txt -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000512123 seconds - iteration count = 1 - group weights: fast=1 slow=1 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 -fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} -fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 - -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 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.437 | 4.628 | 4.819 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 -Loop time of 1.95661 on 2 procs for 250 steps with 4000 atoms - -Performance: 55197.383 tau/day, 127.772 timesteps/s -99.4% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.0628 | 1.263 | 1.4632 | 17.8 | 64.55 -Neigh | 0.42332 | 0.43486 | 0.44639 | 1.7 | 22.22 -Comm | 0.033167 | 0.2449 | 0.45664 | 42.8 | 12.52 -Output | 0.00015879 | 0.00017142 | 0.00018406 | 0.0 | 0.01 -Modify | 0.010039 | 0.010042 | 0.010045 | 0.0 | 0.51 -Other | | 0.003658 | | | 0.19 - -Nlocal: 2000 ave 2000 max 2000 min -Histogram: 2 0 0 0 0 0 0 0 0 0 -Nghost: 10441 ave 10457 max 10425 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298332 ave 349156 max 247508 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596664 -Ave neighs/atom = 149.166 -Neighbor list builds = 25 -Dangerous builds = 0 -Total wall time: 0:00:01 diff --git a/examples/balance/log.27Nov18.balance.group.dynamic.g++.4 b/examples/balance/log.27Nov18.balance.group.dynamic.g++.4 deleted file mode 100644 index ec6fc449c4..0000000000 --- a/examples/balance/log.27Nov18.balance.group.dynamic.g++.4 +++ /dev/null @@ -1,110 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000427008 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted.txt -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000735044 seconds - iteration count = 2 - group weights: fast=1 slow=1 - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.6875 1 - y cuts: 0 1 - z cuts: 0 1 -fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} -fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 - -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 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.566 | 3.947 | 4.329 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 -Loop time of 1.48981 on 4 procs for 250 steps with 4000 atoms - -Performance: 72492.623 tau/day, 167.807 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.22803 | 0.67101 | 1.1622 | 43.7 | 45.04 -Neigh | 0.20611 | 0.2259 | 0.23756 | 2.5 | 15.16 -Comm | 0.085412 | 0.58198 | 1.045 | 47.7 | 39.06 -Output | 0.00016332 | 0.00028861 | 0.0006516 | 0.0 | 0.02 -Modify | 0.0069213 | 0.0070978 | 0.0072331 | 0.1 | 0.48 -Other | | 0.003534 | | | 0.24 - -Nlocal: 1000 ave 1001 max 999 min -Histogram: 1 0 0 0 0 2 0 0 0 1 -Nghost: 8727 ave 8761 max 8674 min -Histogram: 1 0 0 0 0 0 1 1 0 1 -Neighs: 149349 ave 260848 max 51191 min -Histogram: 1 1 0 0 0 0 1 0 0 1 - -Total # of neighbors = 597396 -Ave neighs/atom = 149.349 -Neighbor list builds = 25 -Dangerous builds = 0 -Total wall time: 0:00:01 diff --git a/examples/balance/log.27Nov18.balance.group.static.g++.2 b/examples/balance/log.27Nov18.balance.group.static.g++.2 deleted file mode 100644 index eb7a506e2c..0000000000 --- a/examples/balance/log.27Nov18.balance.group.static.g++.2 +++ /dev/null @@ -1,146 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.00050807 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -balance 1.0 shift x 5 1.1 # out unweighted.txt -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000545979 seconds - iteration count = 1 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -balance 1.0 x uniform - rebalancing time: 0.000159502 seconds - iteration count = 0 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -variable weight atom (type==1)*1.0+(type==2)*v_factor -balance 1.0 shift x 5 1.1 weight var weight # out weighted_var.txt - rebalancing time: 0.000320673 seconds - iteration count = 1 - weight variable: weight - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -balance 1.0 x uniform - rebalancing time: 0.000132561 seconds - iteration count = 0 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted_group.txt -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 - rebalancing time: 0.000235796 seconds - iteration count = 1 - group weights: fast=1 slow=1 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -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 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.297 | 4.488 | 4.678 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 1 -6.9453205 0 -5.4456955 -5.6812358 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 -Loop time of 1.99136 on 2 procs for 250 steps with 4000 atoms - -Performance: 54234.216 tau/day, 125.542 timesteps/s -99.0% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.0081 | 1.262 | 1.5159 | 22.6 | 63.37 -Neigh | 0.40357 | 0.41713 | 0.43069 | 2.1 | 20.95 -Comm | 0.033287 | 0.30076 | 0.56822 | 48.8 | 15.10 -Output | 0.00014162 | 0.00015128 | 0.00016093 | 0.0 | 0.01 -Modify | 0.0072243 | 0.0073462 | 0.007468 | 0.1 | 0.37 -Other | | 0.003961 | | | 0.20 - -Nlocal: 2000 ave 2051 max 1949 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10443 ave 10506 max 10380 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298332 ave 363449 max 233215 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596664 -Ave neighs/atom = 149.166 -Neighbor list builds = 24 -Dangerous builds = 0 -Total wall time: 0:00:02 diff --git a/examples/balance/log.27Nov18.balance.group.static.g++.4 b/examples/balance/log.27Nov18.balance.group.static.g++.4 deleted file mode 100644 index d792f1af93..0000000000 --- a/examples/balance/log.27Nov18.balance.group.static.g++.4 +++ /dev/null @@ -1,146 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000426769 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -balance 1.0 shift x 5 1.1 # out unweighted.txt -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000867605 seconds - iteration count = 2 - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.6875 1 - y cuts: 0 1 - z cuts: 0 1 - -balance 1.0 x uniform - rebalancing time: 0.000295401 seconds - iteration count = 0 - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.75 1 - y cuts: 0 1 - z cuts: 0 1 - -variable weight atom (type==1)*1.0+(type==2)*v_factor -balance 1.0 shift x 5 1.1 weight var weight # out weighted_var.txt - rebalancing time: 0.000428915 seconds - iteration count = 2 - weight variable: weight - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.6875 1 - y cuts: 0 1 - z cuts: 0 1 - -balance 1.0 x uniform - rebalancing time: 0.000236273 seconds - iteration count = 0 - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.75 1 - y cuts: 0 1 - z cuts: 0 1 - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted_group.txt -balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 - rebalancing time: 0.000319958 seconds - iteration count = 2 - group weights: fast=1 slow=1 - initial/final max load/proc = 1200 1200 - initial/final imbalance factor = 1.2 1.2 - x cuts: 0 0.25 0.5 0.6875 1 - y cuts: 0 1 - z cuts: 0 1 - -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 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.426 | 3.713 | 4.188 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 1 -6.9453205 0 -5.4456955 -5.6812358 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 -Loop time of 1.45972 on 4 procs for 250 steps with 4000 atoms - -Performance: 73986.752 tau/day, 171.266 timesteps/s -95.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.34936 | 0.66325 | 1.1729 | 40.9 | 45.44 -Neigh | 0.15811 | 0.20835 | 0.24806 | 7.4 | 14.27 -Comm | 0.04955 | 0.57875 | 0.86745 | 43.6 | 39.65 -Output | 0.00015831 | 0.00028872 | 0.00064492 | 0.0 | 0.02 -Modify | 0.0030367 | 0.0040676 | 0.0050561 | 1.1 | 0.28 -Other | | 0.005014 | | | 0.34 - -Nlocal: 1000 ave 1263 max 712 min -Histogram: 1 0 0 0 1 0 1 0 0 1 -Nghost: 8711.5 ave 9045 max 8325 min -Histogram: 1 0 0 0 0 1 1 0 0 1 -Neighs: 149325 ave 275165 max 77227 min -Histogram: 2 0 0 0 1 0 0 0 0 1 - -Total # of neighbors = 597299 -Ave neighs/atom = 149.325 -Neighbor list builds = 23 -Dangerous builds = 0 -Total wall time: 0:00:01 diff --git a/examples/balance/log.27Nov18.balance.kspace.g++.2 b/examples/balance/log.27Nov18.balance.kspace.g++.2 deleted file mode 100644 index 13e24ed17a..0000000000 --- a/examples/balance/log.27Nov18.balance.kspace.g++.2 +++ /dev/null @@ -1,117 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -#atom_style charge -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000510931 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type -#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 - -kspace_style pppm/disp 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 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -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 -run 500 -PPPMDisp initialization ... - Dispersion G vector (1/distance) = 0.1 - Dispersion grid = 2 2 2 - Dispersion stencil order = 5 - Dispersion estimated absolute RMS force accuracy = 1.01251 - Dispersion estimated absolute real space RMS force accuracy = 1.01251 - Dispersion estimated absolute kspace RMS force accuracy = 7.29446e-07 - Disperion estimated relative force accuracy = 1.01251 - using double precision FFTs - 3d grid and FFT values/proc dispersion = 294 4 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/long/coul/long, 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) = 4.846 | 5.014 | 5.182 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 52.148338 0 53.647963 94.09503 4738.2137 - 50 17.747599 42.836975 0 69.451719 143.44398 4738.2137 - 100 9.0390947 49.78615 0 63.341402 117.79296 4738.2137 - 150 13.456072 47.810527 0 67.989589 140.52068 4738.2137 - 200 11.358932 52.542448 0 69.576586 142.87196 4738.2137 - 250 13.204593 48.601437 0 68.403375 134.97484 4738.2137 - 300 12.061996 50.642194 0 68.730665 133.27077 4738.2137 - 350 14.107163 50.201375 0 71.356829 143.54662 4738.2137 - 400 12.053939 50.221116 0 68.297504 132.01999 4738.2137 - 450 13.523963 50.829687 0 71.11056 143.8183 4738.2137 - 500 13.135822 50.150114 0 69.848921 137.26364 4738.2137 -Loop time of 6.95261 on 2 procs for 500 steps with 4000 atoms - -Performance: 31067.471 tau/day, 71.915 timesteps/s -99.5% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.8521 | 3.0997 | 3.3472 | 14.1 | 44.58 -Kspace | 1.1859 | 1.303 | 1.4202 | 10.3 | 18.74 -Neigh | 2.2324 | 2.387 | 2.5417 | 10.0 | 34.33 -Comm | 0.1003 | 0.12513 | 0.14996 | 7.0 | 1.80 -Output | 0.00033641 | 0.00036693 | 0.00039744 | 0.0 | 0.01 -Modify | 0.026408 | 0.02737 | 0.028331 | 0.6 | 0.39 -Other | | 0.009989 | | | 0.14 - -Nlocal: 2000 ave 2316 max 1684 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 9543.5 ave 9675 max 9412 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 254445 ave 276022 max 232868 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 508890 -Ave neighs/atom = 127.222 -Neighbor list builds = 124 -Dangerous builds = 97 -Total wall time: 0:00:06 diff --git a/examples/balance/log.27Nov18.balance.kspace.g++.4 b/examples/balance/log.27Nov18.balance.kspace.g++.4 deleted file mode 100644 index 7745b3e602..0000000000 --- a/examples/balance/log.27Nov18.balance.kspace.g++.4 +++ /dev/null @@ -1,117 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -#atom_style charge -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000432491 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type -#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 - -kspace_style pppm/disp 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 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -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 -run 500 -PPPMDisp initialization ... - Dispersion G vector (1/distance) = 0.1 - Dispersion grid = 2 2 2 - Dispersion stencil order = 5 - Dispersion estimated absolute RMS force accuracy = 1.01251 - Dispersion estimated absolute real space RMS force accuracy = 1.01251 - Dispersion estimated absolute kspace RMS force accuracy = 7.29446e-07 - Disperion estimated relative force accuracy = 1.01251 - using double precision FFTs - 3d grid and FFT values/proc dispersion = 294 4 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/long/coul/long, 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) = 4.291 | 4.423 | 4.656 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 52.148338 0 53.647963 94.09503 4738.2137 - 50 17.850656 42.620113 0 69.389403 142.80556 4738.2137 - 100 9.4607189 49.700118 0 63.887649 117.51739 4738.2137 - 150 13.992056 47.731988 0 68.714825 140.56926 4738.2137 - 200 11.617635 52.509394 0 69.93149 142.6933 4738.2137 - 250 13.536287 48.33108 0 68.630434 133.91794 4738.2137 - 300 12.619985 50.328139 0 69.253384 132.46719 4738.2137 - 350 14.497923 50.092405 0 71.833853 143.39356 4738.2137 - 400 12.228079 50.202361 0 68.539894 131.75614 4738.2137 - 450 14.01349 50.908526 0 71.923506 144.25732 4738.2137 - 500 13.277341 50.381613 0 70.292644 137.20282 4738.2137 -Loop time of 6.17838 on 4 procs for 500 steps with 4000 atoms - -Performance: 34960.628 tau/day, 80.927 timesteps/s -93.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.74813 | 1.6453 | 2.5052 | 65.7 | 26.63 -Kspace | 1.036 | 2.9098 | 4.5974 | 94.8 | 47.10 -Neigh | 0.27464 | 1.2099 | 2.4155 | 84.8 | 19.58 -Comm | 0.1711 | 0.36843 | 0.5217 | 25.2 | 5.96 -Output | 0.00052595 | 0.0053349 | 0.0074508 | 3.8 | 0.09 -Modify | 0.023363 | 0.027308 | 0.032521 | 2.3 | 0.44 -Other | | 0.01228 | | | 0.20 - -Nlocal: 1000 ave 2002 max 241 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 7608 ave 9312 max 5850 min -Histogram: 2 0 0 0 0 0 0 0 0 2 -Neighs: 127345 ave 211903 max 47616 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 509381 -Ave neighs/atom = 127.345 -Neighbor list builds = 124 -Dangerous builds = 97 -Total wall time: 0:00:06 diff --git a/examples/balance/log.27Nov18.balance.neigh.dynamic.g++.2 b/examples/balance/log.27Nov18.balance.neigh.dynamic.g++.2 deleted file mode 100644 index aef8d90889..0000000000 --- a/examples/balance/log.27Nov18.balance.neigh.dynamic.g++.2 +++ /dev/null @@ -1,228 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000553608 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.8 weight store WEIGHT -compute p all property/atom d_WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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.mp4 c_p type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 amap 0.0 2.0 cf 0.1 3 min blue 0.5 green max red - -thermo 50 -run 500 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -WARNING: Balance weight neigh skipped b/c no list found (src/imbalance_neigh.cpp:65) -Per MPI rank memory allocation (min/avg/max) = 4.562 | 4.753 | 4.944 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 - 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 - 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 - 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 - 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 -Loop time of 3.92718 on 2 procs for 500 steps with 4000 atoms - -Performance: 55001.290 tau/day, 127.318 timesteps/s -99.2% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.2902 | 2.6102 | 2.9303 | 19.8 | 66.47 -Neigh | 0.89715 | 0.89718 | 0.8972 | 0.0 | 22.85 -Comm | 0.074355 | 0.39408 | 0.7138 | 50.9 | 10.03 -Output | 0.0003202 | 0.00035989 | 0.00039959 | 0.0 | 0.01 -Modify | 0.016438 | 0.016832 | 0.017226 | 0.3 | 0.43 -Other | | 0.008523 | | | 0.22 - -Nlocal: 2000 ave 2056 max 1944 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10457.5 ave 10508 max 10407 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298070 ave 333007 max 263132 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596139 -Ave neighs/atom = 149.035 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.569 | 4.758 | 4.946 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 - 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 4738.2137 - 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 4738.2137 - 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 4738.2137 - 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 4738.2137 - 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 4738.2137 - 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 4738.2137 - 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 4738.2137 - 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 4738.2137 - 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 4738.2137 - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 -Loop time of 3.83028 on 2 procs for 500 steps with 4000 atoms - -Performance: 56392.741 tau/day, 130.539 timesteps/s -99.6% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.263 | 2.5605 | 2.858 | 18.6 | 66.85 -Neigh | 0.8789 | 0.88341 | 0.88791 | 0.5 | 23.06 -Comm | 0.068052 | 0.36076 | 0.65347 | 48.7 | 9.42 -Output | 0.0003016 | 0.0003438 | 0.000386 | 0.0 | 0.01 -Modify | 0.016381 | 0.016829 | 0.017277 | 0.3 | 0.44 -Other | | 0.008426 | | | 0.22 - -Nlocal: 2000 ave 2049 max 1951 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10389 ave 10436 max 10342 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 300836 ave 335987 max 265684 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 601671 -Ave neighs/atom = 150.418 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.569 | 4.758 | 4.946 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 - 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 4738.2137 - 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 4738.2137 - 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 4738.2137 - 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 4738.2137 - 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 4738.2137 - 1300 0.54430333 -6.260995 0 -5.4447442 -1.856351 4738.2137 - 1350 0.55097839 -6.2715909 0 -5.4453299 -1.9014337 4738.2137 - 1400 0.53858139 -6.2526781 0 -5.445008 -1.7965773 4738.2137 - 1450 0.5421844 -6.2574683 0 -5.444395 -1.7901189 4738.2137 - 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 -Loop time of 3.81946 on 2 procs for 500 steps with 4000 atoms - -Performance: 56552.445 tau/day, 130.908 timesteps/s -99.6% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.2594 | 2.5549 | 2.8504 | 18.5 | 66.89 -Neigh | 0.86746 | 0.87203 | 0.8766 | 0.5 | 22.83 -Comm | 0.06715 | 0.36699 | 0.66684 | 49.5 | 9.61 -Output | 0.00029325 | 0.00033867 | 0.00038409 | 0.0 | 0.01 -Modify | 0.016529 | 0.016817 | 0.017105 | 0.2 | 0.44 -Other | | 0.008371 | | | 0.22 - -Nlocal: 2000 ave 2034 max 1966 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10386 ave 10936 max 9836 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 302958 ave 337188 max 268729 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 605917 -Ave neighs/atom = 151.479 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.569 | 4.758 | 4.946 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 - 1550 0.53713593 -6.2504069 0 -5.4449044 -1.764709 4738.2137 - 1600 0.54679556 -6.2646482 0 -5.4446599 -1.8115775 4738.2137 - 1650 0.53806577 -6.2519006 0 -5.4450037 -1.7409142 4738.2137 - 1700 0.5347951 -6.2468962 0 -5.4449041 -1.7162331 4738.2137 - 1750 0.53714568 -6.2506577 0 -5.4451406 -1.7340499 4738.2137 - 1800 0.52749839 -6.2358664 0 -5.4448167 -1.6874961 4738.2137 - 1850 0.54585956 -6.2629394 0 -5.4443547 -1.7758764 4738.2137 - 1900 0.53010831 -6.2387561 0 -5.4437925 -1.6381825 4738.2137 - 1950 0.54288557 -6.2583073 0 -5.4441826 -1.7368524 4738.2137 - 2000 0.52765923 -6.2348572 0 -5.4435663 -1.5588839 4738.2137 -Loop time of 3.78423 on 2 procs for 500 steps with 4000 atoms - -Performance: 57078.976 tau/day, 132.127 timesteps/s -99.4% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.2449 | 2.5388 | 2.8328 | 18.4 | 67.09 -Neigh | 0.85527 | 0.85828 | 0.86129 | 0.3 | 22.68 -Comm | 0.065453 | 0.36215 | 0.65885 | 49.3 | 9.57 -Output | 0.00030518 | 0.00032794 | 0.00035071 | 0.0 | 0.01 -Modify | 0.016444 | 0.016597 | 0.01675 | 0.1 | 0.44 -Other | | 0.008044 | | | 0.21 - -Nlocal: 2000 ave 2031 max 1969 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10334 ave 10921 max 9747 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 303988 ave 338808 max 269168 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 607976 -Ave neighs/atom = 151.994 -Neighbor list builds = 51 -Dangerous builds = 0 - -Total wall time: 0:00:15 diff --git a/examples/balance/log.27Nov18.balance.neigh.dynamic.g++.4 b/examples/balance/log.27Nov18.balance.neigh.dynamic.g++.4 deleted file mode 100644 index 08a59785d4..0000000000 --- a/examples/balance/log.27Nov18.balance.neigh.dynamic.g++.4 +++ /dev/null @@ -1,228 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000430107 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.8 weight store WEIGHT -compute p all property/atom d_WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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.mp4 c_p type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 amap 0.0 2.0 cf 0.1 3 min blue 0.5 green max red - -thermo 50 -run 500 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -WARNING: Balance weight neigh skipped b/c no list found (src/imbalance_neigh.cpp:65) -Per MPI rank memory allocation (min/avg/max) = 3.691 | 4.072 | 4.454 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 - 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 - 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 - 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 - 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 -Loop time of 2.45924 on 4 procs for 500 steps with 4000 atoms - -Performance: 87831.985 tau/day, 203.315 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.1372 | 1.4179 | 1.6656 | 18.1 | 57.66 -Neigh | 0.30681 | 0.46841 | 0.69372 | 24.1 | 19.05 -Comm | 0.46019 | 0.55206 | 0.6052 | 7.7 | 22.45 -Output | 0.00034404 | 0.0005753 | 0.001132 | 0.0 | 0.02 -Modify | 0.007339 | 0.0099927 | 0.013719 | 2.7 | 0.41 -Other | | 0.01029 | | | 0.42 - -Nlocal: 1000 ave 1549 max 605 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8755 ave 9851 max 8071 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 149308 ave 164554 max 128538 min -Histogram: 1 0 0 1 0 0 0 0 0 2 - -Total # of neighbors = 597231 -Ave neighs/atom = 149.308 -Neighbor list builds = 50 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.097 | 4.288 | 4.475 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 - 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 4738.2137 - 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 4738.2137 - 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 4738.2137 - 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 4738.2137 - 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 4738.2137 - 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 4738.2137 - 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 4738.2137 - 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 4738.2137 - 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 4738.2137 - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 -Loop time of 2.389 on 4 procs for 500 steps with 4000 atoms - -Performance: 90414.542 tau/day, 209.293 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 | 1.2112 | 1.381 | 1.5214 | 11.0 | 57.81 -Neigh | 0.29746 | 0.48382 | 0.74669 | 27.5 | 20.25 -Comm | 0.40449 | 0.50032 | 0.57922 | 9.4 | 20.94 -Output | 0.00033617 | 0.00064272 | 0.0013907 | 0.0 | 0.03 -Modify | 0.0070128 | 0.010942 | 0.015494 | 3.7 | 0.46 -Other | | 0.01223 | | | 0.51 - -Nlocal: 1000 ave 1569 max 595 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8715.25 ave 9779 max 8018 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 150170 ave 163282 max 132114 min -Histogram: 1 0 0 1 0 0 0 0 0 2 - -Total # of neighbors = 600678 -Ave neighs/atom = 150.169 -Neighbor list builds = 53 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.097 | 4.288 | 4.475 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 - 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 4738.2137 - 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 4738.2137 - 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 4738.2137 - 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 4738.2137 - 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 4738.2137 - 1300 0.54134321 -6.2590728 0 -5.447261 -1.9170271 4738.2137 - 1350 0.53564389 -6.2501521 0 -5.4468871 -1.8642306 4738.2137 - 1400 0.53726924 -6.2518379 0 -5.4461355 -1.8544028 4738.2137 - 1450 0.54525935 -6.2632653 0 -5.4455808 -1.9072158 4738.2137 - 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866985 4738.2137 -Loop time of 2.45895 on 4 procs for 500 steps with 4000 atoms - -Performance: 87842.291 tau/day, 203.339 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 | 1.2592 | 1.4017 | 1.5327 | 11.0 | 57.01 -Neigh | 0.28831 | 0.47661 | 0.75988 | 28.7 | 19.38 -Comm | 0.41426 | 0.54907 | 0.6044 | 10.6 | 22.33 -Output | 0.0003705 | 0.00060898 | 0.0012109 | 0.0 | 0.02 -Modify | 0.014004 | 0.016774 | 0.020669 | 1.9 | 0.68 -Other | | 0.01415 | | | 0.58 - -Nlocal: 1000 ave 1543 max 605 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8704.5 ave 9803 max 7983 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 150494 ave 166334 max 129306 min -Histogram: 1 0 0 1 0 0 0 0 0 2 - -Total # of neighbors = 601974 -Ave neighs/atom = 150.494 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.097 | 4.288 | 4.475 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866985 4738.2137 - 1550 0.55327018 -6.2750126 0 -5.4453148 -1.9506585 4738.2137 - 1600 0.54419004 -6.2612622 0 -5.4451812 -1.8559437 4738.2137 - 1650 0.54710034 -6.2661938 0 -5.4457484 -1.8882763 4738.2137 - 1700 0.53665691 -6.2504958 0 -5.4457117 -1.8068009 4738.2137 - 1750 0.5486471 -6.2681127 0 -5.4453478 -1.8662656 4738.2137 - 1800 0.54476222 -6.2615086 0 -5.4445695 -1.8352838 4738.2137 - 1850 0.54143048 -6.2555517 0 -5.443609 -1.8005726 4738.2137 - 1900 0.53992511 -6.254136 0 -5.4444508 -1.7768715 4738.2137 - 1950 0.54665895 -6.2640958 0 -5.4443124 -1.7946993 4738.2137 - 2000 0.5455751 -6.2625337 0 -5.4443756 -1.8072242 4738.2137 -Loop time of 2.42708 on 4 procs for 500 steps with 4000 atoms - -Performance: 88995.678 tau/day, 206.009 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.2482 | 1.3902 | 1.5329 | 10.6 | 57.28 -Neigh | 0.31099 | 0.50813 | 0.78451 | 28.1 | 20.94 -Comm | 0.37293 | 0.5011 | 0.58684 | 11.2 | 20.65 -Output | 0.00033593 | 0.00060582 | 0.0012991 | 0.0 | 0.02 -Modify | 0.007091 | 0.0097566 | 0.013303 | 2.7 | 0.40 -Other | | 0.01727 | | | 0.71 - -Nlocal: 1000 ave 1539 max 607 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8677 ave 9837 max 7981 min -Histogram: 2 0 0 0 1 0 0 0 0 1 -Neighs: 151655 ave 168263 max 129443 min -Histogram: 1 0 0 1 0 0 0 0 0 2 - -Total # of neighbors = 606619 -Ave neighs/atom = 151.655 -Neighbor list builds = 56 -Dangerous builds = 0 - -Total wall time: 0:00:09 diff --git a/examples/balance/log.27Nov18.balance.neigh.rcb.g++.2 b/examples/balance/log.27Nov18.balance.neigh.rcb.g++.2 deleted file mode 100644 index 42b04f818c..0000000000 --- a/examples/balance/log.27Nov18.balance.neigh.rcb.g++.2 +++ /dev/null @@ -1,141 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000511885 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -comm_style tiled - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -fix 0 all balance 50 1.0 rcb weight neigh 0.8 weight store WEIGHT -compute p all property/atom d_WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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 - -run 250 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -WARNING: Balance weight neigh skipped b/c no list found (src/imbalance_neigh.cpp:65) -Per MPI rank memory allocation (min/avg/max) = 4.138 | 4.329 | 4.52 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 -Loop time of 1.80309 on 2 procs for 250 steps with 4000 atoms - -Performance: 59897.213 tau/day, 138.651 timesteps/s -97.9% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.2185 | 1.2646 | 1.3106 | 4.1 | 70.13 -Neigh | 0.43131 | 0.43248 | 0.43365 | 0.2 | 23.99 -Comm | 0.045418 | 0.090311 | 0.1352 | 14.9 | 5.01 -Output | 0.00017476 | 0.00021195 | 0.00024915 | 0.0 | 0.01 -Modify | 0.011012 | 0.01103 | 0.011048 | 0.0 | 0.61 -Other | | 0.004476 | | | 0.25 - -Nlocal: 2000 ave 2000 max 2000 min -Histogram: 2 0 0 0 0 0 0 0 0 0 -Nghost: 10412.5 ave 10414 max 10411 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298332 ave 299797 max 296867 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596664 -Ave neighs/atom = 149.166 -Neighbor list builds = 25 -Dangerous builds = 0 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.929 | 4.929 | 4.93 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 - 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 - 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 - 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 - 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 -Loop time of 1.77097 on 2 procs for 250 steps with 4000 atoms - -Performance: 60983.669 tau/day, 141.166 timesteps/s -99.4% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.2353 | 1.2515 | 1.2678 | 1.5 | 70.67 -Neigh | 0.44235 | 0.44303 | 0.44371 | 0.1 | 25.02 -Comm | 0.045978 | 0.061555 | 0.077133 | 6.3 | 3.48 -Output | 0.0001564 | 0.00016713 | 0.00017786 | 0.0 | 0.01 -Modify | 0.010305 | 0.01031 | 0.010315 | 0.0 | 0.58 -Other | | 0.004365 | | | 0.25 - -Nlocal: 2000 ave 2000 max 2000 min -Histogram: 2 0 0 0 0 0 0 0 0 0 -Nghost: 10466.5 ave 10470 max 10463 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298070 ave 349236 max 246903 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596139 -Ave neighs/atom = 149.035 -Neighbor list builds = 26 -Dangerous builds = 0 - -Total wall time: 0:00:03 diff --git a/examples/balance/log.27Nov18.balance.neigh.rcb.g++.4 b/examples/balance/log.27Nov18.balance.neigh.rcb.g++.4 deleted file mode 100644 index 4a2a747773..0000000000 --- a/examples/balance/log.27Nov18.balance.neigh.rcb.g++.4 +++ /dev/null @@ -1,141 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000440836 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -comm_style tiled - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -fix 0 all balance 50 1.0 rcb weight neigh 0.8 weight store WEIGHT -compute p all property/atom d_WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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 - -run 250 -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -WARNING: Balance weight neigh skipped b/c no list found (src/imbalance_neigh.cpp:65) -Per MPI rank memory allocation (min/avg/max) = 3.917 | 3.927 | 3.945 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 -Loop time of 1.0693 on 4 procs for 250 steps with 4000 atoms - -Performance: 101000.295 tau/day, 233.797 timesteps/s -89.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.58255 | 0.65493 | 0.72281 | 8.3 | 61.25 -Neigh | 0.214 | 0.22344 | 0.23158 | 1.4 | 20.90 -Comm | 0.10451 | 0.17801 | 0.25967 | 17.3 | 16.65 -Output | 0.00015521 | 0.00020903 | 0.00034142 | 0.0 | 0.02 -Modify | 0.007113 | 0.0073407 | 0.0076027 | 0.2 | 0.69 -Other | | 0.005369 | | | 0.50 - -Nlocal: 1000 ave 1005 max 996 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 7674 ave 7679 max 7670 min -Histogram: 1 1 0 0 0 0 1 0 0 1 -Neighs: 149349 ave 149991 max 147960 min -Histogram: 1 0 0 0 0 0 0 1 0 2 - -Total # of neighbors = 597396 -Ave neighs/atom = 149.349 -Neighbor list builds = 25 -Dangerous builds = 0 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.922 | 4.004 | 4.078 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 - 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 - 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 - 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 - 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 -Loop time of 0.999028 on 4 procs for 250 steps with 4000 atoms - -Performance: 108105.088 tau/day, 250.243 timesteps/s -93.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.60256 | 0.6507 | 0.68091 | 3.8 | 65.13 -Neigh | 0.21602 | 0.21945 | 0.22516 | 0.8 | 21.97 -Comm | 0.087366 | 0.11787 | 0.16957 | 9.6 | 11.80 -Output | 0.00016737 | 0.00028127 | 0.00057006 | 0.0 | 0.03 -Modify | 0.0065138 | 0.0066211 | 0.0067828 | 0.1 | 0.66 -Other | | 0.004103 | | | 0.41 - -Nlocal: 1000 ave 1005 max 994 min -Histogram: 1 0 0 1 0 0 0 0 1 1 -Nghost: 7675.75 ave 7703 max 7648 min -Histogram: 1 1 0 0 0 0 0 0 1 1 -Neighs: 149308 ave 173909 max 124842 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 597231 -Ave neighs/atom = 149.308 -Neighbor list builds = 25 -Dangerous builds = 0 - -Total wall time: 0:00:02 diff --git a/examples/balance/log.27Nov18.balance.neigh.static.g++.2 b/examples/balance/log.27Nov18.balance.neigh.static.g++.2 deleted file mode 100644 index de3aae921c..0000000000 --- a/examples/balance/log.27Nov18.balance.neigh.static.g++.2 +++ /dev/null @@ -1,211 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000495195 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -balance 1.0 shift x 10 1.0 weight neigh 0.8 # out weighted_var.txt -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -WARNING: Balance weight neigh skipped b/c no list found (src/imbalance_neigh.cpp:65) - rebalancing time: 0.000623703 seconds - iteration count = 1 - neigh weight factor: 0.8 - initial/final max load/proc = 2000 2000 - initial/final imbalance factor = 1 1 - x cuts: 0 0.5 1 - y cuts: 0 1 - z cuts: 0 1 - -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 -run 250 post no -Per MPI rank memory allocation (min/avg/max) = 4.297 | 4.488 | 4.678 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 1 -6.9453205 0 -5.4456955 -5.6812358 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 -Loop time of 1.97176 on 2 procs for 250 steps with 4000 atoms - -balance 1.0 shift x 10 1.0 weight neigh 0.8 - rebalancing time: 0.000482321 seconds - iteration count = 10 - neigh weight factor: 0.8 - initial/final max load/proc = 290759 262123 - initial/final imbalance factor = 1.10982 1.00052 - x cuts: 0 0.45166 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 post no -Per MPI rank memory allocation (min/avg/max) = 4.304 | 4.492 | 4.681 Mbytes -Step Temp E_pair E_mol TotEng Press - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 - 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 - 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 - 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 - 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 -Loop time of 1.77716 on 2 procs for 250 steps with 4000 atoms - -balance 1.0 shift x 10 1.0 weight neigh 0.8 - rebalancing time: 0.000497341 seconds - iteration count = 10 - neigh weight factor: 0.8 - initial/final max load/proc = 296648 269016 - initial/final imbalance factor = 1.10642 1.00336 - x cuts: 0 0.501461 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 post no -Per MPI rank memory allocation (min/avg/max) = 4.681 | 4.683 | 4.686 Mbytes -Step Temp E_pair E_mol TotEng Press - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 - 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 - 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 - 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 - 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 - 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 -Loop time of 2.0039 on 2 procs for 250 steps with 4000 atoms - -balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 - rebalancing time: 0.000368118 seconds - iteration count = 10 - neigh weight factor: 0.8 - time weight factor: 0.6 - initial/final max load/proc = 168.493 167.093 - initial/final imbalance factor = 1.00948 1.00109 - x cuts: 0 0.499991 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.681 | 4.683 | 4.686 Mbytes -Step Temp E_pair E_mol TotEng Press - 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 - 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 - 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 - 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 - 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 -Loop time of 2.0382 on 2 procs for 250 steps with 4000 atoms - -Performance: 52987.998 tau/day, 122.657 timesteps/s -98.9% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.96918 | 1.257 | 1.5449 | 25.7 | 61.67 -Neigh | 0.40421 | 0.42672 | 0.44923 | 3.4 | 20.94 -Comm | 0.032542 | 0.34306 | 0.65358 | 53.0 | 16.83 -Output | 0.00014377 | 0.00015366 | 0.00016356 | 0.0 | 0.01 -Modify | 0.0070617 | 0.007337 | 0.0076122 | 0.3 | 0.36 -Other | | 0.003878 | | | 0.19 - -Nlocal: 2000 ave 2056 max 1944 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10403.5 ave 10525 max 10282 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 300836 ave 365656 max 236015 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 601671 -Ave neighs/atom = 150.418 -Neighbor list builds = 25 -Dangerous builds = 0 -balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 - rebalancing time: 0.000344753 seconds - iteration count = 10 - neigh weight factor: 0.8 - time weight factor: 0.6 - initial/final max load/proc = 170.235 168.809 - initial/final imbalance factor = 1.01037 1.00191 - x cuts: 0 0.49755 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 4.681 | 4.683 | 4.686 Mbytes -Step Temp E_pair E_mol TotEng Press - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 - 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 - 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 - 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 - 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 - 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 -Loop time of 2.01086 on 2 procs for 250 steps with 4000 atoms - -Performance: 53708.387 tau/day, 124.325 timesteps/s -98.9% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.0037 | 1.2615 | 1.5192 | 23.0 | 62.73 -Neigh | 0.40846 | 0.4277 | 0.44695 | 2.9 | 21.27 -Comm | 0.033029 | 0.31012 | 0.5872 | 49.8 | 15.42 -Output | 0.00014424 | 0.00015259 | 0.00016093 | 0.0 | 0.01 -Modify | 0.007298 | 0.0074347 | 0.0075715 | 0.2 | 0.37 -Other | | 0.003999 | | | 0.20 - -Nlocal: 2000 ave 2038 max 1962 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10391 ave 10489 max 10293 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 301104 ave 358264 max 243943 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 602207 -Ave neighs/atom = 150.552 -Neighbor list builds = 25 -Dangerous builds = 0 - -Total wall time: 0:00:09 diff --git a/examples/balance/log.27Nov18.balance.neigh.static.g++.4 b/examples/balance/log.27Nov18.balance.neigh.static.g++.4 deleted file mode 100644 index 3a9ab43cb1..0000000000 --- a/examples/balance/log.27Nov18.balance.neigh.static.g++.4 +++ /dev/null @@ -1,211 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -variable factor index 1.0 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000429153 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -balance 1.0 shift x 10 1.0 weight neigh 0.8 # out weighted_var.txt -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 -WARNING: Balance weight neigh skipped b/c no list found (src/imbalance_neigh.cpp:65) - rebalancing time: 0.000684023 seconds - iteration count = 3 - neigh weight factor: 0.8 - initial/final max load/proc = 1200 1000 - initial/final imbalance factor = 1.2 1 - x cuts: 0 0.25 0.5 0.71875 1 - y cuts: 0 1 - z cuts: 0 1 - -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 -run 250 post no -Per MPI rank memory allocation (min/avg/max) = 3.426 | 3.802 | 4.188 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 1 -6.9453205 0 -5.4456955 -5.6812358 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 -Loop time of 1.44749 on 4 procs for 250 steps with 4000 atoms - -balance 1.0 shift x 10 1.0 weight neigh 0.8 - rebalancing time: 0.000543356 seconds - iteration count = 10 - neigh weight factor: 0.8 - initial/final max load/proc = 220132 125739 - initial/final imbalance factor = 1.75833 1.00436 - x cuts: 0 0.304443 0.450928 0.626678 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 post no -Per MPI rank memory allocation (min/avg/max) = 3.814 | 3.999 | 4.192 Mbytes -Step Temp E_pair E_mol TotEng Press - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 - 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 - 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 - 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 - 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 -Loop time of 1.19834 on 4 procs for 250 steps with 4000 atoms - -balance 1.0 shift x 10 1.0 weight neigh 0.8 - rebalancing time: 0.000308752 seconds - iteration count = 10 - neigh weight factor: 0.8 - initial/final max load/proc = 147109 128929 - initial/final imbalance factor = 1.14487 1.00338 - x cuts: 0 0.304873 0.449926 0.59527 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 post no -Per MPI rank memory allocation (min/avg/max) = 3.832 | 4.018 | 4.209 Mbytes -Step Temp E_pair E_mol TotEng Press - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 - 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 - 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 - 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 - 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 - 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 -Loop time of 1.23246 on 4 procs for 250 steps with 4000 atoms - -balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 - rebalancing time: 0.000306845 seconds - iteration count = 10 - neigh weight factor: 0.8 - time weight factor: 0.6 - initial/final max load/proc = 114.116 101.665 - initial/final imbalance factor = 1.12567 1.00285 - x cuts: 0 0.30983 0.449501 0.588031 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.832 | 4.018 | 4.209 Mbytes -Step Temp E_pair E_mol TotEng Press - 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 - 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 - 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 - 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 - 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 -Loop time of 1.13265 on 4 procs for 250 steps with 4000 atoms - -Performance: 95351.673 tau/day, 220.721 timesteps/s -97.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.64092 | 0.67347 | 0.70289 | 3.5 | 59.46 -Neigh | 0.11654 | 0.22172 | 0.35287 | 22.2 | 19.58 -Comm | 0.068215 | 0.22827 | 0.36221 | 28.0 | 20.15 -Output | 0.00016975 | 0.00031555 | 0.00065875 | 0.0 | 0.03 -Modify | 0.00214 | 0.004007 | 0.0062947 | 3.0 | 0.35 -Other | | 0.004862 | | | 0.43 - -Nlocal: 1000 ave 1651 max 529 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Nghost: 8692.5 ave 9709 max 8037 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 150170 ave 154877 max 145634 min -Histogram: 1 0 0 1 0 0 1 0 0 1 - -Total # of neighbors = 600681 -Ave neighs/atom = 150.17 -Neighbor list builds = 25 -Dangerous builds = 0 -balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 - rebalancing time: 0.000319719 seconds - iteration count = 10 - neigh weight factor: 0.8 - time weight factor: 0.6 - initial/final max load/proc = 102.192 99.2749 - initial/final imbalance factor = 1.03206 1.0026 - x cuts: 0 0.312695 0.449907 0.587625 1 - y cuts: 0 1 - z cuts: 0 1 -run 250 -Per MPI rank memory allocation (min/avg/max) = 3.832 | 4.019 | 4.209 Mbytes -Step Temp E_pair E_mol TotEng Press - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 - 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 - 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 - 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 - 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 - 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 -Loop time of 1.16447 on 4 procs for 250 steps with 4000 atoms - -Performance: 92745.661 tau/day, 214.689 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.61612 | 0.67903 | 0.73112 | 5.1 | 58.31 -Neigh | 0.11722 | 0.22257 | 0.35236 | 22.3 | 19.11 -Comm | 0.099441 | 0.25198 | 0.42338 | 28.4 | 21.64 -Output | 0.00018501 | 0.0012686 | 0.0040495 | 4.5 | 0.11 -Modify | 0.0020952 | 0.0044899 | 0.0086782 | 4.0 | 0.39 -Other | | 0.005134 | | | 0.44 - -Nlocal: 1000 ave 1631 max 523 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 8693.75 ave 9752 max 8002 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 149995 ave 161500 max 141963 min -Histogram: 2 0 0 0 0 0 1 0 0 1 - -Total # of neighbors = 599979 -Ave neighs/atom = 149.995 -Neighbor list builds = 25 -Dangerous builds = 0 - -Total wall time: 0:00:06 diff --git a/examples/balance/log.27Nov18.balance.var.dynamic.g++.2 b/examples/balance/log.27Nov18.balance.var.dynamic.g++.2 deleted file mode 100644 index c488a725e0..0000000000 --- a/examples/balance/log.27Nov18.balance.var.dynamic.g++.2 +++ /dev/null @@ -1,257 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 2 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000491142 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -compute p all property/atom d_WEIGHT - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.000805378 seconds - iteration count = 10 - group weights: fast=0.8 slow=2.5 - storing weight in atom property d_WEIGHT - initial/final max load/proc = 2960 3120 - initial/final imbalance factor = 1.06093 1.11828 - x cuts: 0 0.449707 1 - y cuts: 0 1 - z cuts: 0 1 -variable lastweight atom c_p - -fix 0 all balance 50 1.0 shift x 10 1.0 weight var lastweight weight time 0.5 weight store WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.708 | 4.876 | 5.044 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 - 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 - 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 - 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 - 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 - 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 - 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 - 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 - 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 -Loop time of 5.01752 on 2 procs for 500 steps with 4000 atoms - -Performance: 43049.176 tau/day, 99.651 timesteps/s -98.5% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.4325 | 2.6317 | 3.8309 | 73.9 | 52.45 -Neigh | 0.72307 | 0.89995 | 1.0768 | 18.6 | 17.94 -Comm | 0.08143 | 1.4587 | 2.836 | 114.0 | 29.07 -Output | 0.00034356 | 0.00034773 | 0.00035191 | 0.0 | 0.01 -Modify | 0.015713 | 0.017661 | 0.01961 | 1.5 | 0.35 -Other | | 0.009141 | | | 0.18 - -Nlocal: 2000 ave 2500 max 1500 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10457 ave 11055 max 9859 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 298070 ave 483758 max 112381 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 596139 -Ave neighs/atom = 149.035 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 5.092 | 5.269 | 5.445 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 - 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 4738.2137 - 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 4738.2137 - 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 4738.2137 - 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 4738.2137 - 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 4738.2137 - 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 4738.2137 - 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 4738.2137 - 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 4738.2137 - 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 4738.2137 - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 -Loop time of 5.38962 on 2 procs for 500 steps with 4000 atoms - -Performance: 40077.052 tau/day, 92.771 timesteps/s -98.0% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.93627 | 2.5477 | 4.1591 | 101.0 | 47.27 -Neigh | 0.61458 | 0.87078 | 1.127 | 27.5 | 16.16 -Comm | 0.072418 | 1.9424 | 3.8124 | 134.2 | 36.04 -Output | 0.00034833 | 0.00035048 | 0.00035262 | 0.0 | 0.01 -Modify | 0.014652 | 0.018169 | 0.021687 | 2.6 | 0.34 -Other | | 0.01024 | | | 0.19 - -Nlocal: 2000 ave 2561 max 1439 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10257 ave 11109 max 9405 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 300836 ave 498670 max 103001 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 601671 -Ave neighs/atom = 150.418 -Neighbor list builds = 51 -Dangerous builds = 0 - -balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT - rebalancing time: 0.000744104 seconds - iteration count = 10 - group weights: fast=0.8 slow=2.5 - storing weight in atom property d_WEIGHT - initial/final max load/proc = 4428.8 2798.1 - initial/final imbalance factor = 1.58738 1.0029 - x cuts: 0 0.45485 1 - y cuts: 0 1 - z cuts: 0 1 - -fix 0 all balance 50 1.0 shift x 5 1.0 weight var lastweight weight neigh 0.5 weight store WEIGHT - -run 500 -Per MPI rank memory allocation (min/avg/max) = 5.098 | 5.464 | 5.83 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 - 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 4738.2137 - 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 4738.2137 - 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 4738.2137 - 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 4738.2137 - 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 4738.2137 - 1300 0.54430333 -6.260995 0 -5.4447442 -1.856351 4738.2137 - 1350 0.55097839 -6.2715909 0 -5.4453299 -1.9014337 4738.2137 - 1400 0.53858139 -6.2526781 0 -5.445008 -1.7965773 4738.2137 - 1450 0.54218439 -6.2574683 0 -5.444395 -1.7901189 4738.2137 - 1500 0.54200616 -6.2571433 0 -5.4443373 -1.8000345 4738.2137 -Loop time of 5.50675 on 2 procs for 500 steps with 4000 atoms - -Performance: 39224.584 tau/day, 90.798 timesteps/s -98.0% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.1091 | 2.6165 | 4.124 | 93.2 | 47.51 -Neigh | 0.49666 | 0.88338 | 1.2701 | 41.1 | 16.04 -Comm | 0.079062 | 1.9768 | 3.8745 | 135.0 | 35.90 -Output | 0.00032926 | 0.00041151 | 0.00049376 | 0.0 | 0.01 -Modify | 0.012776 | 0.018102 | 0.023428 | 4.0 | 0.33 -Other | | 0.01156 | | | 0.21 - -Nlocal: 2000 ave 3010 max 990 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10343 ave 12129 max 8557 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 302958 ave 519016 max 86901 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 605917 -Ave neighs/atom = 151.479 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 5.847 | 5.872 | 5.897 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1500 0.54200616 -6.2571433 0 -5.4443373 -1.8000345 4738.2137 - 1550 0.5371361 -6.250403 0 -5.4449003 -1.7647032 4738.2137 - 1600 0.54679571 -6.2646443 0 -5.4446558 -1.8115722 4738.2137 - 1650 0.53806587 -6.2519009 0 -5.4450039 -1.7409152 4738.2137 - 1700 0.53479436 -6.2469032 0 -5.4449122 -1.7162441 4738.2137 - 1750 0.53714071 -6.2506513 0 -5.4451416 -1.7340205 4738.2137 - 1800 0.52750533 -6.2358819 0 -5.4448217 -1.687537 4738.2137 - 1850 0.54585346 -6.262937 0 -5.4443615 -1.7758597 4738.2137 - 1900 0.53011247 -6.2387653 0 -5.4437954 -1.6382086 4738.2137 - 1950 0.54287683 -6.2583097 0 -5.4441981 -1.7367469 4738.2137 - 2000 0.52771288 -6.2349676 0 -5.4435962 -1.5593804 4738.2137 -Loop time of 5.80884 on 2 procs for 500 steps with 4000 atoms - -Performance: 37184.695 tau/day, 86.076 timesteps/s -97.7% CPU use with 2 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.71314 | 2.5435 | 4.3738 | 114.8 | 43.79 -Neigh | 0.39935 | 0.85806 | 1.3168 | 49.5 | 14.77 -Comm | 0.082629 | 2.3761 | 4.6695 | 148.8 | 40.90 -Output | 0.00034571 | 0.00044024 | 0.00053477 | 0.0 | 0.01 -Modify | 0.011643 | 0.018227 | 0.024811 | 4.9 | 0.31 -Other | | 0.01257 | | | 0.22 - -Nlocal: 2000 ave 3032 max 968 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 10266 ave 12245 max 8287 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Neighs: 303998 ave 525128 max 82868 min -Histogram: 1 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 607996 -Ave neighs/atom = 151.999 -Neighbor list builds = 51 -Dangerous builds = 0 -Total wall time: 0:00:21 diff --git a/examples/balance/log.27Nov18.balance.var.dynamic.g++.4 b/examples/balance/log.27Nov18.balance.var.dynamic.g++.4 deleted file mode 100644 index 66c1183481..0000000000 --- a/examples/balance/log.27Nov18.balance.var.dynamic.g++.4 +++ /dev/null @@ -1,257 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# 3d Lennard-Jones melt - -units lj -atom_style atomic -processors * 1 1 - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 -region box block 0 10 0 10 0 10 -create_box 3 box -Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 4 by 1 by 1 MPI processor grid -create_atoms 1 box -Created 4000 atoms - Time spent = 0.000424862 secs -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 - 1400 settings made for type - -velocity all create 1.0 87287 - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_coeff * 2 1.0 1.0 5.0 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes -fix p all property/atom d_WEIGHT -compute p all property/atom d_WEIGHT - -group fast type 1 -2600 atoms in group fast -group slow type 2 -1400 atoms in group slow -balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT -Neighbor list info ... - update every 2 steps, delay 4 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 5.3 - ghost atom cutoff = 5.3 - binsize = 2.65, bins = 7 7 7 - 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 - rebalancing time: 0.00115108 seconds - iteration count = 10 - group weights: fast=0.8 slow=2.5 - storing weight in atom property d_WEIGHT - initial/final max load/proc = 2160 1620 - initial/final imbalance factor = 1.54839 1.16129 - x cuts: 0 0.300049 0.449951 0.599854 1 - y cuts: 0 1 - z cuts: 0 1 -variable lastweight atom c_p - -fix 0 all balance 50 1.0 shift x 10 1.0 weight var lastweight weight time 0.5 weight store WEIGHT -variable maximb equal f_0[1] -variable iter equal f_0[2] -variable prev equal f_0[3] -variable final equal f_0 - -#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" - -fix 1 all nve - -#dump id all atom 50 dump.melt -#dump id all custom 50 dump.lammpstrj id type x y z c_p - -#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 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.132 | 4.192 | 4.274 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 - 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 - 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 - 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 - 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 - 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 - 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 - 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 - 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 - 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 -Loop time of 2.66424 on 4 procs for 500 steps with 4000 atoms - -Performance: 81073.650 tau/day, 187.670 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.1083 | 1.3909 | 1.7318 | 24.2 | 52.21 -Neigh | 0.19732 | 0.45425 | 0.7722 | 38.2 | 17.05 -Comm | 0.24921 | 0.79627 | 1.3351 | 60.3 | 29.89 -Output | 0.00041294 | 0.00065368 | 0.0011899 | 0.0 | 0.02 -Modify | 0.0071657 | 0.010935 | 0.015748 | 3.6 | 0.41 -Other | | 0.01124 | | | 0.42 - -Nlocal: 1000 ave 1870 max 299 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 8679.25 ave 10190 max 7374 min -Histogram: 1 1 0 0 0 0 1 0 0 1 -Neighs: 149308 ave 215125 max 81132 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 597231 -Ave neighs/atom = 149.308 -Neighbor list builds = 50 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.134 | 4.387 | 4.664 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 - 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 4738.2137 - 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 4738.2137 - 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 4738.2137 - 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 4738.2137 - 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 4738.2137 - 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 4738.2137 - 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 4738.2137 - 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 4738.2137 - 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 4738.2137 - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 -Loop time of 3.02509 on 4 procs for 500 steps with 4000 atoms - -Performance: 71402.836 tau/day, 165.284 timesteps/s -96.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.6808 | 1.3385 | 1.959 | 52.5 | 44.25 -Neigh | 0.13127 | 0.4678 | 0.86924 | 48.5 | 15.46 -Comm | 0.19735 | 1.1921 | 2.1903 | 85.9 | 39.41 -Output | 0.00045371 | 0.00090569 | 0.0013952 | 0.0 | 0.03 -Modify | 0.0062041 | 0.011167 | 0.01691 | 4.5 | 0.37 -Other | | 0.01462 | | | 0.48 - -Nlocal: 1000 ave 1935 max 262 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 8739.75 ave 10498 max 7333 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Neighs: 150170 ave 231608 max 72161 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 600678 -Ave neighs/atom = 150.169 -Neighbor list builds = 53 -Dangerous builds = 0 - -balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT - rebalancing time: 0.000575304 seconds - iteration count = 10 - group weights: fast=0.8 slow=2.5 - storing weight in atom property d_WEIGHT - initial/final max load/proc = 2318.1 1408.1 - initial/final imbalance factor = 1.66172 1.00939 - x cuts: 0 0.337054 0.454419 0.59556 1 - y cuts: 0 1 - z cuts: 0 1 - -fix 0 all balance 50 1.0 shift x 5 1.0 weight var lastweight weight neigh 0.5 weight store WEIGHT - -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.136 | 4.393 | 4.673 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 - 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 4738.2137 - 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 4738.2137 - 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 4738.2137 - 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 4738.2137 - 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 4738.2137 - 1300 0.54134321 -6.2590728 0 -5.447261 -1.917027 4738.2137 - 1350 0.53564389 -6.2501521 0 -5.4468871 -1.8642306 4738.2137 - 1400 0.53726925 -6.2518379 0 -5.4461355 -1.8544028 4738.2137 - 1450 0.54525929 -6.2632653 0 -5.4455808 -1.9072158 4738.2137 - 1500 0.54223341 -6.2591056 0 -5.4459588 -1.8866983 4738.2137 -Loop time of 3.07108 on 4 procs for 500 steps with 4000 atoms - -Performance: 70333.514 tau/day, 162.809 timesteps/s -96.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.77463 | 1.3897 | 2.1328 | 51.3 | 45.25 -Neigh | 0.13416 | 0.45546 | 0.80534 | 46.9 | 14.83 -Comm | 0.17763 | 1.2036 | 2.1448 | 83.6 | 39.19 -Output | 0.00039482 | 0.00067067 | 0.0013118 | 0.0 | 0.02 -Modify | 0.0058403 | 0.010695 | 0.015841 | 4.5 | 0.35 -Other | | 0.01099 | | | 0.36 - -Nlocal: 1000 ave 1955 max 199 min -Histogram: 2 0 0 0 0 0 0 0 1 1 -Nghost: 8729 ave 10472 max 7399 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Neighs: 150494 ave 251670 max 54664 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 601974 -Ave neighs/atom = 150.494 -Neighbor list builds = 51 -Dangerous builds = 0 -run 500 -Per MPI rank memory allocation (min/avg/max) = 4.136 | 4.393 | 4.673 Mbytes -Step Temp E_pair E_mol TotEng Press Volume - 1500 0.54223341 -6.2591056 0 -5.4459588 -1.8866983 4738.2137 - 1550 0.55327047 -6.2750129 0 -5.4453147 -1.9506601 4738.2137 - 1600 0.54419056 -6.2612631 0 -5.4451813 -1.8559469 4738.2137 - 1650 0.54710007 -6.2661977 0 -5.4457528 -1.8882828 4738.2137 - 1700 0.53665429 -6.250492 0 -5.4457118 -1.8067907 4738.2137 - 1750 0.54864943 -6.2681198 0 -5.4453514 -1.8662924 4738.2137 - 1800 0.54477002 -6.2615118 0 -5.4445611 -1.835304 4738.2137 - 1850 0.54143129 -6.2555621 0 -5.4436182 -1.8005839 4738.2137 - 1900 0.53994573 -6.254175 0 -5.4444588 -1.7770422 4738.2137 - 1950 0.54665379 -6.2640981 0 -5.4443224 -1.7946205 4738.2137 - 2000 0.54548501 -6.2623919 0 -5.4443689 -1.8063177 4738.2137 -Loop time of 3.48709 on 4 procs for 500 steps with 4000 atoms - -Performance: 61942.848 tau/day, 143.386 timesteps/s -96.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.42099 | 1.3571 | 2.3564 | 80.4 | 38.92 -Neigh | 0.083965 | 0.4942 | 0.96204 | 58.6 | 14.17 -Comm | 0.25895 | 1.6131 | 2.9631 | 106.2 | 46.26 -Output | 0.00042915 | 0.00068706 | 0.0012567 | 0.0 | 0.02 -Modify | 0.0051193 | 0.010964 | 0.017898 | 5.5 | 0.31 -Other | | 0.01109 | | | 0.32 - -Nlocal: 1000 ave 2036 max 127 min -Histogram: 2 0 0 0 0 0 0 0 1 1 -Nghost: 8722.75 ave 10448 max 7456 min -Histogram: 2 0 0 0 0 0 1 0 0 1 -Neighs: 151642 ave 269558 max 35372 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 606566 -Ave neighs/atom = 151.642 -Neighbor list builds = 56 -Dangerous builds = 0 -Total wall time: 0:00:12 diff --git a/examples/balance/log.3Nov23.balance.bond.fast.g++.2 b/examples/balance/log.3Nov23.balance.bond.fast.g++.2 new file mode 100644 index 0000000000..0feb065e47 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.bond.fast.g++.2 @@ -0,0 +1,255 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + 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 bond +boundary f f p + +lattice hex 0.85 +Lattice spacing in x,y,z = 1.1655347 2.0187654 1.1655347 +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 bond/types 1 extra/bond/per/atom 6 +Created orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + 2 by 1 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 + using lattice units in orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + create_atoms CPU = 0.001 seconds +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 + +bond_style harmonic +bond_coeff 1 10.0 1.2 + +# need to preserve 1-3, 1-4 pairwise interactions during hard collisions + +special_bonds lj/coul 0 1 1 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 0 = max # of 1-2 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds +create_bonds many all all 1 1.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) command create_bonds, occasional + attributes: full, newton on + pair build: full/bin + stencil: full/bin/2d + bin: standard + (2) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard +Added 1014 bonds, new total = 1014 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 6 = max # of 1-2 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + +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 +comm_modify cutoff 10.0 # because bonds stretch a long ways +fix 10 all balance 50 0.9 rcb + +#compute 1 all property/atom proc +#variable p atom (c_1%10)+1 +#dump 2 all custom 50 tmp.dump id v_p x y z + +#dump 3 all image 50 image.*.jpg v_p type bond atom 0.25 # 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 +timestep 0.001 + +run 10000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 = 10 + 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/newton + stencil: half/bin/2d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.157 | 5.167 | 5.178 Mbytes + Step Temp E_pair Press f_10[3] f_10 + 0 25.701528 -2.2032569 3.1039469 2 1.0193906 + 100 25.57187 -2.2902218 2.9990153 1.0193906 1.0027701 + 200 25.532511 -2.5273097 2.8286231 1.0304709 1.0027701 + 300 25.860246 -3.0674998 2.6725358 1.0138504 1.0027701 + 400 26.628011 -4.394738 2.6618897 1.0138504 1.0083102 + 500 27.627309 -6.2305012 2.6564278 1.0138504 1.0027701 + 600 28.881803 -8.2757766 2.8249236 1.0138504 1.0027701 + 700 29.941402 -9.9816088 2.9828232 1.0138504 1.0027701 + 800 31.118457 -12.199787 3.2044549 1.0249307 1.0083102 + 900 32.393498 -14.204491 2.9496587 1.0304709 1.0027701 + 1000 33.392657 -15.747519 3.1613807 1.0249307 1.0027701 + 1100 34.671769 -17.728904 3.019138 1.0193906 1.0083102 + 1200 35.632627 -19.846347 3.1061176 1.0193906 1.0083102 + 1300 36.77272 -21.156179 3.2353009 1.0415512 1.0027701 + 1400 38.241608 -22.744765 4.1163075 1.0193906 1.0027701 + 1500 40.072478 -25.139827 5.3032535 1.0304709 1.0027701 + 1600 40.665382 -25.901697 5.4330761 1.0304709 1.0027701 + 1700 40.957034 -26.28667 7.1881521 1.0360111 1.0027701 + 1800 41.536831 -27.393841 6.6814405 1.0470914 1.0027701 + 1900 41.952676 -28.123051 7.4683871 1.0360111 1.0027701 + 2000 42.201937 -28.685743 7.4624285 1.0304709 1.0027701 + 2100 41.509082 -27.909225 6.8666951 1.0304709 1.0083102 + 2200 40.794911 -27.085519 5.2599455 1.0415512 1.0027701 + 2300 38.74971 -25.146012 4.2936194 1.0360111 1.0083102 + 2400 38.418073 -24.593601 3.1418121 1.0470914 1.0027701 + 2500 36.932581 -23.407617 1.9397617 1.0304709 1.0027701 + 2600 35.979152 -23.066707 2.1676871 1.0415512 1.0027701 + 2700 35.848339 -22.556586 2.079815 1.0526316 1.0027701 + 2800 35.796197 -22.092919 2.6843042 1.0470914 1.0027701 + 2900 35.752758 -21.6603 2.4924275 1.0360111 1.0083102 + 3000 36.548479 -21.940002 2.8478206 1.0304709 1.0027701 + 3100 36.74473 -22.072441 3.7028736 1.0193906 1.0027701 + 3200 36.633543 -22.568923 3.7319143 1.0249307 1.0083102 + 3300 37.175051 -23.069268 3.5045201 1.0193906 1.0027701 + 3400 36.942892 -23.480254 3.1212991 1.0193906 1.0027701 + 3500 37.813564 -24.659011 3.6045332 1.0138504 1.0027701 + 3600 37.856787 -24.954353 4.3062815 1.0249307 1.0027701 + 3700 38.543481 -25.054481 4.7177629 1.0304709 1.0027701 + 3800 39.011196 -25.760455 4.9664492 1.0304709 1.0027701 + 3900 38.784228 -25.618896 4.944851 1.0304709 1.0027701 + 4000 39.348833 -26.615389 4.8191233 1.0304709 1.0027701 + 4100 39.242191 -26.754066 4.7960336 1.0249307 1.0027701 + 4200 38.989902 -26.741978 3.7980048 1.0415512 1.0027701 + 4300 38.726515 -25.916493 3.7176038 1.0304709 1.0027701 + 4400 38.720441 -25.549542 3.3956415 1.0470914 1.0027701 + 4500 38.22257 -25.122141 4.5771547 1.0304709 1.0083102 + 4600 38.217511 -25.390842 4.4896706 1.0360111 1.0027701 + 4700 39.121636 -26.227786 4.9811267 1.0415512 1.0083102 + 4800 39.306166 -26.700977 4.9963051 1.0249307 1.0027701 + 4900 38.909059 -25.799524 6.1957543 1.0692521 1.0027701 + 5000 38.778196 -26.491002 5.6393984 1.0526316 1.0027701 + 5100 38.587868 -27.253335 5.5460314 1.0415512 1.0027701 + 5200 38.686438 -27.40612 5.5186442 1.0249307 1.0027701 + 5300 37.986414 -26.049806 5.3696903 1.0304709 1.0027701 + 5400 37.111804 -26.019738 4.2114526 1.0415512 1.0083102 + 5500 36.62295 -25.592884 5.1349 1.0415512 1.0027701 + 5600 36.087987 -25.398454 4.4963434 1.0249307 1.0083102 + 5700 34.435409 -24.548062 3.5310124 1.0249307 1.0027701 + 5800 33.18681 -22.76355 3.2061242 1.0470914 1.0027701 + 5900 32.57428 -21.832024 3.2865828 1.0193906 1.0027701 + 6000 30.557555 -20.714816 4.2280358 1.0304709 1.0083102 + 6100 31.893092 -21.235479 4.5931729 1.0304709 1.0027701 + 6200 31.577761 -21.222778 4.1847871 1.0415512 1.0027701 + 6300 32.003743 -20.825156 5.6968257 1.0526316 1.0027701 + 6400 32.073012 -20.877815 7.3062956 1.0360111 1.0027701 + 6500 31.588306 -21.556202 5.7846536 1.0138504 1.0027701 + 6600 32.453985 -21.478064 4.8089249 1.0083102 1.0027701 + 6700 31.269576 -21.24005 4.0540095 1.0193906 1.0027701 + 6800 31.548438 -21.335039 3.767158 1.0138504 1.0027701 + 6900 31.249216 -20.689547 4.5435057 1.0083102 1.0027701 + 7000 31.72893 -20.373971 6.0204212 1.0249307 1.0027701 + 7100 30.888569 -19.028984 5.2458824 1.0027701 1.0027701 + 7200 30.747229 -19.579694 3.2582453 1.0138504 1.0083102 + 7300 28.339584 -19.225504 3.1235472 1.0193906 1.0027701 + 7400 26.754307 -18.557545 1.3860606 1.0193906 1.0083102 + 7500 26.559389 -17.395026 1.7206081 1.0138504 1.0083102 + 7600 26.227728 -16.755138 2.1148459 1.0193906 1.0027701 + 7700 26.361463 -15.711397 2.5458994 1.0138504 1.0027701 + 7800 26.081484 -16.032712 0.70050048 1.0138504 1.0027701 + 7900 24.660082 -15.079215 1.1999533 1.0138504 1.0027701 + 8000 24.448184 -14.668849 0.63886653 1.0138504 1.0083102 + 8100 24.198589 -15.157555 0.12256041 1.0027701 1.0027701 + 8200 24.764129 -14.876966 0.97060609 1.0249307 1.0083102 + 8300 25.33268 -14.891698 1.6089548 1.0083102 1.0027701 + 8400 24.992342 -14.652659 1.3317376 1.0138504 1.0027701 + 8500 25.115045 -14.683247 0.98361969 1.0138504 1.0027701 + 8600 24.954894 -14.451543 1.2228755 1.0083102 1.0027701 + 8700 24.51303 -14.159235 0.75345783 1.0249307 1.0083102 + 8800 22.697326 -13.254743 1.2913804 1.0138504 1.0027701 + 8900 22.868775 -13.677092 -0.048154854 1.0083102 1.0027701 + 9000 25.269332 -13.649225 1.0337367 1.0083102 1.0083102 + 9100 24.184813 -12.826606 1.1160895 1.0360111 1.0027701 + 9200 23.664589 -13.449013 0.031451624 1.0193906 1.0083102 + 9300 23.944566 -13.401803 0.20095909 1.0193906 1.0027701 + 9400 24.146696 -12.879011 0.89518549 1.0249307 1.0027701 + 9500 25.383214 -13.411768 0.95798595 1.0304709 1.0027701 + 9600 25.248933 -13.838658 0.45253554 1.0304709 1.0027701 + 9700 24.38613 -13.123006 1.5446061 1.0138504 1.0027701 + 9800 25.743921 -13.610838 1.2556191 1.0083102 1.0027701 + 9900 26.468479 -13.72971 2.3998562 1.0249307 1.0027701 + 10000 26.338099 -14.82183 1.5233934 1.0193906 1.0027701 +Loop time of 0.372607 on 2 procs for 10000 steps with 361 atoms + +Performance: 2318795.909 tau/day, 26837.916 timesteps/s, 9.688 Matom-step/s +96.0% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.13582 | 0.14029 | 0.14475 | 1.2 | 37.65 +Bond | 0.035027 | 0.035038 | 0.035049 | 0.0 | 9.40 +Neigh | 0.085828 | 0.08675 | 0.087673 | 0.3 | 23.28 +Comm | 0.05562 | 0.05851 | 0.061399 | 1.2 | 15.70 +Output | 0.0010102 | 0.0011746 | 0.0013391 | 0.5 | 0.32 +Modify | 0.029008 | 0.02926 | 0.029512 | 0.1 | 7.85 +Other | | 0.02159 | | | 5.79 + +Nlocal: 180.5 ave 181 max 180 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 166.5 ave 170 max 163 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 1628.5 ave 1652 max 1605 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 3257 +Ave neighs/atom = 9.0221607 +Ave special neighs/atom = 5.6177285 +Neighbor list builds = 1208 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.bond.fast.g++.4 b/examples/balance/log.3Nov23.balance.bond.fast.g++.4 new file mode 100644 index 0000000000..0f17f88ab6 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.bond.fast.g++.4 @@ -0,0 +1,255 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + 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 bond +boundary f f p + +lattice hex 0.85 +Lattice spacing in x,y,z = 1.1655347 2.0187654 1.1655347 +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 bond/types 1 extra/bond/per/atom 6 +Created orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + 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 + using lattice units in orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + create_atoms CPU = 0.001 seconds +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 + +bond_style harmonic +bond_coeff 1 10.0 1.2 + +# need to preserve 1-3, 1-4 pairwise interactions during hard collisions + +special_bonds lj/coul 0 1 1 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 0 = max # of 1-2 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds +create_bonds many all all 1 1.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) command create_bonds, occasional + attributes: full, newton on + pair build: full/bin + stencil: full/bin/2d + bin: standard + (2) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard +Added 1014 bonds, new total = 1014 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 6 = max # of 1-2 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + +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 +comm_modify cutoff 10.0 # because bonds stretch a long ways +fix 10 all balance 50 0.9 rcb + +#compute 1 all property/atom proc +#variable p atom (c_1%10)+1 +#dump 2 all custom 50 tmp.dump id v_p x y z + +#dump 3 all image 50 image.*.jpg v_p type bond atom 0.25 # 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 +timestep 0.001 + +run 10000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 = 10 + 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/newton + stencil: half/bin/2d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.123 | 5.142 | 5.176 Mbytes + Step Temp E_pair Press f_10[3] f_10 + 0 25.701528 -2.2032569 3.1039469 3.2354571 1.0526316 + 100 25.57187 -2.2902218 2.9990153 1.0526316 1.0193906 + 200 25.532511 -2.5273097 2.8286231 1.0526316 1.0083102 + 300 25.860246 -3.0674998 2.6725358 1.0415512 1.0083102 + 400 26.628011 -4.394738 2.6618897 1.0526316 1.0083102 + 500 27.627309 -6.2305012 2.6564278 1.0415512 1.0083102 + 600 28.881803 -8.2757766 2.8249236 1.0526316 1.0083102 + 700 29.941402 -9.9816088 2.9828232 1.0526316 1.0083102 + 800 31.118457 -12.199787 3.2044549 1.0304709 1.0083102 + 900 32.393498 -14.204491 2.9496587 1.0747922 1.0193906 + 1000 33.392657 -15.747519 3.1613807 1.0637119 1.0193906 + 1100 34.671769 -17.728904 3.019138 1.0526316 1.0193906 + 1200 35.632627 -19.846347 3.1061176 1.0637119 1.0193906 + 1300 36.77272 -21.156179 3.2353009 1.0415512 1.0193906 + 1400 38.241608 -22.744765 4.1163075 1.0637119 1.0083102 + 1500 40.072478 -25.139827 5.3032535 1.0415512 1.0193906 + 1600 40.665382 -25.901697 5.4330761 1.0858726 1.0083102 + 1700 40.957034 -26.28667 7.1881521 1.1080332 1.0083102 + 1800 41.536831 -27.393841 6.6814405 1.0969529 1.0193906 + 1900 41.952676 -28.123051 7.4683871 1.0858726 1.0193906 + 2000 42.201937 -28.685743 7.4624284 1.0747922 1.0083102 + 2100 41.509082 -27.909225 6.8666955 1.0969529 1.0083102 + 2200 40.794912 -27.085519 5.259945 1.0415512 1.0083102 + 2300 38.749709 -25.14601 4.2936222 1.0526316 1.0083102 + 2400 38.418065 -24.593596 3.1418049 1.1191136 1.0083102 + 2500 36.932588 -23.407613 1.9397982 1.0637119 1.0083102 + 2600 35.979181 -23.066748 2.1678902 1.0637119 1.0193906 + 2700 35.84858 -22.55645 2.0798013 1.0858726 1.0193906 + 2800 35.795795 -22.092149 2.6849882 1.0637119 1.0193906 + 2900 35.754958 -21.662138 2.4892921 1.0526316 1.0083102 + 3000 36.548644 -21.943203 2.8497192 1.0747922 1.0083102 + 3100 36.755531 -22.081384 3.6960187 1.0858726 1.0193906 + 3200 36.606921 -22.538438 3.7047874 1.0415512 1.0193906 + 3300 37.185396 -23.077004 3.4202006 1.0858726 1.0083102 + 3400 37.136687 -23.617745 2.9763794 1.0858726 1.0083102 + 3500 37.908279 -24.364631 3.5155218 1.0304709 1.0083102 + 3600 38.459203 -25.01024 4.3313693 1.0747922 1.0083102 + 3700 39.108683 -25.636756 4.4707992 1.0415512 1.0083102 + 3800 38.67059 -25.126486 5.3753987 1.0747922 1.0083102 + 3900 38.395639 -25.140269 5.1661495 1.0858726 1.0193906 + 4000 38.552057 -24.871721 5.0206769 1.0747922 1.0083102 + 4100 39.065683 -25.344035 4.4042913 1.0858726 1.0083102 + 4200 37.714294 -24.728278 5.1978439 1.0304709 1.0083102 + 4300 38.785555 -25.380643 3.7033369 1.0304709 1.0193906 + 4400 38.341445 -25.13442 3.4298833 1.1191136 1.0193906 + 4500 37.720522 -24.702087 3.4450752 1.0637119 1.0083102 + 4600 37.509806 -24.477444 3.6155741 1.0858726 1.0083102 + 4700 37.319957 -23.722654 4.7111338 1.0526316 1.0193906 + 4800 38.233154 -24.653472 4.25263 1.0637119 1.0083102 + 4900 37.309164 -24.21353 4.8513758 1.0637119 1.0193906 + 5000 37.559292 -24.720651 5.409312 1.0415512 1.0193906 + 5100 37.449783 -25.21538 6.0099692 1.0747922 1.0083102 + 5200 38.187982 -25.16709 6.1425844 1.0415512 1.0083102 + 5300 36.91668 -24.616017 4.7873357 1.0304709 1.0083102 + 5400 35.103465 -23.85158 5.1950262 1.0304709 1.0193906 + 5500 35.299351 -23.946174 4.8038223 1.0526316 1.0083102 + 5600 35.713482 -24.962908 3.5111314 1.0193906 1.0193906 + 5700 33.740794 -23.77699 4.5783011 1.0304709 1.0193906 + 5800 33.791635 -23.536627 3.1317306 1.0415512 1.0193906 + 5900 34.039769 -23.068008 4.0189755 1.0415512 1.0083102 + 6000 32.809103 -22.085195 4.0827943 1.0637119 1.0193906 + 6100 32.522642 -21.979287 4.1437901 1.0637119 1.0083102 + 6200 32.347924 -21.661359 4.1436759 1.0526316 1.0193906 + 6300 32.099974 -21.114688 5.5745084 1.0193906 1.0193906 + 6400 33.767704 -23.489786 4.1038662 1.0526316 1.0193906 + 6500 32.283906 -22.076822 7.2664805 1.0526316 1.0083102 + 6600 33.25146 -23.191973 6.01093 1.0526316 1.0083102 + 6700 31.7665 -22.1476 6.4256074 1.0747922 1.0193906 + 6800 30.775727 -21.513059 5.1709188 1.0304709 1.0083102 + 6900 30.964501 -21.153634 5.1077701 1.0193906 1.0193906 + 7000 31.292268 -20.800916 3.6047789 1.0193906 1.0193906 + 7100 31.460811 -20.280043 3.2369395 1.0193906 1.0083102 + 7200 30.871387 -19.340893 2.9615798 1.0193906 1.0083102 + 7300 28.983475 -18.709174 3.1686601 1.0304709 1.0083102 + 7400 28.032829 -18.200801 1.8738157 1.0304709 1.0193906 + 7500 28.088176 -17.117863 3.5604961 1.0304709 1.0083102 + 7600 27.456327 -17.011025 1.7822114 1.0526316 1.0304709 + 7700 26.483887 -16.024179 1.258431 1.0415512 1.0193906 + 7800 26.023393 -15.532176 1.3663841 1.0304709 1.0083102 + 7900 26.154386 -14.738286 1.5214339 1.0415512 1.0193906 + 8000 25.755121 -14.487715 1.0185064 1.0415512 1.0304709 + 8100 25.468927 -14.273205 1.3553057 1.0526316 1.0304709 + 8200 25.74216 -14.606852 0.13693979 1.0193906 1.0083102 + 8300 24.457219 -14.529941 -0.0032579349 1.0304709 1.0193906 + 8400 24.054076 -13.704387 0.80714443 1.0193906 1.0193906 + 8500 23.742098 -13.699968 0.41096573 1.0304709 1.0193906 + 8600 24.060806 -13.289555 0.22489663 1.0193906 1.0083102 + 8700 23.831533 -13.025052 -0.090244538 1.0304709 1.0193906 + 8800 23.823082 -13.407662 -0.28029605 1.0304709 1.0083102 + 8900 23.982182 -12.862338 0.50556065 1.0193906 1.0193906 + 9000 24.876045 -13.400416 1.1475671 1.0415512 1.0193906 + 9100 25.018155 -13.625286 0.74749825 1.0304709 1.0083102 + 9200 25.671195 -13.850993 0.88340554 1.0526316 1.0083102 + 9300 26.076502 -13.935292 1.2705214 1.0526316 1.0083102 + 9400 25.847786 -13.626034 1.5676611 1.0415512 1.0193906 + 9500 25.963986 -14.23672 1.4791684 1.0304709 1.0083102 + 9600 26.58066 -14.74703 1.3431841 1.0526316 1.0083102 + 9700 27.401448 -14.568412 2.4488742 1.0747922 1.0083102 + 9800 27.927894 -15.254362 2.8516414 1.0415512 1.0083102 + 9900 28.204891 -15.219892 3.0631109 1.0415512 1.0083102 + 10000 27.30902 -14.939134 2.8235246 1.0304709 1.0083102 +Loop time of 0.317224 on 4 procs for 10000 steps with 361 atoms + +Performance: 2723630.892 tau/day, 31523.506 timesteps/s, 11.380 Matom-step/s +89.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.066318 | 0.073612 | 0.081352 | 2.6 | 23.21 +Bond | 0.01886 | 0.020483 | 0.022893 | 1.1 | 6.46 +Neigh | 0.051128 | 0.052747 | 0.054345 | 0.5 | 16.63 +Comm | 0.093881 | 0.11329 | 0.13156 | 4.2 | 35.71 +Output | 0.0011573 | 0.0013205 | 0.0016444 | 0.5 | 0.42 +Modify | 0.025957 | 0.026647 | 0.027249 | 0.3 | 8.40 +Other | | 0.02913 | | | 9.18 + +Nlocal: 90.25 ave 91 max 89 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 260.75 ave 265 max 256 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 889.5 ave 1035 max 794 min +Histogram: 1 1 0 0 1 0 0 0 0 1 + +Total # of neighbors = 3558 +Ave neighs/atom = 9.8559557 +Ave special neighs/atom = 5.6177285 +Neighbor list builds = 1192 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.bond.slow.g++.2 b/examples/balance/log.3Nov23.balance.bond.slow.g++.2 new file mode 100644 index 0000000000..96ee2e2016 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.bond.slow.g++.2 @@ -0,0 +1,550 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + 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 + +# careful not to slam into wall too hard + +variable v index 0.3 +variable w index 0.08 + +units lj +dimension 2 +atom_style bond +boundary f f p + +lattice hex 0.85 +Lattice spacing in x,y,z = 1.1655347 2.0187654 1.1655347 +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 bond/types 1 extra/bond/per/atom 6 +Created orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + 2 by 1 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 + using lattice units in orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + create_atoms CPU = 0.001 seconds +mass 1 1.0 + +velocity all create 0.5 87287 loop geom +velocity all set $v $w 0 sum yes +velocity all set 0.3 $w 0 sum yes +velocity all set 0.3 0.08 0 sum yes + +pair_style lj/cut 2.5 +pair_coeff 1 1 10.0 1.0 2.5 + +bond_style harmonic +bond_coeff 1 10.0 1.2 + +create_bonds many all all 1 1.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) command create_bonds, occasional + attributes: full, newton on + pair build: full/bin + stencil: full/bin/2d + bin: standard + (2) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard +Added 1014 bonds, new total = 1014 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 6 = max # of 1-2 neighbors + 30 = max # of 1-3 neighbors + 180 = max # of 1-4 neighbors + 36 = max # of special neighbors + special bonds CPU = 0.002 seconds + +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)+1 +#dump 2 all custom 50 tmp.dump id v_p x y z + +#dump 3 all image 200 image.*.jpg v_p type bond atom 0.25 # 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 +timestep 0.001 + +run 40000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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/newton + stencil: half/bin/2d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 7.08 | 7.108 | 7.137 Mbytes + Step Temp E_pair Press f_10[3] f_10 + 0 0.57437856 0 0.26099453 2 1.0193906 + 100 0.36302846 0 0.17339851 1.0027701 1.0027701 + 200 0.19645077 0 0.087800915 1.0027701 1.0027701 + 300 0.32061117 0 0.11295723 1.0027701 1.0027701 + 400 0.32854136 0 0.11325585 1.0027701 1.0027701 + 500 0.29754179 0 0.10150632 1.0083102 1.0027701 + 600 0.37384867 0 0.11949784 1.0027701 1.0027701 + 700 0.33202319 0 0.092871339 1.0027701 1.0083102 + 800 0.28340637 0 0.065861565 1.0027701 1.0027701 + 900 0.36250157 0 0.085896287 1.0083102 1.0027701 + 1000 0.35402718 0 0.07519914 1.0027701 1.0083102 + 1100 0.31576357 0 0.050253636 1.0083102 1.0027701 + 1200 0.35727572 0 0.05153538 1.0027701 1.0027701 + 1300 0.34322607 0 0.036115722 1.0027701 1.0027701 + 1400 0.34007557 0 0.025378602 1.0027701 1.0083102 + 1500 0.39242551 0 0.033002212 1.0027701 1.0027701 + 1600 0.35679049 0 0.010101576 1.0027701 1.0027701 + 1700 0.31293001 0 -0.013791036 1.0027701 1.0027701 + 1800 0.34767962 0 -0.0065490806 1.0027701 1.0027701 + 1900 0.34721592 0 -0.010055082 1.0027701 1.0083102 + 2000 0.34074949 0 -0.020822697 1.0027701 1.0027701 + 2100 0.37195615 0 -0.024943134 1.0027701 1.0027701 + 2200 0.35367164 0 -0.047369336 1.0027701 1.0027701 + 2300 0.32088735 0 -0.069724381 1.0027701 1.0027701 + 2400 0.34291945 0 -0.065470223 1.0027701 1.0027701 + 2500 0.35204641 0 -0.062631879 1.0027701 1.0027701 + 2600 0.32762755 0 -0.075128824 1.0027701 1.0083102 + 2700 0.32042617 0 -0.086259498 1.0083102 1.0027701 + 2800 0.32747171 0 -0.094775765 1.0027701 1.0027701 + 2900 0.33544664 0 -0.10376048 1.0027701 1.0027701 + 3000 0.34015845 0 -0.1112134 1.0083102 1.0027701 + 3100 0.34425802 0 -0.11413914 1.0027701 1.0083102 + 3200 0.34158654 0 -0.1164643 1.0027701 1.0027701 + 3300 0.32525955 0 -0.12206636 1.0027701 1.0083102 + 3400 0.32183965 0 -0.12186353 1.0083102 1.0027701 + 3500 0.3323435 0 -0.11597815 1.0027701 1.0027701 + 3600 0.34124638 0 -0.11177335 1.0083102 1.0083102 + 3700 0.3404339 0 -0.11235575 1.0027701 1.0027701 + 3800 0.32736123 0 -0.11610108 1.0027701 1.0027701 + 3900 0.32897993 0 -0.11138151 1.0027701 1.0027701 + 4000 0.35111095 0 -0.096171644 1.0083102 1.0027701 + 4100 0.34682622 0 -0.087507472 1.0027701 1.0027701 + 4200 0.3307829 0 -0.079759555 1.0027701 1.0027701 + 4300 0.35057085 0 -0.055194355 1.0027701 1.0027701 + 4400 0.36389071 0 -0.02963313 1.0027701 1.0083102 + 4500 0.35694456 0 -0.013842583 1.0027701 1.0027701 + 4600 0.3472078 0 -0.0048118723 1.0083102 1.0027701 + 4700 0.31734514 0 -0.0032417081 1.0027701 1.0027701 + 4800 0.32419237 0 0.01409306 1.0027701 1.0027701 + 4900 0.36939799 0 0.045351789 1.0027701 1.0083102 + 5000 0.36998276 0 0.056830437 1.0027701 1.0027701 + 5100 0.33969031 0 0.051833536 1.0027701 1.0027701 + 5200 0.33910288 0 0.055544085 1.0027701 1.0027701 + 5300 0.34641009 0 0.0651487 1.0027701 1.0027701 + 5400 0.34469325 0 0.074538093 1.0027701 1.0027701 + 5500 0.34582041 0 0.084940845 1.0027701 1.0027701 + 5600 0.33471774 0 0.090102411 1.0027701 1.0083102 + 5700 0.32667873 0 0.09528948 1.0083102 1.0027701 + 5800 0.33762496 0 0.10545364 1.0027701 1.0027701 + 5900 0.33285742 0 0.10816506 1.0027701 1.0027701 + 6000 0.31920877 0 0.10547467 1.0027701 1.0027701 + 6100 0.31933081 0 0.10610684 1.0027701 1.0027701 + 6200 0.3152523 0 0.10651599 1.0083102 1.0083102 + 6300 0.32548074 0 0.11405234 1.0027701 1.0027701 + 6400 0.33851595 0 0.12389967 1.0027701 1.0027701 + 6500 0.32957825 0 0.12493331 1.0027701 1.0027701 + 6600 0.32319786 0 0.12404318 1.0027701 1.0027701 + 6700 0.3223738 0 0.12418108 1.0083102 1.0027701 + 6800 0.32390959 0 0.12576314 1.0027701 1.0027701 + 6900 0.34414413 0 0.1318456 1.0027701 1.0027701 + 7000 0.34508922 0 0.12669741 1.0027701 1.0083102 + 7100 0.31655025 0 0.10869109 1.0027701 1.0027701 + 7200 0.31997193 0 0.10305508 1.0027701 1.0027701 + 7300 0.33199085 0 0.10377052 1.0027701 1.0027701 + 7400 0.32146221 0 0.097589803 1.0027701 1.0027701 + 7500 0.33416843 0 0.096202638 1.0027701 1.0027701 + 7600 0.35297124 0 0.092441999 1.0027701 1.0027701 + 7700 0.34494663 0 0.075206332 1.0027701 1.0027701 + 7800 0.34010702 0 0.056336074 1.0083102 1.0027701 + 7900 0.343424 0 0.040946914 1.0027701 1.0027701 + 8000 0.33772245 0 0.025817271 1.0027701 1.0027701 + 8100 0.34463909 0 0.017237548 1.0083102 1.0083102 + 8200 0.36052034 0 0.010393623 1.0027701 1.0027701 + 8300 0.36083091 0 -0.0053933186 1.0027701 1.0027701 + 8400 0.35378067 0 -0.02600248 1.0027701 1.0027701 + 8500 0.35133887 0 -0.044211483 1.0027701 1.0027701 + 8600 0.34559937 0 -0.060861345 1.0027701 1.0027701 + 8700 0.33724119 0 -0.075776058 1.0027701 1.0027701 + 8800 0.33337192 0 -0.087098937 1.0027701 1.0027701 + 8900 0.33533081 0 -0.094631485 1.0027701 1.0083102 + 9000 0.34994303 0 -0.096758052 1.0083102 1.0083102 + 9100 0.34448227 0 -0.10330192 1.0083102 1.0083102 + 9200 0.32675792 0 -0.11000278 1.0083102 1.0083102 + 9300 0.33814013 0 -0.10358181 1.0027701 1.0027701 + 9400 0.34457419 0 -0.096896951 1.0027701 1.0027701 + 9500 0.33834959 0 -0.09547729 1.0027701 1.0027701 + 9600 0.33204582 0 -0.097694622 1.0027701 1.0027701 + 9700 0.31152805 0 -0.10637377 1.0083102 1.0027701 + 9800 0.31637311 0 -0.1053323 1.0027701 1.0027701 + 9900 0.33416162 0 -0.097857158 1.0027701 1.0083102 + 10000 0.33731767 0 -0.094656227 1.0027701 1.0027701 + 10100 0.34565093 0 -0.090199556 1.0083102 1.0083102 + 10200 0.34549074 0 -0.088914471 1.0083102 1.0027701 + 10300 0.33545625 0 -0.09066219 1.0027701 1.0083102 + 10400 0.33649703 0 -0.086437886 1.0027701 1.0027701 + 10500 0.34549848 0 -0.0767365 1.0027701 1.0027701 + 10600 0.34222917 0 -0.069368792 1.0027701 1.0027701 + 10700 0.34262469 0 -0.060550996 1.0027701 1.0027701 + 10800 0.34859129 0 -0.050692625 1.0027701 1.0027701 + 10900 0.34850448 0 -0.043627505 1.0027701 1.0027701 + 11000 0.34887257 0 -0.036859125 1.0027701 1.0083102 + 11100 0.34171718 0 -0.032690742 1.0083102 1.0027701 + 11200 0.329808 0 -0.02793377 1.0027701 1.0027701 + 11300 0.34490203 0 -0.010278222 1.0027701 1.0027701 + 11400 0.36226391 0 0.010141624 1.0027701 1.0083102 + 11500 0.35392138 0 0.021188939 1.0027701 1.0027701 + 11600 0.34378732 0 0.031423313 1.0083102 1.0083102 + 11700 0.33606385 0 0.043944374 1.0083102 1.0027701 + 11800 0.33212482 0 0.058629338 1.0027701 1.0027701 + 11900 0.34547313 0 0.078112959 1.0027701 1.0083102 + 12000 0.34840957 0 0.092356502 1.0083102 1.0027701 + 12100 0.34146853 0 0.10236492 1.0027701 1.0027701 + 12200 0.34591494 0 0.11620659 1.0027701 1.0027701 + 12300 0.33290894 0 0.12437245 1.0027701 1.0027701 + 12400 0.32423652 0 0.13191976 1.0083102 1.0083102 + 12500 0.33031748 0 0.13999363 1.0083102 1.0083102 + 12600 0.31927087 0 0.13776242 1.0083102 1.0027701 + 12700 0.30865965 0 0.13340787 1.0027701 1.0027701 + 12800 0.32542691 0 0.13690449 1.0027701 1.0083102 + 12900 0.32453244 0 0.13376127 1.0027701 1.0027701 + 13000 0.30974678 0 0.12749869 1.0027701 1.0027701 + 13100 0.32402285 0 0.13240572 1.0027701 1.0083102 + 13200 0.32896987 0 0.13257567 1.0083102 1.0027701 + 13300 0.32939197 0 0.12690791 1.0027701 1.0027701 + 13400 0.33966453 0 0.12036916 1.0027701 1.0027701 + 13500 0.33012942 0 0.10496127 1.0027701 1.0027701 + 13600 0.32363377 0 0.091763332 1.0083102 1.0083102 + 13700 0.33427955 0 0.087928243 1.0027701 1.0027701 + 13800 0.33457885 0 0.08191828 1.0027701 1.0027701 + 13900 0.33819924 0 0.074487337 1.0027701 1.0027701 + 14000 0.34611002 0 0.066256529 1.0083102 1.0027701 + 14100 0.33224254 0 0.052608223 1.0027701 1.0027701 + 14200 0.33796934 0 0.049677792 1.0027701 1.0027701 + 14300 0.36216731 0 0.055173039 1.0027701 1.0083102 + 14400 0.35140789 0 0.047322221 1.0027701 1.0027701 + 14500 0.34425046 0 0.036527245 1.0027701 1.0083102 + 14600 0.3604575 0 0.0294772 1.0083102 1.0083102 + 14700 0.3433878 0 0.0096774422 1.0083102 1.0083102 + 14800 0.3287069 0 -0.0079768782 1.0027701 1.0027701 + 14900 0.34978607 0 -0.01178453 1.0027701 1.0027701 + 15000 0.34749548 0 -0.023685074 1.0027701 1.0027701 + 15100 0.33474304 0 -0.040569945 1.0027701 1.0027701 + 15200 0.35036594 0 -0.048341599 1.0027701 1.0027701 + 15300 0.35686042 0 -0.058664905 1.0027701 1.0027701 + 15400 0.34041567 0 -0.074858327 1.0027701 1.0027701 + 15500 0.33397773 0 -0.083782088 1.0027701 1.0027701 + 15600 0.3420119 0 -0.084635487 1.0083102 1.0027701 + 15700 0.345487 0 -0.088137628 1.0027701 1.0027701 + 15800 0.33494392 0 -0.10083064 1.0027701 1.0027701 + 15900 0.32675175 0 -0.11620387 1.0027701 1.0027701 + 16000 0.33011636 0 -0.12713401 1.0027701 1.0027701 + 16100 0.32443118 0 -0.13685913 1.0027701 1.0027701 + 16200 0.31608392 0 -0.14164152 1.0027701 1.0083102 + 16300 0.33293965 0 -0.13335387 1.0027701 1.0027701 + 16400 0.34462807 0 -0.12471686 1.0027701 1.0027701 + 16500 0.33528082 0 -0.12211554 1.0027701 1.0027701 + 16600 0.34250121 0 -0.11228169 1.0027701 1.0027701 + 16700 0.35342336 0 -0.099226948 1.0027701 1.0027701 + 16800 0.33730938 0 -0.093581966 1.0027701 1.0027701 + 16900 0.3275761 0 -0.085163356 1.0027701 1.0027701 + 17000 0.33624873 0 -0.070896594 1.0083102 1.0027701 + 17100 0.34339177 0 -0.057731935 1.0027701 1.0027701 + 17200 0.34874414 0 -0.046575228 1.0027701 1.0027701 + 17300 0.33950911 0 -0.041862179 1.0027701 1.0027701 + 17400 0.33100286 0 -0.036618199 1.0027701 1.0027701 + 17500 0.34238095 0 -0.021681436 1.0027701 1.0027701 + 17600 0.35476614 0 -0.0032568304 1.0027701 1.0027701 + 17700 0.35452053 0 0.011863966 1.0027701 1.0027701 + 17800 0.35423934 0 0.024753043 1.0083102 1.0027701 + 17900 0.35001044 0 0.031647802 1.0083102 1.0083102 + 18000 0.32867773 0 0.030261102 1.0027701 1.0027701 + 18100 0.32730114 0 0.037627319 1.0027701 1.0027701 + 18200 0.35786038 0 0.057653258 1.0027701 1.0027701 + 18300 0.35598175 0 0.065533711 1.0027701 1.0027701 + 18400 0.33913202 0 0.066186406 1.0027701 1.0027701 + 18500 0.34449656 0 0.074575322 1.0027701 1.0027701 + 18600 0.34792041 0 0.083818651 1.0027701 1.0027701 + 18700 0.33910599 0 0.089751723 1.0027701 1.0027701 + 18800 0.33627789 0 0.097491916 1.0027701 1.0083102 + 18900 0.32937699 0 0.10350872 1.0083102 1.0027701 + 19000 0.30908702 0 0.10610099 1.0027701 1.0027701 + 19100 0.31033435 0 0.1168178 1.0027701 1.0027701 + 19200 0.32011336 0 0.12898885 1.0027701 1.0027701 + 19300 0.31851339 0 0.13398981 1.0027701 1.0027701 + 19400 0.33289985 0 0.1401039 1.0027701 1.0027701 + 19500 0.3387096 0 0.13971063 1.0027701 1.0027701 + 19600 0.31475734 0 0.12963499 1.0027701 1.0083102 + 19700 0.31971554 0 0.13189606 1.0083102 1.0083102 + 19800 0.33096999 0 0.13636987 1.0083102 1.0027701 + 19900 0.31601688 0 0.12889803 1.0027701 1.0027701 + 20000 0.32916469 0 0.12683491 1.0027701 1.0027701 + 20100 0.34355734 0 0.12251501 1.0027701 1.0027701 + 20200 0.33029721 0 0.10833335 1.0083102 1.0027701 + 20300 0.34079176 0 0.10305862 1.0027701 1.0027701 + 20400 0.35196716 0 0.098386494 1.0027701 1.0027701 + 20500 0.32687648 0 0.081202778 1.0083102 1.0027701 + 20600 0.33371658 0 0.074287923 1.0027701 1.0083102 + 20700 0.36625228 0 0.073768436 1.0083102 1.0027701 + 20800 0.35824217 0 0.054876358 1.0027701 1.0027701 + 20900 0.34861601 0 0.031603534 1.0027701 1.0027701 + 21000 0.35396698 0 0.013464537 1.0027701 1.0027701 + 21100 0.33592449 0 -0.0096173026 1.0027701 1.0027701 + 21200 0.327063 0 -0.025970252 1.0027701 1.0027701 + 21300 0.34418745 0 -0.030446162 1.0027701 1.0027701 + 21400 0.34181459 0 -0.039942616 1.0027701 1.0027701 + 21500 0.3315724 0 -0.05089285 1.0027701 1.0027701 + 21600 0.35674681 0 -0.047926263 1.0083102 1.0083102 + 21700 0.37320044 0 -0.047190592 1.0027701 1.0027701 + 21800 0.34626293 0 -0.063211549 1.0083102 1.0027701 + 21900 0.32941853 0 -0.078034339 1.0083102 1.0027701 + 22000 0.34102577 0 -0.083179211 1.0027701 1.0027701 + 22100 0.33614888 0 -0.091647522 1.0083102 1.0083102 + 22200 0.3339762 0 -0.09744915 1.0083102 1.0027701 + 22300 0.33867021 0 -0.10026932 1.0027701 1.0027701 + 22400 0.31974078 0 -0.10896583 1.0027701 1.0027701 + 22500 0.3261442 0 -0.10644809 1.0027701 1.0027701 + 22600 0.35128159 0 -0.097711062 1.0027701 1.0027701 + 22700 0.33133845 0 -0.10656571 1.0027701 1.0027701 + 22800 0.31730555 0 -0.11420891 1.0027701 1.0027701 + 22900 0.34720941 0 -0.10586647 1.0083102 1.0027701 + 23000 0.34418922 0 -0.10745826 1.0027701 1.0027701 + 23100 0.32342851 0 -0.11384766 1.0027701 1.0027701 + 23200 0.3408144 0 -0.10631064 1.0027701 1.0027701 + 23300 0.33006722 0 -0.1070084 1.0027701 1.0027701 + 23400 0.31578528 0 -0.10711608 1.0027701 1.0027701 + 23500 0.34908788 0 -0.088441889 1.0027701 1.0027701 + 23600 0.35801835 0 -0.075953983 1.0027701 1.0027701 + 23700 0.33573037 0 -0.072357745 1.0027701 1.0083102 + 23800 0.34435835 0 -0.055470682 1.0083102 1.0027701 + 23900 0.35307683 0 -0.036076205 1.0027701 1.0027701 + 24000 0.35184599 0 -0.020939815 1.0027701 1.0027701 + 24100 0.35687079 0 -0.0063601457 1.0027701 1.0027701 + 24200 0.33612385 0 -0.0014613923 1.0027701 1.0027701 + 24300 0.32234106 0 0.006750452 1.0027701 1.0027701 + 24400 0.34852008 0 0.029170079 1.0027701 1.0027701 + 24500 0.35224811 0 0.043783151 1.0027701 1.0027701 + 24600 0.34160459 0 0.05294313 1.0027701 1.0027701 + 24700 0.35616752 0 0.069291509 1.0027701 1.0027701 + 24800 0.34984726 0 0.076650029 1.0027701 1.0027701 + 24900 0.33337969 0 0.080083735 1.0027701 1.0027701 + 25000 0.34846751 0 0.095559187 1.0027701 1.0027701 + 25100 0.34495541 0 0.10558042 1.0027701 1.0083102 + 25200 0.32630088 0 0.10897783 1.0083102 1.0027701 + 25300 0.33651146 0 0.11888202 1.0027701 1.0027701 + 25400 0.32194445 0 0.11826793 1.0027701 1.0027701 + 25500 0.30295352 0 0.11641357 1.0027701 1.0027701 + 25600 0.33485387 0 0.13204258 1.0027701 1.0027701 + 25700 0.34407287 0 0.13738986 1.0027701 1.0027701 + 25800 0.32421817 0 0.12822703 1.0083102 1.0083102 + 25900 0.32463356 0 0.12403448 1.0027701 1.0027701 + 26000 0.32431468 0 0.12087994 1.0027701 1.0083102 + 26100 0.31886825 0 0.11741621 1.0083102 1.0027701 + 26200 0.32607823 0 0.1180517 1.0083102 1.0027701 + 26300 0.32511255 0 0.11479741 1.0027701 1.0083102 + 26400 0.32336124 0 0.11055002 1.0027701 1.0027701 + 26500 0.33026321 0 0.10934888 1.0027701 1.0027701 + 26600 0.32604491 0 0.10480442 1.0027701 1.0027701 + 26700 0.33764955 0 0.10458959 1.0027701 1.0027701 + 26800 0.35202544 0 0.10295075 1.0027701 1.0027701 + 26900 0.33382028 0 0.088148483 1.0027701 1.0027701 + 27000 0.33252808 0 0.078275659 1.0027701 1.0027701 + 27100 0.35433636 0 0.076729989 1.0083102 1.0027701 + 27200 0.34824881 0 0.065720375 1.0083102 1.0027701 + 27300 0.33525644 0 0.051611147 1.0027701 1.0027701 + 27400 0.34685762 0 0.045597284 1.0027701 1.0027701 + 27500 0.35181712 0 0.037076034 1.0027701 1.0027701 + 27600 0.34541685 0 0.022287411 1.0027701 1.0027701 + 27700 0.34559823 0 0.0056480168 1.0027701 1.0083102 + 27800 0.33646375 0 -0.015571541 1.0027701 1.0027701 + 27900 0.33681932 0 -0.031777883 1.0083102 1.0027701 + 28000 0.35093514 0 -0.041519343 1.0027701 1.0027701 + 28100 0.34345697 0 -0.057623438 1.0027701 1.0027701 + 28200 0.33655073 0 -0.072228985 1.0027701 1.0027701 + 28300 0.34428448 0 -0.080015243 1.0027701 1.0027701 + 28400 0.34089922 0 -0.089955339 1.0027701 1.0027701 + 28500 0.34522966 0 -0.096529413 1.0083102 1.0027701 + 28600 0.34713819 0 -0.10221712 1.0083102 1.0083102 + 28700 0.33692049 0 -0.10868625 1.0027701 1.0027701 + 28800 0.34522852 0 -0.10679446 1.0027701 1.0083102 + 28900 0.33956477 0 -0.1105454 1.0083102 1.0027701 + 29000 0.30989301 0 -0.12332622 1.0083102 1.0083102 + 29100 0.32373738 0 -0.11985261 1.0027701 1.0027701 + 29200 0.35156812 0 -0.10956099 1.0027701 1.0027701 + 29300 0.33938829 0 -0.11259535 1.0027701 1.0027701 + 29400 0.32401178 0 -0.11664978 1.0083102 1.0083102 + 29500 0.32320492 0 -0.11336533 1.0027701 1.0027701 + 29600 0.32928877 0 -0.10404547 1.0027701 1.0027701 + 29700 0.3436911 0 -0.089845529 1.0027701 1.0027701 + 29800 0.34194019 0 -0.081660797 1.0027701 1.0027701 + 29900 0.32909826 0 -0.07807778 1.0027701 1.0083102 + 30000 0.34092826 0 -0.06626489 1.0027701 1.0027701 + 30100 0.34763086 0 -0.055589635 1.0027701 1.0027701 + 30200 0.34479984 0 -0.047402672 1.0083102 1.0083102 + 30300 0.34783224 0 -0.036371931 1.0083102 1.0027701 + 30400 0.34525176 0 -0.027246663 1.0027701 1.0027701 + 30500 0.35266364 0 -0.016275033 1.0027701 1.0027701 + 30600 0.35792479 0 -0.007158119 1.0083102 1.0083102 + 30700 0.33607567 0 -0.0064391529 1.0027701 1.0027701 + 30800 0.34311607 0 0.005382948 1.0083102 1.0027701 + 30900 0.37218574 0 0.025004945 1.0027701 1.0027701 + 31000 0.35196541 0 0.027902483 1.0027701 1.0027701 + 31100 0.33533693 0 0.032349025 1.0083102 1.0083102 + 31200 0.34382193 0 0.046631454 1.0083102 1.0027701 + 31300 0.32886237 0 0.05405956 1.0027701 1.0027701 + 31400 0.32738754 0 0.066295734 1.0027701 1.0027701 + 31500 0.35367575 0 0.087140904 1.0027701 1.0027701 + 31600 0.33756811 0 0.092135887 1.0027701 1.0027701 + 31700 0.31701631 0 0.094576339 1.0027701 1.0027701 + 31800 0.34217612 0 0.11195071 1.0027701 1.0027701 + 31900 0.33725187 0 0.11924087 1.0027701 1.0083102 + 32000 0.30966055 0 0.1199329 1.0027701 1.0027701 + 32100 0.32771084 0 0.13627552 1.0027701 1.0027701 + 32200 0.3400914 0 0.14816015 1.0027701 1.0027701 + 32300 0.32210513 0 0.14569378 1.0027701 1.0027701 + 32400 0.32096229 0 0.14515284 1.0027701 1.0083102 + 32500 0.31781969 0 0.14124479 1.0083102 1.0083102 + 32600 0.3146986 0 0.13616644 1.0083102 1.0083102 + 32700 0.33526021 0 0.13913538 1.0027701 1.0027701 + 32800 0.33561156 0 0.13481353 1.0027701 1.0027701 + 32900 0.31418235 0 0.12161202 1.0027701 1.0027701 + 33000 0.31952054 0 0.11558871 1.0083102 1.0083102 + 33100 0.33437451 0 0.11011602 1.0083102 1.0083102 + 33200 0.33381704 0 0.096535424 1.0027701 1.0027701 + 33300 0.33786259 0 0.08382113 1.0027701 1.0027701 + 33400 0.34590937 0 0.073879824 1.0027701 1.0027701 + 33500 0.33844204 0 0.060854835 1.0083102 1.0083102 + 33600 0.33845544 0 0.052237152 1.0027701 1.0027701 + 33700 0.35419837 0 0.048922784 1.0027701 1.0027701 + 33800 0.3485977 0 0.036886422 1.0027701 1.0083102 + 33900 0.33816081 0 0.021599335 1.0083102 1.0083102 + 34000 0.34241389 0 0.010436074 1.0083102 1.0027701 + 34100 0.33934235 0 -0.002581075 1.0027701 1.0083102 + 34200 0.34579204 0 -0.011373729 1.0027701 1.0027701 + 34300 0.35778336 0 -0.018118327 1.0083102 1.0083102 + 34400 0.35522938 0 -0.030427967 1.0027701 1.0027701 + 34500 0.34820709 0 -0.042562699 1.0027701 1.0027701 + 34600 0.35026547 0 -0.047488326 1.0027701 1.0027701 + 34700 0.35221351 0 -0.050832178 1.0027701 1.0027701 + 34800 0.33043515 0 -0.062718859 1.0027701 1.0027701 + 34900 0.32750488 0 -0.068765033 1.0027701 1.0027701 + 35000 0.35323787 0 -0.067326627 1.0027701 1.0027701 + 35100 0.34732304 0 -0.080326407 1.0083102 1.0027701 + 35200 0.3248439 0 -0.099312427 1.0027701 1.0027701 + 35300 0.32854244 0 -0.10509437 1.0027701 1.0027701 + 35400 0.33511384 0 -0.10605662 1.0027701 1.0027701 + 35500 0.33532722 0 -0.10993967 1.0027701 1.0027701 + 35600 0.33523312 0 -0.11653983 1.0027701 1.0083102 + 35700 0.32405906 0 -0.12564005 1.0083102 1.0083102 + 35800 0.32914902 0 -0.12476137 1.0083102 1.0027701 + 35900 0.34093492 0 -0.11716996 1.0027701 1.0027701 + 36000 0.33557882 0 -0.11216382 1.0027701 1.0027701 + 36100 0.3342841 0 -0.10445781 1.0027701 1.0027701 + 36200 0.33557348 0 -0.0983036 1.0027701 1.0027701 + 36300 0.33052024 0 -0.097594107 1.0027701 1.0027701 + 36400 0.34570912 0 -0.089010349 1.0083102 1.0083102 + 36500 0.35735704 0 -0.078483059 1.0083102 1.0027701 + 36600 0.33199022 0 -0.079452064 1.0083102 1.0083102 + 36700 0.3191692 0 -0.074378584 1.0083102 1.0027701 + 36800 0.34473865 0 -0.052467819 1.0027701 1.0027701 + 36900 0.35012922 0 -0.034841373 1.0027701 1.0027701 + 37000 0.34543508 0 -0.019956141 1.0083102 1.0083102 + 37100 0.36637971 0 0.0034123108 1.0027701 1.0027701 + 37200 0.36008557 0 0.016667331 1.0083102 1.0083102 + 37300 0.34027931 0 0.024177377 1.0083102 1.0027701 + 37400 0.35097853 0 0.041160628 1.0027701 1.0027701 + 37500 0.35024671 0 0.052433671 1.0027701 1.0027701 + 37600 0.33483801 0 0.05655083 1.0027701 1.0027701 + 37700 0.3402098 0 0.067222448 1.0083102 1.0083102 + 37800 0.33859985 0 0.075720813 1.0083102 1.0083102 + 37900 0.32323549 0 0.079678841 1.0083102 1.0027701 + 38000 0.33701532 0 0.092666162 1.0027701 1.0027701 + 38100 0.3424632 0 0.10094611 1.0027701 1.0027701 + 38200 0.32167421 0 0.099350179 1.0027701 1.0083102 + 38300 0.32540911 0 0.10664752 1.0027701 1.0027701 + 38400 0.33574781 0 0.11614552 1.0027701 1.0027701 + 38500 0.33125908 0 0.11940265 1.0027701 1.0027701 + 38600 0.33885801 0 0.12616083 1.0027701 1.0027701 + 38700 0.33813506 0 0.1298943 1.0027701 1.0027701 + 38800 0.31888318 0 0.1260135 1.0027701 1.0027701 + 38900 0.31006429 0 0.12450345 1.0027701 1.0027701 + 39000 0.31407783 0 0.12693078 1.0083102 1.0083102 + 39100 0.33078021 0 0.13111094 1.0027701 1.0083102 + 39200 0.34311375 0 0.12937945 1.0027701 1.0083102 + 39300 0.33594172 0 0.11839992 1.0027701 1.0027701 + 39400 0.32763204 0 0.10898509 1.0083102 1.0083102 + 39500 0.33114946 0 0.10782558 1.0083102 1.0027701 + 39600 0.32905328 0 0.10631627 1.0027701 1.0027701 + 39700 0.32416114 0 0.10142386 1.0083102 1.0027701 + 39800 0.32709132 0 0.096046083 1.0027701 1.0027701 + 39900 0.32910896 0 0.087876394 1.0027701 1.0027701 + 40000 0.33462908 0 0.07810396 1.0027701 1.0027701 +Loop time of 0.503795 on 2 procs for 40000 steps with 361 atoms + +Performance: 6859934.469 tau/day, 79397.390 timesteps/s, 28.662 Matom-step/s +95.1% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.016365 | 0.01652 | 0.016675 | 0.1 | 3.28 +Bond | 0.15864 | 0.16196 | 0.16529 | 0.8 | 32.15 +Neigh | 0.05169 | 0.051701 | 0.051711 | 0.0 | 10.26 +Comm | 0.076385 | 0.091917 | 0.10745 | 5.1 | 18.24 +Output | 0.0032235 | 0.0038308 | 0.004438 | 1.0 | 0.76 +Modify | 0.11757 | 0.11844 | 0.1193 | 0.3 | 23.51 +Other | | 0.05943 | | | 11.80 + +Nlocal: 180.5 ave 181 max 180 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 53.5 ave 54 max 53 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0 +Ave special neighs/atom = 31.024931 +Neighbor list builds = 800 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.bond.slow.g++.4 b/examples/balance/log.3Nov23.balance.bond.slow.g++.4 new file mode 100644 index 0000000000..b493474ace --- /dev/null +++ b/examples/balance/log.3Nov23.balance.bond.slow.g++.4 @@ -0,0 +1,550 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + 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 + +# careful not to slam into wall too hard + +variable v index 0.3 +variable w index 0.08 + +units lj +dimension 2 +atom_style bond +boundary f f p + +lattice hex 0.85 +Lattice spacing in x,y,z = 1.1655347 2.0187654 1.1655347 +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 bond/types 1 extra/bond/per/atom 6 +Created orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + 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 + using lattice units in orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + create_atoms CPU = 0.001 seconds +mass 1 1.0 + +velocity all create 0.5 87287 loop geom +velocity all set $v $w 0 sum yes +velocity all set 0.3 $w 0 sum yes +velocity all set 0.3 0.08 0 sum yes + +pair_style lj/cut 2.5 +pair_coeff 1 1 10.0 1.0 2.5 + +bond_style harmonic +bond_coeff 1 10.0 1.2 + +create_bonds many all all 1 1.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) command create_bonds, occasional + attributes: full, newton on + pair build: full/bin + stencil: full/bin/2d + bin: standard + (2) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard +Added 1014 bonds, new total = 1014 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 6 = max # of 1-2 neighbors + 30 = max # of 1-3 neighbors + 180 = max # of 1-4 neighbors + 36 = max # of special neighbors + special bonds CPU = 0.001 seconds + +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)+1 +#dump 2 all custom 50 tmp.dump id v_p x y z + +#dump 3 all image 200 image.*.jpg v_p type bond atom 0.25 # 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 +timestep 0.001 + +run 40000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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/newton + stencil: half/bin/2d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 7.02 | 7.05 | 7.102 Mbytes + Step Temp E_pair Press f_10[3] f_10 + 0 0.57437856 0 0.26099453 3.2354571 1.0526316 + 100 0.36302846 0 0.17339851 1.0083102 1.0193906 + 200 0.19645077 0 0.087800915 1.0083102 1.0083102 + 300 0.32061117 0 0.11295723 1.0193906 1.0193906 + 400 0.32854136 0 0.11325585 1.0083102 1.0083102 + 500 0.29754179 0 0.10150632 1.0193906 1.0083102 + 600 0.37384867 0 0.11949784 1.0083102 1.0083102 + 700 0.33202319 0 0.092871339 1.0083102 1.0193906 + 800 0.28340637 0 0.065861565 1.0083102 1.0083102 + 900 0.36250157 0 0.085896287 1.0193906 1.0083102 + 1000 0.35402718 0 0.07519914 1.0083102 1.0193906 + 1100 0.31576357 0 0.050253636 1.0193906 1.0083102 + 1200 0.35727572 0 0.05153538 1.0083102 1.0083102 + 1300 0.34322607 0 0.036115722 1.0083102 1.0083102 + 1400 0.34007557 0 0.025378602 1.0083102 1.0193906 + 1500 0.39242551 0 0.033002212 1.0083102 1.0193906 + 1600 0.35679049 0 0.010101576 1.0083102 1.0193906 + 1700 0.31293001 0 -0.013791036 1.0193906 1.0193906 + 1800 0.34767962 0 -0.0065490806 1.0193906 1.0193906 + 1900 0.34721592 0 -0.010055082 1.0193906 1.0083102 + 2000 0.34074949 0 -0.020822697 1.0083102 1.0083102 + 2100 0.37195615 0 -0.024943134 1.0193906 1.0083102 + 2200 0.35367164 0 -0.047369336 1.0193906 1.0083102 + 2300 0.32088735 0 -0.069724381 1.0083102 1.0083102 + 2400 0.34291945 0 -0.065470223 1.0193906 1.0083102 + 2500 0.35204641 0 -0.062631879 1.0083102 1.0083102 + 2600 0.32762755 0 -0.075128824 1.0083102 1.0083102 + 2700 0.32042617 0 -0.086259498 1.0193906 1.0083102 + 2800 0.32747171 0 -0.094775765 1.0083102 1.0083102 + 2900 0.33544664 0 -0.10376048 1.0193906 1.0083102 + 3000 0.34015845 0 -0.1112134 1.0193906 1.0083102 + 3100 0.34425802 0 -0.11413914 1.0083102 1.0193906 + 3200 0.34158654 0 -0.1164643 1.0083102 1.0083102 + 3300 0.32525955 0 -0.12206636 1.0083102 1.0193906 + 3400 0.32183965 0 -0.12186353 1.0193906 1.0083102 + 3500 0.3323435 0 -0.11597815 1.0083102 1.0083102 + 3600 0.34124638 0 -0.11177335 1.0193906 1.0193906 + 3700 0.3404339 0 -0.11235575 1.0083102 1.0193906 + 3800 0.32736123 0 -0.11610108 1.0083102 1.0193906 + 3900 0.32897993 0 -0.11138151 1.0193906 1.0083102 + 4000 0.35111095 0 -0.096171644 1.0193906 1.0193906 + 4100 0.34682622 0 -0.087507472 1.0193906 1.0193906 + 4200 0.3307829 0 -0.079759555 1.0193906 1.0083102 + 4300 0.35057085 0 -0.055194355 1.0193906 1.0083102 + 4400 0.36389071 0 -0.02963313 1.0193906 1.0193906 + 4500 0.35694456 0 -0.013842583 1.0193906 1.0193906 + 4600 0.3472078 0 -0.0048118723 1.0083102 1.0083102 + 4700 0.31734514 0 -0.0032417081 1.0083102 1.0083102 + 4800 0.32419237 0 0.01409306 1.0083102 1.0193906 + 4900 0.36939799 0 0.045351789 1.0193906 1.0193906 + 5000 0.36998276 0 0.056830437 1.0083102 1.0083102 + 5100 0.33969031 0 0.051833536 1.0083102 1.0083102 + 5200 0.33910288 0 0.055544085 1.0083102 1.0083102 + 5300 0.34641009 0 0.0651487 1.0083102 1.0083102 + 5400 0.34469325 0 0.074538093 1.0083102 1.0083102 + 5500 0.34582041 0 0.084940845 1.0193906 1.0083102 + 5600 0.33471774 0 0.090102411 1.0083102 1.0193906 + 5700 0.32667873 0 0.09528948 1.0083102 1.0193906 + 5800 0.33762496 0 0.10545364 1.0083102 1.0083102 + 5900 0.33285742 0 0.10816506 1.0083102 1.0083102 + 6000 0.31920877 0 0.10547467 1.0083102 1.0193906 + 6100 0.31933081 0 0.10610684 1.0083102 1.0193906 + 6200 0.3152523 0 0.10651599 1.0193906 1.0083102 + 6300 0.32548074 0 0.11405234 1.0083102 1.0193906 + 6400 0.33851595 0 0.12389967 1.0193906 1.0193906 + 6500 0.32957825 0 0.12493331 1.0083102 1.0083102 + 6600 0.32319786 0 0.12404318 1.0083102 1.0083102 + 6700 0.3223738 0 0.12418108 1.0304709 1.0304709 + 6800 0.32390959 0 0.12576314 1.0193906 1.0083102 + 6900 0.34414413 0 0.1318456 1.0193906 1.0193906 + 7000 0.34508922 0 0.12669741 1.0083102 1.0083102 + 7100 0.31655025 0 0.10869109 1.0083102 1.0193906 + 7200 0.31997193 0 0.10305508 1.0083102 1.0193906 + 7300 0.33199085 0 0.10377052 1.0083102 1.0083102 + 7400 0.32146221 0 0.097589803 1.0193906 1.0193906 + 7500 0.33416843 0 0.096202638 1.0083102 1.0193906 + 7600 0.35297124 0 0.092441999 1.0193906 1.0083102 + 7700 0.34494663 0 0.075206332 1.0083102 1.0193906 + 7800 0.34010702 0 0.056336074 1.0193906 1.0083102 + 7900 0.343424 0 0.040946914 1.0193906 1.0193906 + 8000 0.33772245 0 0.025817271 1.0083102 1.0083102 + 8100 0.34463909 0 0.017237548 1.0193906 1.0304709 + 8200 0.36052034 0 0.010393623 1.0083102 1.0083102 + 8300 0.36083091 0 -0.0053933186 1.0083102 1.0083102 + 8400 0.35378067 0 -0.02600248 1.0083102 1.0083102 + 8500 0.35133887 0 -0.044211483 1.0083102 1.0083102 + 8600 0.34559937 0 -0.060861345 1.0083102 1.0083102 + 8700 0.33724119 0 -0.075776058 1.0083102 1.0193906 + 8800 0.33337192 0 -0.087098937 1.0193906 1.0193906 + 8900 0.33533081 0 -0.094631485 1.0193906 1.0304709 + 9000 0.34994303 0 -0.096758052 1.0193906 1.0083102 + 9100 0.34448227 0 -0.10330192 1.0193906 1.0193906 + 9200 0.32675792 0 -0.11000278 1.0193906 1.0193906 + 9300 0.33814013 0 -0.10358181 1.0083102 1.0193906 + 9400 0.34457419 0 -0.096896951 1.0083102 1.0083102 + 9500 0.33834959 0 -0.09547729 1.0083102 1.0083102 + 9600 0.33204582 0 -0.097694622 1.0193906 1.0083102 + 9700 0.31152805 0 -0.10637377 1.0193906 1.0083102 + 9800 0.31637311 0 -0.1053323 1.0083102 1.0083102 + 9900 0.33416162 0 -0.097857158 1.0083102 1.0083102 + 10000 0.33731767 0 -0.094656227 1.0083102 1.0083102 + 10100 0.34565093 0 -0.090199556 1.0193906 1.0193906 + 10200 0.34549074 0 -0.088914471 1.0193906 1.0083102 + 10300 0.33545625 0 -0.09066219 1.0083102 1.0083102 + 10400 0.33649703 0 -0.086437886 1.0083102 1.0083102 + 10500 0.34549848 0 -0.0767365 1.0193906 1.0193906 + 10600 0.34222917 0 -0.069368792 1.0083102 1.0083102 + 10700 0.34262469 0 -0.060550996 1.0193906 1.0083102 + 10800 0.34859129 0 -0.050692625 1.0193906 1.0193906 + 10900 0.34850448 0 -0.043627505 1.0193906 1.0193906 + 11000 0.34887257 0 -0.036859125 1.0193906 1.0193906 + 11100 0.34171718 0 -0.032690742 1.0193906 1.0083102 + 11200 0.329808 0 -0.02793377 1.0083102 1.0083102 + 11300 0.34490203 0 -0.010278222 1.0083102 1.0083102 + 11400 0.36226391 0 0.010141624 1.0193906 1.0193906 + 11500 0.35392138 0 0.021188939 1.0193906 1.0193906 + 11600 0.34378732 0 0.031423313 1.0304709 1.0193906 + 11700 0.33606385 0 0.043944374 1.0193906 1.0193906 + 11800 0.33212482 0 0.058629338 1.0193906 1.0193906 + 11900 0.34547313 0 0.078112959 1.0193906 1.0083102 + 12000 0.34840957 0 0.092356502 1.0083102 1.0083102 + 12100 0.34146853 0 0.10236492 1.0193906 1.0193906 + 12200 0.34591494 0 0.11620659 1.0193906 1.0083102 + 12300 0.33290894 0 0.12437245 1.0083102 1.0193906 + 12400 0.32423652 0 0.13191976 1.0193906 1.0193906 + 12500 0.33031748 0 0.13999363 1.0193906 1.0193906 + 12600 0.31927087 0 0.13776242 1.0083102 1.0193906 + 12700 0.30865965 0 0.13340787 1.0193906 1.0083102 + 12800 0.32542691 0 0.13690449 1.0083102 1.0083102 + 12900 0.32453244 0 0.13376127 1.0083102 1.0083102 + 13000 0.30974678 0 0.12749869 1.0083102 1.0083102 + 13100 0.32402285 0 0.13240572 1.0083102 1.0193906 + 13200 0.32896987 0 0.13257567 1.0193906 1.0083102 + 13300 0.32939197 0 0.12690791 1.0083102 1.0083102 + 13400 0.33966453 0 0.12036916 1.0083102 1.0083102 + 13500 0.33012942 0 0.10496127 1.0083102 1.0304709 + 13600 0.32363377 0 0.091763332 1.0304709 1.0304709 + 13700 0.33427955 0 0.087928243 1.0193906 1.0193906 + 13800 0.33457885 0 0.08191828 1.0083102 1.0083102 + 13900 0.33819924 0 0.074487337 1.0193906 1.0083102 + 14000 0.34611002 0 0.066256529 1.0083102 1.0083102 + 14100 0.33224254 0 0.052608223 1.0083102 1.0083102 + 14200 0.33796934 0 0.049677792 1.0083102 1.0083102 + 14300 0.36216731 0 0.055173039 1.0083102 1.0083102 + 14400 0.35140789 0 0.047322221 1.0193906 1.0193906 + 14500 0.34425046 0 0.036527245 1.0193906 1.0193906 + 14600 0.3604575 0 0.0294772 1.0083102 1.0083102 + 14700 0.3433878 0 0.0096774422 1.0083102 1.0083102 + 14800 0.3287069 0 -0.0079768782 1.0083102 1.0083102 + 14900 0.34978607 0 -0.01178453 1.0083102 1.0083102 + 15000 0.34749548 0 -0.023685074 1.0193906 1.0193906 + 15100 0.33474304 0 -0.040569945 1.0083102 1.0083102 + 15200 0.35036594 0 -0.048341599 1.0083102 1.0083102 + 15300 0.35686042 0 -0.058664905 1.0193906 1.0083102 + 15400 0.34041567 0 -0.074858327 1.0083102 1.0083102 + 15500 0.33397773 0 -0.083782088 1.0083102 1.0083102 + 15600 0.3420119 0 -0.084635487 1.0193906 1.0083102 + 15700 0.345487 0 -0.088137628 1.0193906 1.0083102 + 15800 0.33494392 0 -0.10083064 1.0083102 1.0083102 + 15900 0.32675175 0 -0.11620387 1.0083102 1.0083102 + 16000 0.33011636 0 -0.12713401 1.0083102 1.0304709 + 16100 0.32443118 0 -0.13685913 1.0193906 1.0193906 + 16200 0.31608392 0 -0.14164152 1.0193906 1.0193906 + 16300 0.33293965 0 -0.13335387 1.0083102 1.0083102 + 16400 0.34462807 0 -0.12471686 1.0083102 1.0083102 + 16500 0.33528082 0 -0.12211554 1.0083102 1.0083102 + 16600 0.34250121 0 -0.11228169 1.0083102 1.0083102 + 16700 0.35342336 0 -0.099226948 1.0083102 1.0083102 + 16800 0.33730938 0 -0.093581966 1.0083102 1.0193906 + 16900 0.3275761 0 -0.085163356 1.0083102 1.0083102 + 17000 0.33624873 0 -0.070896594 1.0193906 1.0083102 + 17100 0.34339177 0 -0.057731935 1.0083102 1.0083102 + 17200 0.34874414 0 -0.046575228 1.0083102 1.0083102 + 17300 0.33950911 0 -0.041862179 1.0083102 1.0083102 + 17400 0.33100286 0 -0.036618199 1.0193906 1.0083102 + 17500 0.34238095 0 -0.021681436 1.0193906 1.0083102 + 17600 0.35476614 0 -0.0032568304 1.0083102 1.0083102 + 17700 0.35452053 0 0.011863966 1.0083102 1.0304709 + 17800 0.35423934 0 0.024753043 1.0193906 1.0193906 + 17900 0.35001044 0 0.031647802 1.0193906 1.0193906 + 18000 0.32867773 0 0.030261102 1.0083102 1.0083102 + 18100 0.32730114 0 0.037627319 1.0083102 1.0083102 + 18200 0.35786038 0 0.057653258 1.0083102 1.0083102 + 18300 0.35598175 0 0.065533711 1.0083102 1.0304709 + 18400 0.33913202 0 0.066186406 1.0083102 1.0083102 + 18500 0.34449656 0 0.074575322 1.0083102 1.0193906 + 18600 0.34792041 0 0.083818651 1.0304709 1.0193906 + 18700 0.33910599 0 0.089751723 1.0193906 1.0193906 + 18800 0.33627789 0 0.097491916 1.0304709 1.0083102 + 18900 0.32937699 0 0.10350872 1.0193906 1.0083102 + 19000 0.30908702 0 0.10610099 1.0083102 1.0083102 + 19100 0.31033435 0 0.1168178 1.0083102 1.0083102 + 19200 0.32011336 0 0.12898885 1.0083102 1.0083102 + 19300 0.31851339 0 0.13398981 1.0083102 1.0083102 + 19400 0.33289985 0 0.1401039 1.0083102 1.0083102 + 19500 0.3387096 0 0.13971063 1.0083102 1.0083102 + 19600 0.31475734 0 0.12963499 1.0083102 1.0193906 + 19700 0.31971554 0 0.13189606 1.0083102 1.0193906 + 19800 0.33096999 0 0.13636987 1.0193906 1.0083102 + 19900 0.31601688 0 0.12889803 1.0083102 1.0083102 + 20000 0.32916469 0 0.12683491 1.0083102 1.0304709 + 20100 0.34355734 0 0.12251501 1.0083102 1.0083102 + 20200 0.33029721 0 0.10833335 1.0193906 1.0083102 + 20300 0.34079176 0 0.10305862 1.0083102 1.0083102 + 20400 0.35196716 0 0.098386494 1.0083102 1.0083102 + 20500 0.32687648 0 0.081202778 1.0193906 1.0193906 + 20600 0.33371658 0 0.074287923 1.0083102 1.0193906 + 20700 0.36625228 0 0.073768436 1.0083102 1.0083102 + 20800 0.35824217 0 0.054876358 1.0193906 1.0193906 + 20900 0.34861601 0 0.031603534 1.0083102 1.0083102 + 21000 0.35396698 0 0.013464537 1.0083102 1.0083102 + 21100 0.33592449 0 -0.0096173026 1.0083102 1.0083102 + 21200 0.327063 0 -0.025970252 1.0083102 1.0083102 + 21300 0.34418745 0 -0.030446162 1.0083102 1.0083102 + 21400 0.34181459 0 -0.039942616 1.0083102 1.0083102 + 21500 0.3315724 0 -0.05089285 1.0083102 1.0083102 + 21600 0.35674681 0 -0.047926263 1.0083102 1.0083102 + 21700 0.37320044 0 -0.047190592 1.0083102 1.0083102 + 21800 0.34626293 0 -0.063211549 1.0193906 1.0083102 + 21900 0.32941853 0 -0.078034339 1.0083102 1.0083102 + 22000 0.34102577 0 -0.083179211 1.0083102 1.0083102 + 22100 0.33614888 0 -0.091647522 1.0083102 1.0083102 + 22200 0.3339762 0 -0.09744915 1.0083102 1.0083102 + 22300 0.33867021 0 -0.10026932 1.0083102 1.0083102 + 22400 0.31974078 0 -0.10896583 1.0083102 1.0193906 + 22500 0.3261442 0 -0.10644809 1.0193906 1.0083102 + 22600 0.35128159 0 -0.097711062 1.0083102 1.0083102 + 22700 0.33133845 0 -0.10656571 1.0083102 1.0083102 + 22800 0.31730555 0 -0.11420891 1.0193906 1.0083102 + 22900 0.34720941 0 -0.10586647 1.0083102 1.0083102 + 23000 0.34418922 0 -0.10745826 1.0083102 1.0083102 + 23100 0.32342851 0 -0.11384766 1.0083102 1.0083102 + 23200 0.3408144 0 -0.10631064 1.0083102 1.0083102 + 23300 0.33006722 0 -0.1070084 1.0083102 1.0083102 + 23400 0.31578528 0 -0.10711608 1.0193906 1.0193906 + 23500 0.34908788 0 -0.088441889 1.0193906 1.0083102 + 23600 0.35801835 0 -0.075953983 1.0083102 1.0083102 + 23700 0.33573037 0 -0.072357745 1.0083102 1.0193906 + 23800 0.34435835 0 -0.055470682 1.0193906 1.0083102 + 23900 0.35307683 0 -0.036076205 1.0193906 1.0193906 + 24000 0.35184599 0 -0.020939815 1.0083102 1.0083102 + 24100 0.35687079 0 -0.0063601457 1.0083102 1.0083102 + 24200 0.33612385 0 -0.0014613923 1.0083102 1.0083102 + 24300 0.32234106 0 0.006750452 1.0083102 1.0083102 + 24400 0.34852008 0 0.029170079 1.0083102 1.0083102 + 24500 0.35224811 0 0.043783151 1.0083102 1.0083102 + 24600 0.34160459 0 0.05294313 1.0083102 1.0083102 + 24700 0.35616752 0 0.069291509 1.0083102 1.0083102 + 24800 0.34984726 0 0.076650029 1.0193906 1.0193906 + 24900 0.33337969 0 0.080083735 1.0193906 1.0083102 + 25000 0.34846751 0 0.095559187 1.0083102 1.0083102 + 25100 0.34495541 0 0.10558042 1.0193906 1.0083102 + 25200 0.32630088 0 0.10897783 1.0193906 1.0083102 + 25300 0.33651146 0 0.11888202 1.0083102 1.0083102 + 25400 0.32194445 0 0.11826793 1.0083102 1.0083102 + 25500 0.30295352 0 0.11641357 1.0083102 1.0083102 + 25600 0.33485387 0 0.13204258 1.0083102 1.0083102 + 25700 0.34407287 0 0.13738986 1.0083102 1.0083102 + 25800 0.32421817 0 0.12822703 1.0083102 1.0083102 + 25900 0.32463356 0 0.12403448 1.0193906 1.0193906 + 26000 0.32431468 0 0.12087994 1.0193906 1.0083102 + 26100 0.31886825 0 0.11741621 1.0193906 1.0083102 + 26200 0.32607823 0 0.1180517 1.0083102 1.0083102 + 26300 0.32511255 0 0.11479741 1.0304709 1.0193906 + 26400 0.32336124 0 0.11055002 1.0083102 1.0083102 + 26500 0.33026321 0 0.10934888 1.0083102 1.0083102 + 26600 0.32604491 0 0.10480442 1.0083102 1.0193906 + 26700 0.33764955 0 0.10458959 1.0083102 1.0083102 + 26800 0.35202544 0 0.10295075 1.0193906 1.0193906 + 26900 0.33382028 0 0.088148483 1.0193906 1.0193906 + 27000 0.33252808 0 0.078275659 1.0193906 1.0193906 + 27100 0.35433636 0 0.076729989 1.0304709 1.0193906 + 27200 0.34824881 0 0.065720375 1.0193906 1.0083102 + 27300 0.33525644 0 0.051611147 1.0083102 1.0193906 + 27400 0.34685762 0 0.045597284 1.0193906 1.0083102 + 27500 0.35181712 0 0.037076034 1.0083102 1.0083102 + 27600 0.34541685 0 0.022287411 1.0083102 1.0083102 + 27700 0.34559823 0 0.0056480168 1.0083102 1.0304709 + 27800 0.33646375 0 -0.015571541 1.0193906 1.0193906 + 27900 0.33681932 0 -0.031777883 1.0193906 1.0193906 + 28000 0.35093514 0 -0.041519343 1.0083102 1.0083102 + 28100 0.34345697 0 -0.057623438 1.0083102 1.0083102 + 28200 0.33655073 0 -0.072228985 1.0083102 1.0083102 + 28300 0.34428448 0 -0.080015243 1.0083102 1.0193906 + 28400 0.34089922 0 -0.089955339 1.0193906 1.0193906 + 28500 0.34522966 0 -0.096529413 1.0304709 1.0083102 + 28600 0.34713819 0 -0.10221712 1.0304709 1.0304709 + 28700 0.33692049 0 -0.10868625 1.0193906 1.0083102 + 28800 0.34522852 0 -0.10679446 1.0083102 1.0193906 + 28900 0.33956477 0 -0.1105454 1.0304709 1.0083102 + 29000 0.30989301 0 -0.12332622 1.0193906 1.0193906 + 29100 0.32373738 0 -0.11985261 1.0083102 1.0083102 + 29200 0.35156812 0 -0.10956099 1.0083102 1.0193906 + 29300 0.33938829 0 -0.11259535 1.0083102 1.0193906 + 29400 0.32401178 0 -0.11664978 1.0193906 1.0193906 + 29500 0.32320492 0 -0.11336533 1.0193906 1.0193906 + 29600 0.32928877 0 -0.10404547 1.0193906 1.0193906 + 29700 0.3436911 0 -0.089845529 1.0193906 1.0193906 + 29800 0.34194019 0 -0.081660797 1.0193906 1.0193906 + 29900 0.32909826 0 -0.07807778 1.0083102 1.0083102 + 30000 0.34092826 0 -0.06626489 1.0083102 1.0083102 + 30100 0.34763086 0 -0.055589635 1.0083102 1.0083102 + 30200 0.34479984 0 -0.047402672 1.0193906 1.0193906 + 30300 0.34783224 0 -0.036371931 1.0083102 1.0083102 + 30400 0.34525176 0 -0.027246663 1.0193906 1.0083102 + 30500 0.35266364 0 -0.016275033 1.0083102 1.0193906 + 30600 0.35792479 0 -0.007158119 1.0193906 1.0193906 + 30700 0.33607567 0 -0.0064391529 1.0083102 1.0083102 + 30800 0.34311607 0 0.005382948 1.0304709 1.0083102 + 30900 0.37218574 0 0.025004945 1.0083102 1.0083102 + 31000 0.35196541 0 0.027902483 1.0083102 1.0083102 + 31100 0.33533693 0 0.032349025 1.0083102 1.0083102 + 31200 0.34382193 0 0.046631454 1.0193906 1.0083102 + 31300 0.32886237 0 0.05405956 1.0083102 1.0083102 + 31400 0.32738754 0 0.066295734 1.0083102 1.0083102 + 31500 0.35367575 0 0.087140904 1.0083102 1.0083102 + 31600 0.33756811 0 0.092135887 1.0083102 1.0083102 + 31700 0.31701631 0 0.094576339 1.0083102 1.0083102 + 31800 0.34217612 0 0.11195071 1.0083102 1.0083102 + 31900 0.33725187 0 0.11924087 1.0193906 1.0083102 + 32000 0.30966055 0 0.1199329 1.0193906 1.0083102 + 32100 0.32771084 0 0.13627552 1.0083102 1.0083102 + 32200 0.3400914 0 0.14816015 1.0083102 1.0193906 + 32300 0.32210513 0 0.14569378 1.0193906 1.0083102 + 32400 0.32096229 0 0.14515284 1.0083102 1.0193906 + 32500 0.31781969 0 0.14124479 1.0193906 1.0193906 + 32600 0.3146986 0 0.13616644 1.0193906 1.0193906 + 32700 0.33526021 0 0.13913538 1.0083102 1.0083102 + 32800 0.33561156 0 0.13481353 1.0083102 1.0083102 + 32900 0.31418235 0 0.12161202 1.0193906 1.0193906 + 33000 0.31952054 0 0.11558871 1.0304709 1.0083102 + 33100 0.33437451 0 0.11011602 1.0193906 1.0193906 + 33200 0.33381704 0 0.096535424 1.0193906 1.0304709 + 33300 0.33786259 0 0.08382113 1.0304709 1.0304709 + 33400 0.34590937 0 0.073879824 1.0083102 1.0083102 + 33500 0.33844204 0 0.060854835 1.0193906 1.0193906 + 33600 0.33845544 0 0.052237152 1.0083102 1.0193906 + 33700 0.35419837 0 0.048922784 1.0083102 1.0083102 + 33800 0.3485977 0 0.036886422 1.0083102 1.0083102 + 33900 0.33816081 0 0.021599335 1.0083102 1.0083102 + 34000 0.34241389 0 0.010436074 1.0083102 1.0083102 + 34100 0.33934235 0 -0.002581075 1.0193906 1.0083102 + 34200 0.34579204 0 -0.011373729 1.0083102 1.0193906 + 34300 0.35778336 0 -0.018118327 1.0193906 1.0193906 + 34400 0.35522938 0 -0.030427967 1.0083102 1.0193906 + 34500 0.34820709 0 -0.042562699 1.0083102 1.0083102 + 34600 0.35026547 0 -0.047488326 1.0083102 1.0083102 + 34700 0.35221351 0 -0.050832178 1.0083102 1.0083102 + 34800 0.33043515 0 -0.062718859 1.0083102 1.0083102 + 34900 0.32750488 0 -0.068765033 1.0083102 1.0083102 + 35000 0.35323787 0 -0.067326627 1.0083102 1.0083102 + 35100 0.34732304 0 -0.080326407 1.0193906 1.0083102 + 35200 0.3248439 0 -0.099312427 1.0083102 1.0083102 + 35300 0.32854244 0 -0.10509437 1.0083102 1.0083102 + 35400 0.33511384 0 -0.10605662 1.0083102 1.0083102 + 35500 0.33532722 0 -0.10993967 1.0083102 1.0083102 + 35600 0.33523312 0 -0.11653983 1.0083102 1.0193906 + 35700 0.32405906 0 -0.12564005 1.0193906 1.0193906 + 35800 0.32914902 0 -0.12476137 1.0193906 1.0083102 + 35900 0.34093492 0 -0.11716996 1.0083102 1.0083102 + 36000 0.33557882 0 -0.11216382 1.0083102 1.0083102 + 36100 0.3342841 0 -0.10445781 1.0193906 1.0193906 + 36200 0.33557348 0 -0.0983036 1.0193906 1.0083102 + 36300 0.33052024 0 -0.097594107 1.0304709 1.0083102 + 36400 0.34570912 0 -0.089010349 1.0083102 1.0193906 + 36500 0.35735704 0 -0.078483059 1.0193906 1.0193906 + 36600 0.33199022 0 -0.079452064 1.0193906 1.0083102 + 36700 0.3191692 0 -0.074378584 1.0083102 1.0083102 + 36800 0.34473865 0 -0.052467819 1.0083102 1.0083102 + 36900 0.35012922 0 -0.034841373 1.0193906 1.0083102 + 37000 0.34543508 0 -0.019956141 1.0083102 1.0083102 + 37100 0.36637971 0 0.0034123108 1.0083102 1.0083102 + 37200 0.36008557 0 0.016667331 1.0304709 1.0304709 + 37300 0.34027931 0 0.024177377 1.0304709 1.0083102 + 37400 0.35097853 0 0.041160628 1.0083102 1.0083102 + 37500 0.35024671 0 0.052433671 1.0083102 1.0083102 + 37600 0.33483801 0 0.05655083 1.0193906 1.0193906 + 37700 0.3402098 0 0.067222448 1.0193906 1.0193906 + 37800 0.33859985 0 0.075720813 1.0193906 1.0193906 + 37900 0.32323549 0 0.079678841 1.0193906 1.0083102 + 38000 0.33701532 0 0.092666162 1.0193906 1.0193906 + 38100 0.3424632 0 0.10094611 1.0083102 1.0193906 + 38200 0.32167421 0 0.099350179 1.0193906 1.0193906 + 38300 0.32540911 0 0.10664752 1.0083102 1.0193906 + 38400 0.33574781 0 0.11614552 1.0193906 1.0083102 + 38500 0.33125908 0 0.11940265 1.0193906 1.0083102 + 38600 0.33885801 0 0.12616083 1.0083102 1.0083102 + 38700 0.33813506 0 0.1298943 1.0083102 1.0193906 + 38800 0.31888318 0 0.1260135 1.0083102 1.0193906 + 38900 0.31006429 0 0.12450345 1.0193906 1.0083102 + 39000 0.31407783 0 0.12693078 1.0193906 1.0193906 + 39100 0.33078021 0 0.13111094 1.0304709 1.0193906 + 39200 0.34311375 0 0.12937945 1.0083102 1.0193906 + 39300 0.33594172 0 0.11839992 1.0083102 1.0083102 + 39400 0.32763204 0 0.10898509 1.0304709 1.0193906 + 39500 0.33114946 0 0.10782558 1.0083102 1.0083102 + 39600 0.32905328 0 0.10631627 1.0083102 1.0193906 + 39700 0.32416114 0 0.10142386 1.0193906 1.0083102 + 39800 0.32709132 0 0.096046083 1.0083102 1.0193906 + 39900 0.32910896 0 0.087876394 1.0083102 1.0083102 + 40000 0.33462908 0 0.07810396 1.0193906 1.0193906 +Loop time of 0.489746 on 4 procs for 40000 steps with 361 atoms + +Performance: 7056721.575 tau/day, 81675.018 timesteps/s, 29.485 Matom-step/s +91.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.007919 | 0.0093951 | 0.010867 | 1.2 | 1.92 +Bond | 0.070755 | 0.085453 | 0.096684 | 3.3 | 17.45 +Neigh | 0.030371 | 0.030384 | 0.030393 | 0.0 | 6.20 +Comm | 0.16386 | 0.17988 | 0.19412 | 2.6 | 36.73 +Output | 0.0037789 | 0.0040841 | 0.0048475 | 0.7 | 0.83 +Modify | 0.090035 | 0.098104 | 0.1037 | 1.8 | 20.03 +Other | | 0.08244 | | | 16.83 + +Nlocal: 90.25 ave 92 max 88 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Nghost: 60 ave 61 max 58 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Neighs: 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 +Ave special neighs/atom = 31.024931 +Neighbor list builds = 800 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.clock.dynamic.g++.2 b/examples/balance/log.3Nov23.balance.clock.dynamic.g++.2 new file mode 100644 index 0000000000..49d2b8deda --- /dev/null +++ b/examples/balance/log.3Nov23.balance.clock.dynamic.g++.2 @@ -0,0 +1,234 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +compute p all property/atom d_WEIGHT +fix 0 all balance 50 1.0 shift x 10 1.0 weight time 1.0 weight store WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.559 | 4.75 | 4.941 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 + 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 + 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 + 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 + 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 +Loop time of 1.71386 on 2 procs for 500 steps with 4000 atoms + +Performance: 126031.028 tau/day, 291.738 timesteps/s, 1.167 Matom-step/s +99.6% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.1357 | 1.1768 | 1.2179 | 3.8 | 68.66 +Neigh | 0.40728 | 0.42812 | 0.44897 | 3.2 | 24.98 +Comm | 0.075827 | 0.095749 | 0.11567 | 6.4 | 5.59 +Output | 0.0002928 | 0.0003251 | 0.00035739 | 0.0 | 0.02 +Modify | 0.0076492 | 0.0080146 | 0.00838 | 0.4 | 0.47 +Other | | 0.004868 | | | 0.28 + +Nlocal: 2000 ave 2149 max 1851 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10459.5 ave 10836 max 10083 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298070 ave 307801 max 288338 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596139 +Ave neighs/atom = 149.03475 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.945 | 4.949 | 4.953 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 + 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 4738.2137 + 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 4738.2137 + 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 4738.2137 + 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 4738.2137 + 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 4738.2137 + 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 4738.2137 + 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 4738.2137 + 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 4738.2137 + 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 4738.2137 + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 +Loop time of 1.67419 on 2 procs for 500 steps with 4000 atoms + +Performance: 129017.323 tau/day, 298.651 timesteps/s, 1.195 Matom-step/s +99.7% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.1354 | 1.1632 | 1.191 | 2.6 | 69.48 +Neigh | 0.39683 | 0.42125 | 0.44567 | 3.8 | 25.16 +Comm | 0.073552 | 0.076486 | 0.07942 | 1.1 | 4.57 +Output | 0.00028662 | 0.00031609 | 0.00034556 | 0.0 | 0.02 +Modify | 0.0075098 | 0.0079796 | 0.0084494 | 0.5 | 0.48 +Other | | 0.004917 | | | 0.29 + +Nlocal: 2000 ave 2127 max 1873 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10413.5 ave 10886 max 9941 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 300836 ave 314685 max 286986 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 601671 +Ave neighs/atom = 150.41775 +Neighbor list builds = 51 +Dangerous builds = 0 +fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.5 weight time 0.66 weight store WEIGHT +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.953 | 5.144 | 5.336 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 + 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 4738.2137 + 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 4738.2137 + 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 4738.2137 + 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 4738.2137 + 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 4738.2137 + 1300 0.54430333 -6.260995 0 -5.4447442 -1.856351 4738.2137 + 1350 0.55097839 -6.2715909 0 -5.4453299 -1.9014337 4738.2137 + 1400 0.53858139 -6.2526781 0 -5.445008 -1.7965773 4738.2137 + 1450 0.5421844 -6.2574683 0 -5.444395 -1.7901189 4738.2137 + 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 +Loop time of 2.16148 on 2 procs for 500 steps with 4000 atoms + +Performance: 99931.753 tau/day, 231.324 timesteps/s, 925.294 katom-step/s +98.8% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.79846 | 1.1842 | 1.5699 | 35.4 | 54.79 +Neigh | 0.37845 | 0.43466 | 0.49086 | 8.5 | 20.11 +Comm | 0.08708 | 0.52938 | 0.97168 | 60.8 | 24.49 +Output | 0.0002959 | 0.0003233 | 0.00035071 | 0.0 | 0.01 +Modify | 0.0072841 | 0.0078691 | 0.0084541 | 0.7 | 0.36 +Other | | 0.005076 | | | 0.23 + +Nlocal: 2000 ave 2298 max 1702 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10344.5 ave 11222 max 9467 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 302958 ave 343175 max 262742 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 605917 +Ave neighs/atom = 151.47925 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.957 | 5.337 | 5.718 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 + 1550 0.53713589 -6.2504069 0 -5.4449045 -1.764709 4738.2137 + 1600 0.54679555 -6.2646482 0 -5.44466 -1.8115779 4738.2137 + 1650 0.53806567 -6.2519005 0 -5.4450038 -1.7409139 4738.2137 + 1700 0.53479485 -6.2468959 0 -5.4449041 -1.7162328 4738.2137 + 1750 0.53714536 -6.2506572 0 -5.4451406 -1.7340479 4738.2137 + 1800 0.52749909 -6.2358678 0 -5.444817 -1.6875013 4738.2137 + 1850 0.54585987 -6.2629365 0 -5.4443514 -1.7758757 4738.2137 + 1900 0.53010207 -6.2387514 0 -5.4437971 -1.6381553 4738.2137 + 1950 0.54287913 -6.2582893 0 -5.4441742 -1.7367856 4738.2137 + 2000 0.52766186 -6.2348576 0 -5.4435627 -1.5589066 4738.2137 +Loop time of 2.18418 on 2 procs for 500 steps with 4000 atoms + +Performance: 98892.757 tau/day, 228.918 timesteps/s, 915.674 katom-step/s +98.6% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.87818 | 1.1728 | 1.4674 | 27.2 | 53.69 +Neigh | 0.38155 | 0.42626 | 0.47096 | 6.8 | 19.52 +Comm | 0.23213 | 0.57157 | 0.91101 | 44.9 | 26.17 +Output | 0.00030069 | 0.00032376 | 0.00034684 | 0.0 | 0.01 +Modify | 0.0076232 | 0.0079287 | 0.0082342 | 0.3 | 0.36 +Other | | 0.005329 | | | 0.24 + +Nlocal: 2000 ave 2300 max 1700 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10324 ave 11204 max 9444 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 303986 ave 345018 max 262954 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 607972 +Ave neighs/atom = 151.993 +Neighbor list builds = 51 +Dangerous builds = 0 +Total wall time: 0:00:07 diff --git a/examples/balance/log.3Nov23.balance.clock.dynamic.g++.4 b/examples/balance/log.3Nov23.balance.clock.dynamic.g++.4 new file mode 100644 index 0000000000..a4d22713c1 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.clock.dynamic.g++.4 @@ -0,0 +1,234 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +compute p all property/atom d_WEIGHT +fix 0 all balance 50 1.0 shift x 10 1.0 weight time 1.0 weight store WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.692 | 4.073 | 4.455 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 + 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 + 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 + 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 + 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 +Loop time of 1.25319 on 4 procs for 500 steps with 4000 atoms + +Performance: 172359.605 tau/day, 398.981 timesteps/s, 1.596 Matom-step/s +98.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.34653 | 0.64351 | 0.91663 | 28.5 | 51.35 +Neigh | 0.21165 | 0.23194 | 0.25847 | 4.2 | 18.51 +Comm | 0.11416 | 0.36777 | 0.63774 | 34.3 | 29.35 +Output | 0.00027595 | 0.00030885 | 0.00034514 | 0.0 | 0.02 +Modify | 0.0044031 | 0.005039 | 0.0057452 | 0.8 | 0.40 +Other | | 0.004619 | | | 0.37 + +Nlocal: 1000 ave 1250 max 767 min +Histogram: 1 1 0 0 0 0 0 1 0 1 +Nghost: 8594.25 ave 9068 max 8005 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 149308 ave 207861 max 76482 min +Histogram: 1 0 1 0 0 0 0 0 0 2 + +Total # of neighbors = 597231 +Ave neighs/atom = 149.30775 +Neighbor list builds = 50 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.082 | 4.271 | 4.459 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 + 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 4738.2137 + 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 4738.2137 + 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 4738.2137 + 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 4738.2137 + 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 4738.2137 + 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 4738.2137 + 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 4738.2137 + 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 4738.2137 + 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 4738.2137 + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 +Loop time of 1.21278 on 4 procs for 500 steps with 4000 atoms + +Performance: 178103.015 tau/day, 412.275 timesteps/s, 1.649 Matom-step/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.34456 | 0.63182 | 0.88173 | 27.7 | 52.10 +Neigh | 0.21634 | 0.24141 | 0.2701 | 4.5 | 19.91 +Comm | 0.10554 | 0.32979 | 0.58781 | 34.4 | 27.19 +Output | 0.00027303 | 0.00029988 | 0.00033111 | 0.0 | 0.02 +Modify | 0.0042091 | 0.0049092 | 0.0056581 | 0.9 | 0.40 +Other | | 0.004556 | | | 0.38 + +Nlocal: 1000 ave 1448 max 649 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8681.25 ave 9365 max 7993 min +Histogram: 1 0 1 0 0 0 0 1 0 1 +Neighs: 150170 ave 187956 max 103584 min +Histogram: 1 0 0 1 0 0 0 0 1 1 + +Total # of neighbors = 600678 +Ave neighs/atom = 150.1695 +Neighbor list builds = 53 +Dangerous builds = 0 +fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.5 weight time 0.66 weight store WEIGHT +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.082 | 4.271 | 4.459 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 + 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 4738.2137 + 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 4738.2137 + 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 4738.2137 + 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 4738.2137 + 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 4738.2137 + 1300 0.54134321 -6.2590728 0 -5.447261 -1.9170271 4738.2137 + 1350 0.53564389 -6.2501521 0 -5.4468871 -1.8642306 4738.2137 + 1400 0.53726924 -6.2518379 0 -5.4461355 -1.8544028 4738.2137 + 1450 0.54525935 -6.2632653 0 -5.4455808 -1.9072158 4738.2137 + 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866984 4738.2137 +Loop time of 1.11039 on 4 procs for 500 steps with 4000 atoms + +Performance: 194526.606 tau/day, 450.293 timesteps/s, 1.801 Matom-step/s +98.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.42944 | 0.62743 | 0.76349 | 18.0 | 56.51 +Neigh | 0.1745 | 0.22812 | 0.29389 | 10.7 | 20.54 +Comm | 0.15606 | 0.24538 | 0.37672 | 18.4 | 22.10 +Output | 0.00028277 | 0.00030572 | 0.00033535 | 0.0 | 0.03 +Modify | 0.0036942 | 0.0046797 | 0.0057281 | 1.4 | 0.42 +Other | | 0.00448 | | | 0.40 + +Nlocal: 1000 ave 1289 max 764 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 8639.25 ave 9512 max 8090 min +Histogram: 1 1 0 1 0 0 0 0 0 1 +Neighs: 150494 ave 209619 max 82578 min +Histogram: 1 0 1 0 0 0 0 0 0 2 + +Total # of neighbors = 601974 +Ave neighs/atom = 150.4935 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.082 | 4.272 | 4.459 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866984 4738.2137 + 1550 0.55327014 -6.2750125 0 -5.4453148 -1.9506585 4738.2137 + 1600 0.54418991 -6.261262 0 -5.4451812 -1.8559426 4738.2137 + 1650 0.54710046 -6.266198 0 -5.4457525 -1.888284 4738.2137 + 1700 0.53665701 -6.2504958 0 -5.4457115 -1.8067998 4738.2137 + 1750 0.5486465 -6.2681117 0 -5.4453477 -1.8662621 4738.2137 + 1800 0.54476258 -6.2615089 0 -5.4445693 -1.8352878 4738.2137 + 1850 0.541431 -6.255553 0 -5.4436095 -1.8005746 4738.2137 + 1900 0.53992581 -6.2541254 0 -5.4444392 -1.7768566 4738.2137 + 1950 0.54667259 -6.264121 0 -5.4443171 -1.7947882 4738.2137 + 2000 0.54556851 -6.2625542 0 -5.444406 -1.8072484 4738.2137 +Loop time of 1.14143 on 4 procs for 500 steps with 4000 atoms + +Performance: 189237.081 tau/day, 438.049 timesteps/s, 1.752 Matom-step/s +99.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.42201 | 0.63026 | 0.77752 | 18.6 | 55.22 +Neigh | 0.18905 | 0.2462 | 0.31411 | 10.7 | 21.57 +Comm | 0.15495 | 0.25528 | 0.39485 | 18.8 | 22.36 +Output | 0.00027662 | 0.00030437 | 0.00033645 | 0.0 | 0.03 +Modify | 0.0037058 | 0.0046791 | 0.0056663 | 1.4 | 0.41 +Other | | 0.004707 | | | 0.41 + +Nlocal: 1000 ave 1309 max 769 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8636.75 ave 9520 max 8192 min +Histogram: 2 0 1 0 0 0 0 0 0 1 +Neighs: 151656 ave 211059 max 85091 min +Histogram: 1 0 1 0 0 0 0 0 0 2 + +Total # of neighbors = 606625 +Ave neighs/atom = 151.65625 +Neighbor list builds = 56 +Dangerous builds = 0 +Total wall time: 0:00:04 diff --git a/examples/balance/log.3Nov23.balance.clock.static.g++.2 b/examples/balance/log.3Nov23.balance.clock.static.g++.2 new file mode 100644 index 0000000000..ad9e32eccf --- /dev/null +++ b/examples/balance/log.3Nov23.balance.clock.static.g++.2 @@ -0,0 +1,207 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.001 seconds + iteration count = 1 + time weight factor: 1 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +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 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.294 | 4.485 | 4.675 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 1 -6.9453205 0 -5.4456955 -5.6812358 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 +Loop time of 0.952998 on 2 procs for 250 steps with 4000 atoms + +Performance: 113326.532 tau/day, 262.330 timesteps/s, 1.049 Matom-step/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.4745 | 0.59305 | 0.7116 | 15.4 | 62.23 +Neigh | 0.19129 | 0.20528 | 0.21927 | 3.1 | 21.54 +Comm | 0.016122 | 0.14873 | 0.28134 | 34.4 | 15.61 +Output | 0.00015798 | 0.00017139 | 0.0001848 | 0.0 | 0.02 +Modify | 0.0032698 | 0.0033573 | 0.0034449 | 0.2 | 0.35 +Other | | 0.00241 | | | 0.25 + +Nlocal: 2000 ave 2051 max 1949 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10443 ave 10506 max 10380 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298332 ave 363449 max 233215 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596664 +Ave neighs/atom = 149.166 +Neighbor list builds = 24 +Dangerous builds = 0 +balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 3 + time weight factor: 1 + initial/final maximal load/proc = 1.0308705 0.92612715 + initial/final imbalance factor = 1.1475395 1.0309418 + x cuts: 0 0.4375 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.68 | 4.683 | 4.687 Mbytes + Step Temp E_pair E_mol TotEng Press + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 + 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 + 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 + 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 + 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 +Loop time of 0.88104 on 2 procs for 250 steps with 4000 atoms + +Performance: 122582.335 tau/day, 283.755 timesteps/s, 1.135 Matom-step/s +99.6% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.54838 | 0.58404 | 0.6197 | 4.7 | 66.29 +Neigh | 0.18083 | 0.20191 | 0.22299 | 4.7 | 22.92 +Comm | 0.032279 | 0.089285 | 0.14629 | 19.1 | 10.13 +Output | 0.00014548 | 0.00016198 | 0.00017849 | 0.0 | 0.02 +Modify | 0.0029024 | 0.0032448 | 0.0035871 | 0.6 | 0.37 +Other | | 0.002397 | | | 0.27 + +Nlocal: 2000 ave 2284 max 1716 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10450 ave 10742 max 10158 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298063 ave 326003 max 270123 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596126 +Ave neighs/atom = 149.0315 +Neighbor list builds = 25 +Dangerous builds = 0 +balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 4 + time weight factor: 1 + initial/final maximal load/proc = 0.94269243 0.91089769 + initial/final imbalance factor = 1.0640447 1.028157 + x cuts: 0 0.47265625 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.68 | 4.683 | 4.687 Mbytes + Step Temp E_pair E_mol TotEng Press + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 + 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 + 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 + 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 + 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 + 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 +Loop time of 0.879484 on 2 procs for 250 steps with 4000 atoms + +Performance: 122799.292 tau/day, 284.258 timesteps/s, 1.137 Matom-step/s +99.5% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.52834 | 0.59047 | 0.6526 | 8.1 | 67.14 +Neigh | 0.20544 | 0.20695 | 0.20845 | 0.3 | 23.53 +Comm | 0.015738 | 0.076296 | 0.13685 | 21.9 | 8.68 +Output | 0.00016028 | 0.00017427 | 0.00018825 | 0.0 | 0.02 +Modify | 0.0032547 | 0.0033096 | 0.0033644 | 0.1 | 0.38 +Other | | 0.002288 | | | 0.26 + +Nlocal: 2000 ave 2089 max 1911 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10347.5 ave 10639 max 10056 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 299628 ave 327997 max 271259 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 599256 +Ave neighs/atom = 149.814 +Neighbor list builds = 25 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/balance/log.3Nov23.balance.clock.static.g++.4 b/examples/balance/log.3Nov23.balance.clock.static.g++.4 new file mode 100644 index 0000000000..190e4ef34b --- /dev/null +++ b/examples/balance/log.3Nov23.balance.clock.static.g++.4 @@ -0,0 +1,207 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.000 seconds + iteration count = 2 + time weight factor: 1 + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.6875 1 + y cuts: 0 1 + z cuts: 0 1 + +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 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.427 | 3.713 | 4.19 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 1 -6.9453205 0 -5.4456955 -5.6812358 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 +Loop time of 0.73733 on 4 procs for 250 steps with 4000 atoms + +Performance: 146474.412 tau/day, 339.061 timesteps/s, 1.356 Matom-step/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.17561 | 0.32661 | 0.58554 | 29.3 | 44.30 +Neigh | 0.082409 | 0.10388 | 0.12511 | 5.7 | 14.09 +Comm | 0.022216 | 0.30253 | 0.46162 | 31.8 | 41.03 +Output | 0.00014228 | 0.00015708 | 0.00017991 | 0.0 | 0.02 +Modify | 0.0015077 | 0.001891 | 0.0022549 | 0.7 | 0.26 +Other | | 0.002266 | | | 0.31 + +Nlocal: 1000 ave 1263 max 712 min +Histogram: 1 0 0 0 1 0 1 0 0 1 +Nghost: 8711.5 ave 9045 max 8325 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 149325 ave 275165 max 77227 min +Histogram: 2 0 0 0 1 0 0 0 0 1 + +Total # of neighbors = 597299 +Ave neighs/atom = 149.32475 +Neighbor list builds = 23 +Dangerous builds = 0 +balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 3 + time weight factor: 1 + initial/final maximal load/proc = 0.81065095 0.60308204 + initial/final imbalance factor = 1.5281141 1.1368372 + x cuts: 0 0.28125 0.46875 0.6171875 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.788 | 3.909 | 4.194 Mbytes + Step Temp E_pair E_mol TotEng Press + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 + 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 + 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 + 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 + 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 +Loop time of 0.574974 on 4 procs for 250 steps with 4000 atoms + +Performance: 187834.605 tau/day, 434.802 timesteps/s, 1.739 Matom-step/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.22579 | 0.30378 | 0.43857 | 15.5 | 52.83 +Neigh | 0.065619 | 0.099114 | 0.13721 | 8.3 | 17.24 +Comm | 0.044004 | 0.16804 | 0.24011 | 18.1 | 29.23 +Output | 0.0001362 | 0.00015185 | 0.00017014 | 0.0 | 0.03 +Modify | 0.001083 | 0.0017628 | 0.0025897 | 1.4 | 0.31 +Other | | 0.002125 | | | 0.37 + +Nlocal: 1000 ave 1467 max 599 min +Histogram: 1 0 1 0 0 0 1 0 0 1 +Nghost: 8613.75 ave 9708 max 7894 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 149356 ave 216864 max 107229 min +Histogram: 2 0 0 0 0 1 0 0 0 1 + +Total # of neighbors = 597424 +Ave neighs/atom = 149.356 +Neighbor list builds = 24 +Dangerous builds = 0 +balance 1.0 shift x 5 1.1 weight time 1.0 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 3 + time weight factor: 1 + initial/final maximal load/proc = 0.62725559 0.55791509 + initial/final imbalance factor = 1.2472897 1.109407 + x cuts: 0 0.3046875 0.4453125 0.59863281 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.806 | 3.927 | 4.211 Mbytes + Step Temp E_pair E_mol TotEng Press + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 + 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 + 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 + 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 + 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 + 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 +Loop time of 0.542284 on 4 procs for 250 steps with 4000 atoms + +Performance: 199157.784 tau/day, 461.013 timesteps/s, 1.844 Matom-step/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.27261 | 0.30921 | 0.36016 | 5.7 | 57.02 +Neigh | 0.067401 | 0.10933 | 0.15726 | 11.2 | 20.16 +Comm | 0.098733 | 0.11963 | 0.17136 | 8.7 | 22.06 +Output | 0.00013971 | 0.00015475 | 0.00017256 | 0.0 | 0.03 +Modify | 0.00098217 | 0.0017424 | 0.0025707 | 1.6 | 0.32 +Other | | 0.002205 | | | 0.41 + +Nlocal: 1000 ave 1553 max 533 min +Histogram: 1 1 0 0 0 0 1 0 0 1 +Nghost: 8745 ave 9835 max 8005 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 149124 ave 181946 max 128563 min +Histogram: 1 0 2 0 0 0 0 0 0 1 + +Total # of neighbors = 596497 +Ave neighs/atom = 149.12425 +Neighbor list builds = 25 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/balance/log.3Nov23.balance.g++.2 b/examples/balance/log.3Nov23.balance.g++.2 new file mode 100644 index 0000000000..8bf03941cd --- /dev/null +++ b/examples/balance/log.3Nov23.balance.g++.2 @@ -0,0 +1,213 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + 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.1655347 2.0187654 1.1655347 +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.58276737) to (58.276737 40.375308 0.58276737) + 2 by 1 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 + using lattice units in orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + create_atoms CPU = 0.001 seconds +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 tmp.dump id v_p x y z + +#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 +timestep 0.001 + +run 10000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.061 | 3.066 | 3.071 Mbytes + Step Temp E_pair Press f_10[3] f_10 + 0 25.701528 -29.143179 -1.2407285 2 1.0193906 + 100 25.842512 -29.285247 0.26525204 1.0193906 1.0027701 + 200 26.307268 -29.748808 1.8402984 1.0193906 1.0027701 + 300 26.746717 -30.187064 3.3160966 1.0193906 1.0083102 + 400 26.877952 -30.317954 5.3251792 1.0304709 1.0027701 + 500 26.266471 -29.708192 7.9166641 1.0193906 1.0027701 + 600 26.005495 -29.448014 9.4696736 1.0193906 1.0027701 + 700 26.321835 -29.763442 8.7529756 1.0304709 1.0027701 + 800 26.677822 -30.118375 4.840886 1.0193906 1.0027701 + 900 26.708823 -30.149264 2.8898542 1.0304709 1.0083102 + 1000 26.373337 -29.814704 1.6422658 1.0193906 1.0027701 + 1100 25.893585 -29.335362 0.97146057 1.0304709 1.0027701 + 1200 25.710916 -29.147328 0.80754847 1.0193906 1.0027701 + 1300 25.76291 -29.201881 0.88170364 1.0304709 1.0027701 + 1400 26.080337 -29.52159 1.2169926 1.0304709 1.0083102 + 1500 26.473221 -29.914282 2.3873969 1.0304709 1.0027701 + 1600 26.738055 -30.178413 4.1057361 1.0304709 1.0027701 + 1700 26.589182 -30.030057 6.6930875 1.0304709 1.0083102 + 1800 26.122828 -29.565007 8.897304 1.0304709 1.0027701 + 1900 26.16025 -29.602425 8.4722268 1.0304709 1.0083102 + 2000 26.510754 -29.951778 6.6913672 1.0304709 1.0027701 + 2100 26.732291 -30.172707 4.1328654 1.0193906 1.0083102 + 2200 26.479423 -29.92049 2.3106996 1.0193906 1.0027701 + 2300 26.058035 -29.500247 1.2582222 1.0193906 1.0027701 + 2400 25.732051 -29.175166 0.54231521 1.0304709 1.0083102 + 2500 25.733864 -29.176523 0.66714018 1.0193906 1.0083102 + 2600 25.990734 -29.433139 1.2035223 1.0304709 1.0027701 + 2700 26.383788 -29.82468 2.162696 1.0193906 1.0027701 + 2800 26.679604 -30.120134 3.6992506 1.0193906 1.0083102 + 2900 26.600714 -30.041505 5.7237864 1.0304709 1.0027701 + 3000 26.250766 -29.692594 7.9725502 1.0304709 1.0027701 + 3100 26.121363 -29.563584 8.9373309 1.0193906 1.0027701 + 3200 26.477192 -29.918373 7.1092175 1.0193906 1.0027701 + 3300 26.689536 -30.129977 4.5776139 1.0304709 1.0027701 + 3400 26.586629 -30.026764 2.7417726 1.0304709 1.0027701 + 3500 26.220686 -29.659572 1.6498578 1.0304709 1.0027701 + 3600 25.866231 -29.300814 1.1210814 1.0193906 1.0027701 + 3700 25.659205 -29.142497 0.88115023 1.0193906 1.0027701 + 3800 25.68947 -29.145676 1.4621172 1.0304709 1.0027701 + 3900 25.842813 -29.305171 2.6326543 1.0304709 1.0027701 + 4000 25.919278 -29.470226 4.5283838 1.0304709 1.0027701 + 4100 24.903798 -28.514051 8.027658 1.0304709 1.0027701 + 4200 23.423542 -27.070178 11.619766 1.0304709 1.0083102 + 4300 22.043492 -25.928725 13.445594 1.0304709 1.0083102 + 4400 22.154748 -25.970203 12.572064 1.0304709 1.0027701 + 4500 23.469652 -27.084691 9.6953414 1.0249307 1.0083102 + 4600 23.645224 -27.247805 6.5087935 1.0249307 1.0027701 + 4700 23.449403 -26.921826 3.8388213 1.0249307 1.0027701 + 4800 22.978713 -26.375077 2.2105686 1.0249307 1.0027701 + 4900 22.547461 -25.880668 1.6287577 1.0138504 1.0083102 + 5000 22.34432 -25.632296 1.3146711 1.0304709 1.0083102 + 5100 21.859416 -25.132381 1.4466766 1.0138504 1.0083102 + 5200 21.854255 -25.131546 1.6303448 1.0138504 1.0027701 + 5300 21.425171 -24.876722 2.6133634 1.0027701 1.0027701 + 5400 19.687643 -23.234478 5.4446821 1.0138504 1.0027701 + 5500 18.102224 -21.98985 7.8007647 1.0138504 1.0027701 + 5600 17.402396 -21.218157 8.8854058 1.0138504 1.0027701 + 5700 17.49995 -21.430274 8.8193841 1.0083102 1.0083102 + 5800 18.01284 -21.490424 8.2097589 1.0083102 1.0083102 + 5900 17.565819 -21.169657 7.3645475 1.0027701 1.0027701 + 6000 17.002407 -20.455432 8.0176011 1.0083102 1.0083102 + 6100 17.527412 -20.899213 6.0280989 1.0027701 1.0027701 + 6200 17.068329 -20.522823 5.4665249 1.0027701 1.0027701 + 6300 16.424762 -19.676043 5.1320371 1.0027701 1.0027701 + 6400 16.186199 -19.427212 4.3019107 1.0027701 1.0027701 + 6500 15.691963 -18.890331 3.8910044 1.0027701 1.0027701 + 6600 15.525701 -18.788954 3.5106407 1.0083102 1.0083102 + 6700 15.641437 -18.744896 2.9139189 1.0027701 1.0083102 + 6800 15.656899 -18.774587 2.1876061 1.0138504 1.0027701 + 6900 15.094185 -18.163325 2.3500048 1.0138504 1.0027701 + 7000 14.991269 -18.044483 2.5047107 1.0249307 1.0027701 + 7100 14.727757 -17.740443 2.0066013 1.0138504 1.0027701 + 7200 14.32011 -17.413392 1.5370313 1.0083102 1.0027701 + 7300 14.153835 -17.154266 2.2823938 1.0138504 1.0027701 + 7400 13.644555 -16.662895 2.1522299 1.0083102 1.0083102 + 7500 14.14831 -17.129791 1.5888858 1.0138504 1.0027701 + 7600 13.625238 -16.591406 1.4121129 1.0138504 1.0027701 + 7700 13.471137 -16.441146 1.3192621 1.0193906 1.0083102 + 7800 13.262113 -16.221083 1.516185 1.0083102 1.0027701 + 7900 13.146175 -16.128839 1.6154309 1.0193906 1.0027701 + 8000 13.030735 -15.972746 1.5756469 1.0083102 1.0027701 + 8100 12.742337 -15.790849 1.5660957 1.0138504 1.0027701 + 8200 13.111618 -16.038849 1.4662027 1.0027701 1.0083102 + 8300 12.847359 -15.82086 1.9249118 1.0138504 1.0027701 + 8400 13.136509 -16.066829 1.6715045 1.0138504 1.0027701 + 8500 12.929796 -15.955279 1.1388437 1.0083102 1.0027701 + 8600 13.000263 -15.983556 1.5854841 1.0083102 1.0027701 + 8700 12.524346 -15.443794 1.8406232 1.0083102 1.0027701 + 8800 12.718004 -15.691429 1.4077935 1.0193906 1.0027701 + 8900 12.98278 -15.92931 1.5950893 1.0083102 1.0027701 + 9000 12.444974 -15.506365 1.6085567 1.0249307 1.0027701 + 9100 12.5341 -15.471682 1.6458191 1.0027701 1.0027701 + 9200 12.411742 -15.374927 1.7423964 1.0027701 1.0027701 + 9300 12.613 -15.543866 1.6002664 1.0027701 1.0027701 + 9400 12.315079 -15.231839 1.7207652 1.0138504 1.0027701 + 9500 12.49493 -15.406632 1.5330057 1.0138504 1.0027701 + 9600 12.332602 -15.240282 1.2401605 1.0027701 1.0027701 + 9700 11.894396 -14.794216 1.4072165 1.0083102 1.0027701 + 9800 12.140847 -15.113816 1.6174151 1.0027701 1.0083102 + 9900 12.326936 -15.241095 1.2077951 1.0083102 1.0027701 + 10000 12.212835 -15.106252 1.2704949 1.0083102 1.0027701 +Loop time of 0.177325 on 2 procs for 10000 steps with 361 atoms + +Performance: 4872405.392 tau/day, 56393.581 timesteps/s, 20.358 Matom-step/s +96.7% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.082172 | 0.083041 | 0.08391 | 0.3 | 46.83 +Neigh | 0.025221 | 0.025625 | 0.026029 | 0.3 | 14.45 +Comm | 0.022461 | 0.026564 | 0.030666 | 2.5 | 14.98 +Output | 0.00084416 | 0.00098787 | 0.0011316 | 0.0 | 0.56 +Modify | 0.024707 | 0.025096 | 0.025485 | 0.2 | 14.15 +Other | | 0.01601 | | | 9.03 + +Nlocal: 180.5 ave 181 max 180 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 38 ave 44 max 32 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 1018.5 ave 1032 max 1005 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 2037 +Ave neighs/atom = 5.6426593 +Neighbor list builds = 987 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.g++.4 b/examples/balance/log.3Nov23.balance.g++.4 new file mode 100644 index 0000000000..80da296791 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.g++.4 @@ -0,0 +1,213 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + 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.1655347 2.0187654 1.1655347 +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.58276737) to (58.276737 40.375308 0.58276737) + 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 + using lattice units in orthogonal box = (0 0 -0.58276737) to (58.276737 40.375308 0.58276737) + create_atoms CPU = 0.000 seconds +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 tmp.dump id v_p x y z + +#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 +timestep 0.001 + +run 10000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.042 | 3.048 | 3.06 Mbytes + Step Temp E_pair Press f_10[3] f_10 + 0 25.701528 -29.143179 -1.2407285 3.2354571 1.0526316 + 100 25.842512 -29.285247 0.26525204 1.0526316 1.0083102 + 200 26.307268 -29.748808 1.8402984 1.0526316 1.0083102 + 300 26.746717 -30.187064 3.3160966 1.0526316 1.0083102 + 400 26.877952 -30.317954 5.3251792 1.0526316 1.0083102 + 500 26.266471 -29.708192 7.9166641 1.0526316 1.0304709 + 600 26.005495 -29.448014 9.4696736 1.0526316 1.0083102 + 700 26.321835 -29.763442 8.7529756 1.0526316 1.0193906 + 800 26.677822 -30.118375 4.840886 1.0526316 1.0083102 + 900 26.708823 -30.149264 2.8898542 1.0526316 1.0193906 + 1000 26.373337 -29.814704 1.6422658 1.0526316 1.0083102 + 1100 25.893585 -29.335362 0.97146057 1.0526316 1.0083102 + 1200 25.710916 -29.147328 0.80754847 1.0526316 1.0193906 + 1300 25.76291 -29.201881 0.88170364 1.0858726 1.0193906 + 1400 26.080337 -29.52159 1.2169926 1.0526316 1.0083102 + 1500 26.473221 -29.914282 2.3873969 1.0969529 1.0304709 + 1600 26.738055 -30.178413 4.1057361 1.0526316 1.0083102 + 1700 26.589182 -30.030057 6.6930875 1.0526316 1.0193906 + 1800 26.122828 -29.565007 8.897304 1.0526316 1.0083102 + 1900 26.16025 -29.602425 8.4722268 1.0969529 1.0083102 + 2000 26.510754 -29.951778 6.6913672 1.0969529 1.0083102 + 2100 26.732291 -30.172707 4.1328654 1.0526316 1.0304709 + 2200 26.479423 -29.92049 2.3106996 1.0526316 1.0083102 + 2300 26.058035 -29.500247 1.2582222 1.0526316 1.0193906 + 2400 25.732051 -29.175166 0.54231521 1.0526316 1.0304709 + 2500 25.733864 -29.176523 0.66714018 1.0526316 1.0083102 + 2600 25.990734 -29.433139 1.2035223 1.0526316 1.0083102 + 2700 26.383788 -29.82468 2.162696 1.0526316 1.0083102 + 2800 26.679604 -30.120134 3.6992506 1.0526316 1.0304709 + 2900 26.600714 -30.041505 5.7237864 1.0526316 1.0083102 + 3000 26.250766 -29.692594 7.9725502 1.0526316 1.0083102 + 3100 26.121363 -29.563584 8.9373309 1.0526316 1.0083102 + 3200 26.477192 -29.918373 7.1092175 1.0526316 1.0083102 + 3300 26.689536 -30.129977 4.5776139 1.0969529 1.0304709 + 3400 26.586629 -30.026764 2.7417726 1.0969529 1.0083102 + 3500 26.220686 -29.659572 1.6498578 1.0969529 1.0083102 + 3600 25.866231 -29.300814 1.1210814 1.0526316 1.0304709 + 3700 25.659205 -29.142497 0.88115023 1.0526316 1.0083102 + 3800 25.68947 -29.145676 1.4621172 1.0969529 1.0304709 + 3900 25.842813 -29.305171 2.6326543 1.0969529 1.0083102 + 4000 25.919278 -29.470226 4.5283838 1.0969529 1.0083102 + 4100 24.903798 -28.514051 8.027658 1.0526316 1.0083102 + 4200 23.423542 -27.070178 11.619766 1.0858726 1.0193906 + 4300 22.043492 -25.928725 13.445594 1.0858726 1.0083102 + 4400 22.154748 -25.970203 12.572064 1.0415512 1.0083102 + 4500 23.469652 -27.084691 9.6953414 1.0415512 1.0193906 + 4600 23.645224 -27.247805 6.5087935 1.0526316 1.0083102 + 4700 23.449403 -26.921826 3.8388213 1.0415512 1.0193906 + 4800 22.978713 -26.375077 2.2105686 1.0304709 1.0193906 + 4900 22.547461 -25.880668 1.6287577 1.0415512 1.0193906 + 5000 22.34432 -25.632296 1.3146711 1.0415512 1.0083102 + 5100 21.859416 -25.132381 1.4466766 1.0193906 1.0304709 + 5200 21.854255 -25.131546 1.6303448 1.0193906 1.0083102 + 5300 21.425171 -24.876722 2.6133634 1.0193906 1.0193906 + 5400 19.687643 -23.234478 5.4446821 1.0193906 1.0193906 + 5500 18.102224 -21.98985 7.8007647 1.0193906 1.0083102 + 5600 17.402396 -21.218157 8.8854058 1.0193906 1.0083102 + 5700 17.49995 -21.430274 8.8193838 1.0193906 1.0083102 + 5800 18.012839 -21.490423 8.2097596 1.0083102 1.0083102 + 5900 17.565818 -21.169657 7.3645466 1.0304709 1.0083102 + 6000 17.00239 -20.455416 8.0176192 1.0304709 1.0193906 + 6100 17.527455 -20.899259 6.0280748 1.0193906 1.0083102 + 6200 17.068393 -20.522944 5.4664014 1.0083102 1.0083102 + 6300 16.424576 -19.675908 5.13206 1.0083102 1.0193906 + 6400 16.18682 -19.428005 4.2994462 1.0083102 1.0083102 + 6500 15.692498 -18.890361 3.8912337 1.0193906 1.0083102 + 6600 15.543565 -18.808306 3.4752832 1.0637119 1.0083102 + 6700 15.657432 -18.758221 2.9143187 1.0415512 1.0083102 + 6800 15.730059 -18.834511 2.1741976 1.0193906 1.0083102 + 6900 14.954711 -18.033715 2.4588698 1.0415512 1.0083102 + 7000 15.332203 -18.367577 2.1869698 1.0415512 1.0193906 + 7100 14.54279 -17.554326 2.1617263 1.0304709 1.0193906 + 7200 14.485747 -17.494113 1.362177 1.0193906 1.0193906 + 7300 14.266906 -17.269915 1.6961885 1.0193906 1.0083102 + 7400 13.635947 -16.654801 2.1133026 1.0193906 1.0193906 + 7500 14.029933 -17.022405 1.6716246 1.0193906 1.0083102 + 7600 14.119782 -17.107927 1.516669 1.0304709 1.0083102 + 7700 14.0984 -17.079131 1.6226374 1.0193906 1.0193906 + 7800 13.895083 -16.873848 1.6965546 1.0083102 1.0193906 + 7900 13.55953 -16.536866 1.9893454 1.0193906 1.0083102 + 8000 13.649101 -16.633977 1.4873767 1.0526316 1.0083102 + 8100 13.534848 -16.5239 1.5030254 1.0304709 1.0083102 + 8200 13.039311 -16.021896 1.9003186 1.0083102 1.0083102 + 8300 13.212394 -16.15257 1.6325076 1.0304709 1.0083102 + 8400 12.719582 -15.761108 1.7061831 1.0193906 1.0193906 + 8500 12.954096 -15.962673 1.2631089 1.0193906 1.0193906 + 8600 12.583443 -15.65611 1.3899368 1.0083102 1.0083102 + 8700 12.678764 -15.710348 1.0530056 1.0304709 1.0083102 + 8800 12.740618 -15.660427 1.5864512 1.0193906 1.0083102 + 8900 12.249135 -15.232792 1.624414 1.0304709 1.0193906 + 9000 12.500318 -15.426035 1.1440223 1.0193906 1.0083102 + 9100 12.322373 -15.221333 1.5141173 1.0193906 1.0083102 + 9200 12.259837 -15.16384 1.4848297 1.0193906 1.0083102 + 9300 11.928997 -14.955513 1.3933259 1.0193906 1.0083102 + 9400 12.08076 -14.972026 1.6436388 1.0415512 1.0083102 + 9500 12.059618 -14.952921 1.6617096 1.0083102 1.0304709 + 9600 11.840796 -14.759488 1.6735572 1.0304709 1.0083102 + 9700 11.781829 -14.678411 1.6633417 1.0083102 1.0083102 + 9800 11.947375 -14.931443 1.6695696 1.0083102 1.0193906 + 9900 12.031986 -14.904841 0.97065132 1.0193906 1.0083102 + 10000 11.564772 -14.48025 1.627038 1.0304709 1.0083102 +Loop time of 0.161375 on 4 procs for 10000 steps with 361 atoms + +Performance: 5353997.284 tau/day, 61967.561 timesteps/s, 22.370 Matom-step/s +86.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.04238 | 0.045072 | 0.04897 | 1.3 | 27.93 +Neigh | 0.01265 | 0.013679 | 0.014709 | 0.6 | 8.48 +Comm | 0.043614 | 0.054438 | 0.062719 | 3.0 | 33.73 +Output | 0.00097457 | 0.0010711 | 0.0012879 | 0.4 | 0.66 +Modify | 0.022286 | 0.022773 | 0.023314 | 0.3 | 14.11 +Other | | 0.02434 | | | 15.08 + +Nlocal: 90.25 ave 91 max 89 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 42.75 ave 70 max 26 min +Histogram: 2 0 0 0 1 0 0 0 0 1 +Neighs: 492.5 ave 588 max 427 min +Histogram: 1 0 0 2 0 0 0 0 0 1 + +Total # of neighbors = 1970 +Ave neighs/atom = 5.4570637 +Neighbor list builds = 1087 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.group.dynamic.g++.2 b/examples/balance/log.3Nov23.balance.group.dynamic.g++.2 new file mode 100644 index 0000000000..394738d23d --- /dev/null +++ b/examples/balance/log.3Nov23.balance.group.dynamic.g++.2 @@ -0,0 +1,116 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted.txt +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.001 seconds + iteration count = 1 + group weights: fast=1 slow=1 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 +fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} +fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 + +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 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.434 | 4.625 | 4.816 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 +Loop time of 0.925475 on 2 procs for 250 steps with 4000 atoms + +Performance: 116696.804 tau/day, 270.131 timesteps/s, 1.081 Matom-step/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.49759 | 0.59065 | 0.68371 | 12.1 | 63.82 +Neigh | 0.20391 | 0.21106 | 0.21821 | 1.6 | 22.81 +Comm | 0.016226 | 0.11642 | 0.21661 | 29.4 | 12.58 +Output | 0.00014767 | 0.00016136 | 0.00017504 | 0.0 | 0.02 +Modify | 0.0049562 | 0.0049875 | 0.0050188 | 0.0 | 0.54 +Other | | 0.002194 | | | 0.24 + +Nlocal: 2000 ave 2000 max 2000 min +Histogram: 2 0 0 0 0 0 0 0 0 0 +Nghost: 10441 ave 10457 max 10425 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298332 ave 349156 max 247508 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596664 +Ave neighs/atom = 149.166 +Neighbor list builds = 25 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.group.dynamic.g++.4 b/examples/balance/log.3Nov23.balance.group.dynamic.g++.4 new file mode 100644 index 0000000000..07b8dcf49e --- /dev/null +++ b/examples/balance/log.3Nov23.balance.group.dynamic.g++.4 @@ -0,0 +1,116 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted.txt +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.000 seconds + iteration count = 2 + group weights: fast=1 slow=1 + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.6875 1 + y cuts: 0 1 + z cuts: 0 1 +fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} +fix 0 all balance 10 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 + +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 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.567 | 3.949 | 4.33 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 +Loop time of 0.805708 on 4 procs for 250 steps with 4000 atoms + +Performance: 134043.547 tau/day, 310.286 timesteps/s, 1.241 Matom-step/s +98.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.14028 | 0.36957 | 0.61955 | 31.5 | 45.87 +Neigh | 0.11839 | 0.13333 | 0.14552 | 3.2 | 16.55 +Comm | 0.034173 | 0.29629 | 0.5404 | 37.3 | 36.77 +Output | 0.00016223 | 0.00017113 | 0.00019287 | 0.0 | 0.02 +Modify | 0.0041243 | 0.0042239 | 0.0043322 | 0.1 | 0.52 +Other | | 0.002124 | | | 0.26 + +Nlocal: 1000 ave 1001 max 999 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Nghost: 8727 ave 8761 max 8674 min +Histogram: 1 0 0 0 0 0 1 1 0 1 +Neighs: 149349 ave 260848 max 51191 min +Histogram: 1 1 0 0 0 0 1 0 0 1 + +Total # of neighbors = 597396 +Ave neighs/atom = 149.349 +Neighbor list builds = 25 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.group.static.g++.2 b/examples/balance/log.3Nov23.balance.group.static.g++.2 new file mode 100644 index 0000000000..cc1652afc3 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.group.static.g++.2 @@ -0,0 +1,160 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +balance 1.0 shift x 5 1.1 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.001 seconds + iteration count = 1 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +balance 1.0 x uniform +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 0 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +variable weight atom (type==1)*1.0+(type==2)*v_factor +balance 1.0 shift x 5 1.1 weight var weight # out weighted_var.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 1 + weight variable: weight + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +balance 1.0 x uniform +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 0 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted_group.txt +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 1 + group weights: fast=1 slow=1 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +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 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.294 | 4.485 | 4.675 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 1 -6.9453205 0 -5.4456955 -5.6812358 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 +Loop time of 1.07049 on 2 procs for 250 steps with 4000 atoms + +Performance: 100888.200 tau/day, 233.537 timesteps/s, 934.150 katom-step/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.55726 | 0.68002 | 0.80278 | 14.9 | 63.52 +Neigh | 0.21838 | 0.23004 | 0.2417 | 2.4 | 21.49 +Comm | 0.01941 | 0.15387 | 0.28832 | 34.3 | 14.37 +Output | 0.00017519 | 0.00021161 | 0.00024802 | 0.0 | 0.02 +Modify | 0.0036966 | 0.0037375 | 0.0037784 | 0.1 | 0.35 +Other | | 0.002623 | | | 0.25 + +Nlocal: 2000 ave 2051 max 1949 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10443 ave 10506 max 10380 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298332 ave 363449 max 233215 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596664 +Ave neighs/atom = 149.166 +Neighbor list builds = 24 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/balance/log.3Nov23.balance.group.static.g++.4 b/examples/balance/log.3Nov23.balance.group.static.g++.4 new file mode 100644 index 0000000000..4d7c77071f --- /dev/null +++ b/examples/balance/log.3Nov23.balance.group.static.g++.4 @@ -0,0 +1,160 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +balance 1.0 shift x 5 1.1 # out unweighted.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.000 seconds + iteration count = 2 + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.6875 1 + y cuts: 0 1 + z cuts: 0 1 + +balance 1.0 x uniform +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 0 + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.75 1 + y cuts: 0 1 + z cuts: 0 1 + +variable weight atom (type==1)*1.0+(type==2)*v_factor +balance 1.0 shift x 5 1.1 weight var weight # out weighted_var.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 2 + weight variable: weight + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.6875 1 + y cuts: 0 1 + z cuts: 0 1 + +balance 1.0 x uniform +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 0 + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.75 1 + y cuts: 0 1 + z cuts: 0 1 + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow ${factor} # out weighted_group.txt +balance 1.0 shift x 5 1.1 weight group 2 fast 1.0 slow 1.0 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 2 + group weights: fast=1 slow=1 + initial/final maximal load/proc = 1200 1200 + initial/final imbalance factor = 1.2 1.2 + x cuts: 0 0.25 0.5 0.6875 1 + y cuts: 0 1 + z cuts: 0 1 + +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 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.427 | 3.713 | 4.19 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 1 -6.9453205 0 -5.4456955 -5.6812358 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 +Loop time of 0.927365 on 4 procs for 250 steps with 4000 atoms + +Performance: 116459.057 tau/day, 269.581 timesteps/s, 1.078 Matom-step/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 | 0.24625 | 0.41858 | 0.73449 | 30.7 | 45.14 +Neigh | 0.10809 | 0.14016 | 0.16724 | 6.7 | 15.11 +Comm | 0.025406 | 0.36335 | 0.55279 | 34.1 | 39.18 +Output | 0.00017675 | 0.00019894 | 0.00022697 | 0.0 | 0.02 +Modify | 0.0016956 | 0.0023554 | 0.0031138 | 1.1 | 0.25 +Other | | 0.002723 | | | 0.29 + +Nlocal: 1000 ave 1263 max 712 min +Histogram: 1 0 0 0 1 0 1 0 0 1 +Nghost: 8711.5 ave 9045 max 8325 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 149325 ave 275165 max 77227 min +Histogram: 2 0 0 0 1 0 0 0 0 1 + +Total # of neighbors = 597299 +Ave neighs/atom = 149.32475 +Neighbor list builds = 23 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/balance/log.3Nov23.balance.kspace.g++.2 b/examples/balance/log.3Nov23.balance.kspace.g++.2 new file mode 100644 index 0000000000..b7c16fb82a --- /dev/null +++ b/examples/balance/log.3Nov23.balance.kspace.g++.2 @@ -0,0 +1,120 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +#atom_style charge +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type +#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 + +kspace_style pppm/disp 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 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +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 +run 500 +PPPMDisp initialization ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + Dispersion G vector (1/distance)= 0.1 + Dispersion grid = 2 2 2 + Dispersion stencil order = 5 + Dispersion estimated absolute RMS force accuracy = 1.0125082 + Dispersion estimated relative force accuracy = 1.0125082 + using double precision FFTW3 + 3d grid and FFT values/proc = 294 4 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/long/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.847 | 5.016 | 5.184 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 52.148338 0 53.647963 94.09503 4738.2137 + 50 17.747599 42.836975 0 69.451719 143.44398 4738.2137 + 100 9.0390947 49.78615 0 63.341402 117.79296 4738.2137 + 150 13.456072 47.810527 0 67.989589 140.52068 4738.2137 + 200 11.358932 52.542448 0 69.576586 142.87196 4738.2137 + 250 13.204593 48.601438 0 68.403376 134.97484 4738.2137 + 300 12.062011 50.642183 0 68.730677 133.27085 4738.2137 + 350 14.102561 50.203717 0 71.35227 143.56297 4738.2137 + 400 12.040871 50.230441 0 68.287232 132.11937 4738.2137 + 450 13.381968 51.111601 0 71.179535 144.53303 4738.2137 + 500 12.899157 50.248902 0 69.5928 136.59639 4738.2137 +Loop time of 3.74212 on 2 procs for 500 steps with 4000 atoms + +Performance: 57721.346 tau/day, 133.614 timesteps/s, 534.457 katom-step/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.6146 | 1.7284 | 1.8423 | 8.7 | 46.19 +Kspace | 0.56305 | 0.61569 | 0.66833 | 6.7 | 16.45 +Neigh | 1.2338 | 1.3029 | 1.372 | 6.1 | 34.82 +Comm | 0.059727 | 0.067883 | 0.076039 | 3.1 | 1.81 +Output | 0.00031007 | 0.00033894 | 0.0003678 | 0.0 | 0.01 +Modify | 0.020232 | 0.020653 | 0.021073 | 0.3 | 0.55 +Other | | 0.006259 | | | 0.17 + +Nlocal: 2000 ave 2314 max 1686 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 9546 ave 9663 max 9429 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 254558 ave 277593 max 231523 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 509116 +Ave neighs/atom = 127.279 +Neighbor list builds = 124 +Dangerous builds = 97 +Total wall time: 0:00:03 diff --git a/examples/balance/log.3Nov23.balance.kspace.g++.4 b/examples/balance/log.3Nov23.balance.kspace.g++.4 new file mode 100644 index 0000000000..46e4bbbf94 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.kspace.g++.4 @@ -0,0 +1,120 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +#atom_style charge +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type +#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 + +kspace_style pppm/disp 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 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +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 +run 500 +PPPMDisp initialization ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + Dispersion G vector (1/distance)= 0.1 + Dispersion grid = 2 2 2 + Dispersion stencil order = 5 + Dispersion estimated absolute RMS force accuracy = 1.0125082 + Dispersion estimated relative force accuracy = 1.0125082 + using double precision FFTW3 + 3d grid and FFT values/proc = 294 4 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/long/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.293 | 4.424 | 4.655 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 52.148338 0 53.647963 94.09503 4738.2137 + 50 17.850656 42.620113 0 69.389403 142.80556 4738.2137 + 100 9.4607189 49.700118 0 63.887649 117.51739 4738.2137 + 150 13.992056 47.731988 0 68.714825 140.56926 4738.2137 + 200 11.617635 52.509395 0 69.931491 142.6933 4738.2137 + 250 13.536262 48.330072 0 68.629389 133.91619 4738.2137 + 300 12.620066 50.328874 0 69.25424 132.46908 4738.2137 + 350 14.514428 50.102816 0 71.869016 143.37224 4738.2137 + 400 12.348652 49.810405 0 68.328752 130.3274 4738.2137 + 450 13.800185 50.987433 0 71.682536 144.38181 4738.2137 + 500 13.255019 50.64398 0 70.521538 138.24387 4738.2137 +Loop time of 3.81152 on 4 procs for 500 steps with 4000 atoms + +Performance: 56670.269 tau/day, 131.181 timesteps/s, 524.725 katom-step/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 | 0.55832 | 1.1319 | 1.6826 | 48.2 | 29.70 +Kspace | 0.40554 | 1.6212 | 2.7162 | 80.5 | 42.53 +Neigh | 0.25726 | 0.85075 | 1.6088 | 63.7 | 22.32 +Comm | 0.079895 | 0.17554 | 0.24986 | 17.5 | 4.61 +Output | 0.00035922 | 0.00041828 | 0.00044719 | 0.0 | 0.01 +Modify | 0.02199 | 0.024073 | 0.026861 | 1.3 | 0.63 +Other | | 0.007582 | | | 0.20 + +Nlocal: 1000 ave 1995 max 227 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 7601 ave 9326 max 5900 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 127284 ave 212972 max 45553 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 509136 +Ave neighs/atom = 127.284 +Neighbor list builds = 124 +Dangerous builds = 97 +Total wall time: 0:00:03 diff --git a/examples/balance/log.3Nov23.balance.neigh.dynamic.g++.2 b/examples/balance/log.3Nov23.balance.neigh.dynamic.g++.2 new file mode 100644 index 0000000000..58ff4bea6a --- /dev/null +++ b/examples/balance/log.3Nov23.balance.neigh.dynamic.g++.2 @@ -0,0 +1,235 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.8 weight store WEIGHT +compute p all property/atom d_WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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.mp4 c_p type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 amap 0.0 2.0 cf 0.1 3 min blue 0.5 green max red + +thermo 50 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +WARNING: Balance weight neigh skipped b/c no suitable list found (src/imbalance_neigh.cpp:65) +Per MPI rank memory allocation (min/avg/max) = 4.559 | 4.75 | 4.941 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 + 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 + 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 + 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 + 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 +Loop time of 2.06018 on 2 procs for 500 steps with 4000 atoms + +Performance: 104845.132 tau/day, 242.697 timesteps/s, 970.788 katom-step/s +99.6% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2219 | 1.3634 | 1.505 | 12.1 | 66.18 +Neigh | 0.49695 | 0.4983 | 0.49965 | 0.2 | 24.19 +Comm | 0.041095 | 0.18389 | 0.32669 | 33.3 | 8.93 +Output | 0.00032321 | 0.00035487 | 0.00038653 | 0.0 | 0.02 +Modify | 0.0084967 | 0.0087312 | 0.0089658 | 0.3 | 0.42 +Other | | 0.005469 | | | 0.27 + +Nlocal: 2000 ave 2056 max 1944 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10457.5 ave 10508 max 10407 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298070 ave 333007 max 263132 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596139 +Ave neighs/atom = 149.03475 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.571 | 4.758 | 4.945 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 + 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 4738.2137 + 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 4738.2137 + 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 4738.2137 + 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 4738.2137 + 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 4738.2137 + 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 4738.2137 + 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 4738.2137 + 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 4738.2137 + 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 4738.2137 + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 +Loop time of 2.04735 on 2 procs for 500 steps with 4000 atoms + +Performance: 105502.372 tau/day, 244.218 timesteps/s, 976.874 katom-step/s +99.5% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2217 | 1.3603 | 1.4989 | 11.9 | 66.44 +Neigh | 0.49705 | 0.49793 | 0.49882 | 0.1 | 24.32 +Comm | 0.036988 | 0.17466 | 0.31233 | 32.9 | 8.53 +Output | 0.00031921 | 0.00035316 | 0.00038711 | 0.0 | 0.02 +Modify | 0.0084606 | 0.0086808 | 0.0089009 | 0.2 | 0.42 +Other | | 0.005397 | | | 0.26 + +Nlocal: 2000 ave 2049 max 1951 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10389 ave 10436 max 10342 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 300836 ave 335987 max 265684 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 601671 +Ave neighs/atom = 150.41775 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.571 | 4.758 | 4.945 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 + 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 4738.2137 + 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 4738.2137 + 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 4738.2137 + 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 4738.2137 + 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 4738.2137 + 1300 0.54430333 -6.260995 0 -5.4447442 -1.856351 4738.2137 + 1350 0.55097839 -6.2715909 0 -5.4453299 -1.9014337 4738.2137 + 1400 0.53858139 -6.2526781 0 -5.445008 -1.7965773 4738.2137 + 1450 0.5421844 -6.2574683 0 -5.444395 -1.7901189 4738.2137 + 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 +Loop time of 2.06014 on 2 procs for 500 steps with 4000 atoms + +Performance: 104847.028 tau/day, 242.701 timesteps/s, 970.806 katom-step/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2169 | 1.3632 | 1.5094 | 12.5 | 66.17 +Neigh | 0.49211 | 0.49613 | 0.50014 | 0.6 | 24.08 +Comm | 0.03623 | 0.18643 | 0.33662 | 34.8 | 9.05 +Output | 0.00030992 | 0.00034406 | 0.00037821 | 0.0 | 0.02 +Modify | 0.0085349 | 0.0086823 | 0.0088298 | 0.2 | 0.42 +Other | | 0.005411 | | | 0.26 + +Nlocal: 2000 ave 2034 max 1966 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10386 ave 10936 max 9836 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 302958 ave 337188 max 268729 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 605917 +Ave neighs/atom = 151.47925 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.571 | 4.758 | 4.945 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1500 0.54200617 -6.2571433 0 -5.4443373 -1.8000344 4738.2137 + 1550 0.53713593 -6.2504069 0 -5.4449044 -1.764709 4738.2137 + 1600 0.54679556 -6.2646482 0 -5.4446599 -1.8115775 4738.2137 + 1650 0.53806577 -6.2519006 0 -5.4450037 -1.7409142 4738.2137 + 1700 0.5347951 -6.2468962 0 -5.4449041 -1.7162331 4738.2137 + 1750 0.53714568 -6.2506577 0 -5.4451406 -1.7340499 4738.2137 + 1800 0.52749839 -6.2358664 0 -5.4448167 -1.6874961 4738.2137 + 1850 0.54585956 -6.2629394 0 -5.4443547 -1.7758764 4738.2137 + 1900 0.53010831 -6.2387561 0 -5.4437925 -1.6381825 4738.2137 + 1950 0.54288557 -6.2583073 0 -5.4441826 -1.7368524 4738.2137 + 2000 0.52765923 -6.2348572 0 -5.4435663 -1.5588839 4738.2137 +Loop time of 2.11629 on 2 procs for 500 steps with 4000 atoms + +Performance: 102065.604 tau/day, 236.263 timesteps/s, 945.052 katom-step/s +99.5% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2677 | 1.4112 | 1.5546 | 12.1 | 66.68 +Neigh | 0.50555 | 0.50815 | 0.51076 | 0.4 | 24.01 +Comm | 0.036017 | 0.18186 | 0.3277 | 34.2 | 8.59 +Output | 0.00034146 | 0.00036996 | 0.00039846 | 0.0 | 0.02 +Modify | 0.0089519 | 0.0090956 | 0.0092392 | 0.2 | 0.43 +Other | | 0.005624 | | | 0.27 + +Nlocal: 2000 ave 2031 max 1969 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10334 ave 10921 max 9747 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 303988 ave 338808 max 269168 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 607976 +Ave neighs/atom = 151.994 +Neighbor list builds = 51 +Dangerous builds = 0 + +Total wall time: 0:00:08 diff --git a/examples/balance/log.3Nov23.balance.neigh.dynamic.g++.4 b/examples/balance/log.3Nov23.balance.neigh.dynamic.g++.4 new file mode 100644 index 0000000000..c232f64447 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.neigh.dynamic.g++.4 @@ -0,0 +1,235 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +fix 0 all balance 50 1.0 shift x 5 1.0 weight neigh 0.8 weight store WEIGHT +compute p all property/atom d_WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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.mp4 c_p type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 amap 0.0 2.0 cf 0.1 3 min blue 0.5 green max red + +thermo 50 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +WARNING: Balance weight neigh skipped b/c no suitable list found (src/imbalance_neigh.cpp:65) +Per MPI rank memory allocation (min/avg/max) = 3.692 | 4.073 | 4.455 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 + 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 + 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 + 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 + 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 +Loop time of 1.55023 on 4 procs for 500 steps with 4000 atoms + +Performance: 139333.812 tau/day, 322.532 timesteps/s, 1.290 Matom-step/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.71992 | 0.87383 | 0.98696 | 11.0 | 56.37 +Neigh | 0.21071 | 0.30874 | 0.44041 | 17.8 | 19.92 +Comm | 0.32187 | 0.35451 | 0.38467 | 4.4 | 22.87 +Output | 0.00037371 | 0.00042 | 0.00044758 | 0.0 | 0.03 +Modify | 0.0049391 | 0.0063638 | 0.0082893 | 1.8 | 0.41 +Other | | 0.006361 | | | 0.41 + +Nlocal: 1000 ave 1549 max 605 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8755 ave 9851 max 8071 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 149308 ave 164554 max 128538 min +Histogram: 1 0 0 1 0 0 0 0 0 2 + +Total # of neighbors = 597231 +Ave neighs/atom = 149.30775 +Neighbor list builds = 50 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.099 | 4.288 | 4.477 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 + 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 4738.2137 + 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 4738.2137 + 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 4738.2137 + 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 4738.2137 + 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 4738.2137 + 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 4738.2137 + 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 4738.2137 + 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 4738.2137 + 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 4738.2137 + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 +Loop time of 1.67278 on 4 procs for 500 steps with 4000 atoms + +Performance: 129126.174 tau/day, 298.903 timesteps/s, 1.196 Matom-step/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 | 0.84049 | 0.96125 | 1.0434 | 8.0 | 57.46 +Neigh | 0.23438 | 0.35614 | 0.5167 | 20.4 | 21.29 +Comm | 0.28073 | 0.34108 | 0.41025 | 9.1 | 20.39 +Output | 0.00039366 | 0.00043302 | 0.00046464 | 0.0 | 0.03 +Modify | 0.0050479 | 0.006849 | 0.0091921 | 2.2 | 0.41 +Other | | 0.007028 | | | 0.42 + +Nlocal: 1000 ave 1569 max 595 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8715.25 ave 9779 max 8018 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 150170 ave 163282 max 132114 min +Histogram: 1 0 0 1 0 0 0 0 0 2 + +Total # of neighbors = 600678 +Ave neighs/atom = 150.1695 +Neighbor list builds = 53 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.099 | 4.288 | 4.477 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 + 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 4738.2137 + 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 4738.2137 + 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 4738.2137 + 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 4738.2137 + 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 4738.2137 + 1300 0.54134321 -6.2590728 0 -5.447261 -1.9170271 4738.2137 + 1350 0.53564389 -6.2501521 0 -5.4468871 -1.8642306 4738.2137 + 1400 0.53726924 -6.2518379 0 -5.4461355 -1.8544028 4738.2137 + 1450 0.54525935 -6.2632653 0 -5.4455808 -1.9072158 4738.2137 + 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866985 4738.2137 +Loop time of 1.66639 on 4 procs for 500 steps with 4000 atoms + +Performance: 129621.198 tau/day, 300.049 timesteps/s, 1.200 Matom-step/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 | 0.8486 | 0.96611 | 1.1004 | 9.8 | 57.98 +Neigh | 0.22624 | 0.34016 | 0.49564 | 19.9 | 20.41 +Comm | 0.3065 | 0.34614 | 0.41937 | 7.4 | 20.77 +Output | 0.00040364 | 0.00043928 | 0.00051275 | 0.0 | 0.03 +Modify | 0.0049921 | 0.0067008 | 0.008971 | 2.1 | 0.40 +Other | | 0.00684 | | | 0.41 + +Nlocal: 1000 ave 1543 max 605 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8704.5 ave 9803 max 7983 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 150494 ave 166334 max 129306 min +Histogram: 1 0 0 1 0 0 0 0 0 2 + +Total # of neighbors = 601974 +Ave neighs/atom = 150.4935 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.099 | 4.288 | 4.477 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1500 0.54223346 -6.2591057 0 -5.4459588 -1.8866985 4738.2137 + 1550 0.55327018 -6.2750126 0 -5.4453148 -1.9506585 4738.2137 + 1600 0.54419004 -6.2612622 0 -5.4451812 -1.8559437 4738.2137 + 1650 0.54710034 -6.2661938 0 -5.4457484 -1.8882763 4738.2137 + 1700 0.53665691 -6.2504958 0 -5.4457117 -1.8068009 4738.2137 + 1750 0.5486471 -6.2681127 0 -5.4453478 -1.8662656 4738.2137 + 1800 0.54476222 -6.2615086 0 -5.4445695 -1.8352838 4738.2137 + 1850 0.54143048 -6.2555517 0 -5.443609 -1.8005726 4738.2137 + 1900 0.53992511 -6.254136 0 -5.4444508 -1.7768715 4738.2137 + 1950 0.54665895 -6.2640958 0 -5.4443124 -1.7946993 4738.2137 + 2000 0.5455751 -6.2625337 0 -5.4443756 -1.8072242 4738.2137 +Loop time of 1.69092 on 4 procs for 500 steps with 4000 atoms + +Performance: 127741.463 tau/day, 295.698 timesteps/s, 1.183 Matom-step/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 | 0.85108 | 0.9612 | 1.0789 | 9.0 | 56.85 +Neigh | 0.2452 | 0.37468 | 0.5456 | 20.7 | 22.16 +Comm | 0.27839 | 0.34103 | 0.42333 | 9.0 | 20.17 +Output | 0.00038835 | 0.00042678 | 0.00046578 | 0.0 | 0.03 +Modify | 0.0049259 | 0.0067032 | 0.0090783 | 2.2 | 0.40 +Other | | 0.006874 | | | 0.41 + +Nlocal: 1000 ave 1539 max 607 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8677 ave 9837 max 7981 min +Histogram: 2 0 0 0 1 0 0 0 0 1 +Neighs: 151655 ave 168263 max 129443 min +Histogram: 1 0 0 1 0 0 0 0 0 2 + +Total # of neighbors = 606619 +Ave neighs/atom = 151.65475 +Neighbor list builds = 56 +Dangerous builds = 0 + +Total wall time: 0:00:06 diff --git a/examples/balance/log.3Nov23.balance.neigh.rcb.g++.2 b/examples/balance/log.3Nov23.balance.neigh.rcb.g++.2 new file mode 100644 index 0000000000..0bbfe645ba --- /dev/null +++ b/examples/balance/log.3Nov23.balance.neigh.rcb.g++.2 @@ -0,0 +1,146 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +comm_style tiled + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +fix 0 all balance 50 1.0 rcb weight neigh 0.8 weight store WEIGHT +compute p all property/atom d_WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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 + +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +WARNING: Balance weight neigh skipped b/c no suitable list found (src/imbalance_neigh.cpp:65) +Per MPI rank memory allocation (min/avg/max) = 4.138 | 4.329 | 4.52 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 +Loop time of 0.963489 on 2 procs for 250 steps with 4000 atoms + +Performance: 112092.660 tau/day, 259.474 timesteps/s, 1.038 Matom-step/s +97.7% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.64566 | 0.66162 | 0.67758 | 2.0 | 68.67 +Neigh | 0.23969 | 0.24019 | 0.24069 | 0.1 | 24.93 +Comm | 0.037375 | 0.052867 | 0.068358 | 6.7 | 5.49 +Output | 0.0001635 | 0.00017861 | 0.00019372 | 0.0 | 0.02 +Modify | 0.0055964 | 0.0056409 | 0.0056853 | 0.1 | 0.59 +Other | | 0.002991 | | | 0.31 + +Nlocal: 2000 ave 2000 max 2000 min +Histogram: 2 0 0 0 0 0 0 0 0 0 +Nghost: 10412.5 ave 10414 max 10411 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298332 ave 299797 max 296867 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596664 +Ave neighs/atom = 149.166 +Neighbor list builds = 25 +Dangerous builds = 0 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.932 | 4.933 | 4.933 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 + 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 + 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 + 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 + 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 +Loop time of 0.986357 on 2 procs for 250 steps with 4000 atoms + +Performance: 109493.776 tau/day, 253.458 timesteps/s, 1.014 Matom-step/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.68342 | 0.68352 | 0.68362 | 0.0 | 69.30 +Neigh | 0.25726 | 0.25795 | 0.25864 | 0.1 | 26.15 +Comm | 0.035415 | 0.036212 | 0.037009 | 0.4 | 3.67 +Output | 0.00016727 | 0.00018288 | 0.00019849 | 0.0 | 0.02 +Modify | 0.0054242 | 0.005429 | 0.0054338 | 0.0 | 0.55 +Other | | 0.003066 | | | 0.31 + +Nlocal: 2000 ave 2000 max 2000 min +Histogram: 2 0 0 0 0 0 0 0 0 0 +Nghost: 10466.5 ave 10470 max 10463 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298070 ave 349236 max 246903 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596139 +Ave neighs/atom = 149.03475 +Neighbor list builds = 26 +Dangerous builds = 0 + +Total wall time: 0:00:02 diff --git a/examples/balance/log.3Nov23.balance.neigh.rcb.g++.4 b/examples/balance/log.3Nov23.balance.neigh.rcb.g++.4 new file mode 100644 index 0000000000..5a31737dc5 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.neigh.rcb.g++.4 @@ -0,0 +1,146 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +comm_style tiled + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +fix 0 all balance 50 1.0 rcb weight neigh 0.8 weight store WEIGHT +compute p all property/atom d_WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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 + +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +WARNING: Balance weight neigh skipped b/c no suitable list found (src/imbalance_neigh.cpp:65) +Per MPI rank memory allocation (min/avg/max) = 3.91 | 3.917 | 3.922 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 +Loop time of 0.645151 on 4 procs for 250 steps with 4000 atoms + +Performance: 167402.554 tau/day, 387.506 timesteps/s, 1.550 Matom-step/s +91.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.3352 | 0.38659 | 0.42758 | 6.0 | 59.92 +Neigh | 0.13107 | 0.13776 | 0.14056 | 1.0 | 21.35 +Comm | 0.063456 | 0.11053 | 0.16553 | 12.0 | 17.13 +Output | 0.00016405 | 0.0001788 | 0.00020664 | 0.0 | 0.03 +Modify | 0.0040404 | 0.0040928 | 0.0041638 | 0.1 | 0.63 +Other | | 0.005999 | | | 0.93 + +Nlocal: 1000 ave 1005 max 996 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 7674 ave 7679 max 7670 min +Histogram: 1 1 0 0 0 0 1 0 0 1 +Neighs: 149349 ave 149991 max 147960 min +Histogram: 1 0 0 0 0 0 0 1 0 2 + +Total # of neighbors = 597396 +Ave neighs/atom = 149.349 +Neighbor list builds = 25 +Dangerous builds = 0 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.924 | 4.007 | 4.081 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 + 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 + 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 + 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 + 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 +Loop time of 0.747007 on 4 procs for 250 steps with 4000 atoms + +Performance: 144577.053 tau/day, 334.669 timesteps/s, 1.339 Matom-step/s +92.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.42386 | 0.45917 | 0.50489 | 4.3 | 61.47 +Neigh | 0.1603 | 0.16404 | 0.17229 | 1.2 | 21.96 +Comm | 0.062076 | 0.11618 | 0.1553 | 10.0 | 15.55 +Output | 0.00016524 | 0.00018611 | 0.00022092 | 0.0 | 0.02 +Modify | 0.0041562 | 0.0042306 | 0.0043824 | 0.1 | 0.57 +Other | | 0.003202 | | | 0.43 + +Nlocal: 1000 ave 1005 max 994 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Nghost: 7675.75 ave 7703 max 7648 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Neighs: 149308 ave 173909 max 124842 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 597231 +Ave neighs/atom = 149.30775 +Neighbor list builds = 25 +Dangerous builds = 0 + +Total wall time: 0:00:01 diff --git a/examples/balance/log.3Nov23.balance.neigh.static.g++.2 b/examples/balance/log.3Nov23.balance.neigh.static.g++.2 new file mode 100644 index 0000000000..cbf49f60a3 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.neigh.static.g++.2 @@ -0,0 +1,229 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +balance 1.0 shift x 10 1.0 weight neigh 0.8 # out weighted_var.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +WARNING: Balance weight neigh skipped b/c no suitable list found (src/imbalance_neigh.cpp:65) + rebalancing time: 0.001 seconds + iteration count = 1 + neighbor weight factor: 0.8 + initial/final maximal load/proc = 2000 2000 + initial/final imbalance factor = 1 1 + x cuts: 0 0.5 1 + y cuts: 0 1 + z cuts: 0 1 + +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 +run 250 post no +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.294 | 4.485 | 4.675 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 1 -6.9453205 0 -5.4456955 -5.6812358 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 +Loop time of 1.05477 on 2 procs for 250 steps with 4000 atoms + +balance 1.0 shift x 10 1.0 weight neigh 0.8 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + initial/final maximal load/proc = 290759.2 262122.75 + initial/final imbalance factor = 1.1098226 1.0005178 + x cuts: 0 0.45166016 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 post no +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.305 | 4.492 | 4.68 Mbytes + Step Temp E_pair E_mol TotEng Press + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 + 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 + 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 + 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 + 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 +Loop time of 0.990985 on 2 procs for 250 steps with 4000 atoms + +balance 1.0 shift x 10 1.0 weight neigh 0.8 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + initial/final maximal load/proc = 296648 269015.55 + initial/final imbalance factor = 1.1064199 1.0033581 + x cuts: 0 0.50146055 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 post no +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.68 | 4.683 | 4.687 Mbytes + Step Temp E_pair E_mol TotEng Press + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 + 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 + 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 + 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 + 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 + 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 +Loop time of 1.1232 on 2 procs for 250 steps with 4000 atoms + +balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + time weight factor: 0.6 + initial/final maximal load/proc = 104.46537 103.82382 + initial/final imbalance factor = 1.0069898 1.0008056 + x cuts: 0 0.50292112 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.68 | 4.683 | 4.687 Mbytes + Step Temp E_pair E_mol TotEng Press + 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 + 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 + 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 + 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 + 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 +Loop time of 1.15642 on 2 procs for 250 steps with 4000 atoms + +Performance: 93391.614 tau/day, 216.184 timesteps/s, 864.737 katom-step/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.52315 | 0.69442 | 0.86569 | 20.6 | 60.05 +Neigh | 0.22259 | 0.24411 | 0.26564 | 4.4 | 21.11 +Comm | 0.018326 | 0.21127 | 0.40421 | 42.0 | 18.27 +Output | 0.00016238 | 0.00017728 | 0.00019218 | 0.0 | 0.02 +Modify | 0.0035271 | 0.0037599 | 0.0039926 | 0.4 | 0.33 +Other | | 0.002682 | | | 0.23 + +Nlocal: 2000 ave 2089 max 1911 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10407.5 ave 10557 max 10258 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 300836 ave 374828 max 226843 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 601671 +Ave neighs/atom = 150.41775 +Neighbor list builds = 25 +Dangerous builds = 0 +balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + time weight factor: 0.6 + initial/final maximal load/proc = 106.04939 103.43902 + initial/final imbalance factor = 1.027399 1.0021098 + x cuts: 0 0.49751864 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.68 | 4.683 | 4.687 Mbytes + Step Temp E_pair E_mol TotEng Press + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 + 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 + 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 + 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 + 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 + 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 +Loop time of 1.11479 on 2 procs for 250 steps with 4000 atoms + +Performance: 96878.885 tau/day, 224.257 timesteps/s, 897.027 katom-step/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.56649 | 0.69611 | 0.82573 | 15.5 | 62.44 +Neigh | 0.22969 | 0.24504 | 0.26039 | 3.1 | 21.98 +Comm | 0.021834 | 0.1669 | 0.31197 | 35.5 | 14.97 +Output | 0.00016211 | 0.00017676 | 0.00019141 | 0.0 | 0.02 +Modify | 0.0037327 | 0.0038431 | 0.0039535 | 0.2 | 0.34 +Other | | 0.002725 | | | 0.24 + +Nlocal: 2000 ave 2037 max 1963 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10391 ave 10488 max 10294 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 301104 ave 358020 max 244187 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 602207 +Ave neighs/atom = 150.55175 +Neighbor list builds = 25 +Dangerous builds = 0 + +Total wall time: 0:00:05 diff --git a/examples/balance/log.3Nov23.balance.neigh.static.g++.4 b/examples/balance/log.3Nov23.balance.neigh.static.g++.4 new file mode 100644 index 0000000000..bdefb0fe26 --- /dev/null +++ b/examples/balance/log.3Nov23.balance.neigh.static.g++.4 @@ -0,0 +1,229 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +variable factor index 1.0 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +balance 1.0 shift x 10 1.0 weight neigh 0.8 # out weighted_var.txt +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard +WARNING: Balance weight neigh skipped b/c no suitable list found (src/imbalance_neigh.cpp:65) + rebalancing time: 0.000 seconds + iteration count = 3 + neighbor weight factor: 0.8 + initial/final maximal load/proc = 1200 1000 + initial/final imbalance factor = 1.2 1 + x cuts: 0 0.25 0.5 0.71875 1 + y cuts: 0 1 + z cuts: 0 1 + +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 +run 250 post no +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.427 | 3.803 | 4.19 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 1 -6.9453205 0 -5.4456955 -5.6812358 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 +Loop time of 0.924459 on 4 procs for 250 steps with 4000 atoms + +balance 1.0 shift x 10 1.0 weight neigh 0.8 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + initial/final maximal load/proc = 220132 125739.5 + initial/final imbalance factor = 1.7583309 1.0043594 + x cuts: 0 0.30444336 0.45092773 0.62667847 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 post no +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.816 | 4 | 4.194 Mbytes + Step Temp E_pair E_mol TotEng Press + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 + 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 + 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 + 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 + 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 +Loop time of 0.82011 on 4 procs for 250 steps with 4000 atoms + +balance 1.0 shift x 10 1.0 weight neigh 0.8 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + initial/final maximal load/proc = 147108.8 128929.14 + initial/final imbalance factor = 1.1448665 1.0033843 + x cuts: 0 0.30487251 0.44992638 0.59526989 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 post no +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.833 | 4.019 | 4.211 Mbytes + Step Temp E_pair E_mol TotEng Press + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 + 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 + 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 + 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 + 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 + 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 +Loop time of 0.806894 on 4 procs for 250 steps with 4000 atoms + +balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + time weight factor: 0.6 + initial/final maximal load/proc = 91.655582 81.113803 + initial/final imbalance factor = 1.1338813 1.0034678 + x cuts: 0 0.31096364 0.44921811 0.58717948 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.834 | 4.019 | 4.211 Mbytes + Step Temp E_pair E_mol TotEng Press + 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 + 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 + 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 + 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 + 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 +Loop time of 0.838671 on 4 procs for 250 steps with 4000 atoms + +Performance: 128775.136 tau/day, 298.091 timesteps/s, 1.192 Matom-step/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.4301 | 0.47576 | 0.50889 | 4.2 | 56.73 +Neigh | 0.095175 | 0.16382 | 0.25893 | 17.5 | 19.53 +Comm | 0.06374 | 0.19306 | 0.30768 | 22.3 | 23.02 +Output | 0.00018141 | 0.0002071 | 0.00022587 | 0.0 | 0.02 +Modify | 0.0013564 | 0.0025114 | 0.0040356 | 2.3 | 0.30 +Other | | 0.00331 | | | 0.39 + +Nlocal: 1000 ave 1657 max 525 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 8683.75 ave 9705 max 8021 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 150170 ave 156480 max 144602 min +Histogram: 1 0 1 0 0 0 1 0 0 1 + +Total # of neighbors = 600681 +Ave neighs/atom = 150.17025 +Neighbor list builds = 25 +Dangerous builds = 0 +balance 1.0 shift x 10 1.0 weight neigh 0.8 weight time 0.6 +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + neighbor weight factor: 0.8 + time weight factor: 0.6 + initial/final maximal load/proc = 87.14477 84.253431 + initial/final imbalance factor = 1.045158 1.0104811 + x cuts: 0 0.31514908 0.45070011 0.58569747 1 + y cuts: 0 1 + z cuts: 0 1 +run 250 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 3.834 | 4.019 | 4.211 Mbytes + Step Temp E_pair E_mol TotEng Press + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 + 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 + 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 + 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 + 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 + 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 +Loop time of 0.836673 on 4 procs for 250 steps with 4000 atoms + +Performance: 129082.737 tau/day, 298.803 timesteps/s, 1.195 Matom-step/s +98.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.41798 | 0.47099 | 0.51203 | 5.9 | 56.29 +Neigh | 0.092957 | 0.16434 | 0.26021 | 18.1 | 19.64 +Comm | 0.060396 | 0.19529 | 0.32014 | 25.6 | 23.34 +Output | 0.00018905 | 0.00020907 | 0.00022197 | 0.0 | 0.02 +Modify | 0.0013271 | 0.0025202 | 0.0041052 | 2.4 | 0.30 +Other | | 0.003317 | | | 0.40 + +Nlocal: 1000 ave 1646 max 498 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 8671.25 ave 9741 max 7981 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 149995 ave 165511 max 135174 min +Histogram: 1 0 1 0 0 0 0 1 0 1 + +Total # of neighbors = 599979 +Ave neighs/atom = 149.99475 +Neighbor list builds = 25 +Dangerous builds = 0 + +Total wall time: 0:00:04 diff --git a/examples/balance/log.3Nov23.balance.var.dynamic.g++.2 b/examples/balance/log.3Nov23.balance.var.dynamic.g++.2 new file mode 100644 index 0000000000..2bb94e335f --- /dev/null +++ b/examples/balance/log.3Nov23.balance.var.dynamic.g++.2 @@ -0,0 +1,268 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 2 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +compute p all property/atom d_WEIGHT + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.001 seconds + iteration count = 10 + group weights: fast=0.8 slow=2.5 + storing weight in atom property d_WEIGHT + initial/final maximal load/proc = 2960 3120 + initial/final imbalance factor = 1.0609319 1.1182796 + x cuts: 0 0.44970703 1 + y cuts: 0 1 + z cuts: 0 1 +variable lastweight atom c_p + +fix 0 all balance 50 1.0 shift x 10 1.0 weight var lastweight weight time 0.5 weight store WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.709 | 4.878 | 5.046 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.49578514 -6.1929216 0 -5.4494298 -1.6668039 4738.2137 + 100 0.53275389 -6.2475932 0 -5.4486622 -1.9063885 4738.2137 + 150 0.53316457 -6.2483202 0 -5.4487733 -1.9476162 4738.2137 + 200 0.536665 -6.2530113 0 -5.448215 -1.933468 4738.2137 + 250 0.55006273 -6.27163 0 -5.4467422 -2.0438847 4738.2137 + 300 0.55111476 -6.2727642 0 -5.4462987 -2.0384873 4738.2137 + 350 0.55211503 -6.274054 0 -5.4460885 -2.0116976 4738.2137 + 400 0.54638463 -6.2661715 0 -5.4467995 -1.992248 4738.2137 + 450 0.55885307 -6.2852263 0 -5.4471563 -2.0669747 4738.2137 + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 +Loop time of 2.63649 on 2 procs for 500 steps with 4000 atoms + +Performance: 81926.988 tau/day, 189.646 timesteps/s, 758.583 katom-step/s +99.0% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.71463 | 1.3382 | 1.9618 | 53.9 | 50.76 +Neigh | 0.37719 | 0.49388 | 0.61056 | 16.6 | 18.73 +Comm | 0.047367 | 0.78842 | 1.5295 | 83.5 | 29.90 +Output | 0.00033203 | 0.00036767 | 0.0004033 | 0.0 | 0.01 +Modify | 0.0083865 | 0.0094362 | 0.010486 | 1.1 | 0.36 +Other | | 0.006199 | | | 0.24 + +Nlocal: 2000 ave 2603 max 1397 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10434 ave 11430 max 9438 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 298070 ave 500187 max 95952 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 596139 +Ave neighs/atom = 149.03475 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 5.094 | 5.463 | 5.832 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 500 0.54587069 -6.2662849 0 -5.4476836 -2.0078802 4738.2137 + 550 0.54137926 -6.2592773 0 -5.4474115 -1.9770236 4738.2137 + 600 0.54022886 -6.2573307 0 -5.44719 -1.9619637 4738.2137 + 650 0.54709009 -6.2678862 0 -5.4474562 -1.9958342 4738.2137 + 700 0.54590044 -6.2656903 0 -5.4470444 -1.9957108 4738.2137 + 750 0.55098488 -6.2724831 0 -5.4462124 -2.0287523 4738.2137 + 800 0.5520987 -6.2739184 0 -5.4459774 -2.0084991 4738.2137 + 850 0.54963958 -6.2702473 0 -5.445994 -1.9740031 4738.2137 + 900 0.54390586 -6.2615476 0 -5.4458927 -1.9400871 4738.2137 + 950 0.54741732 -6.2665755 0 -5.4456548 -1.9466417 4738.2137 + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 +Loop time of 3.17842 on 2 procs for 500 steps with 4000 atoms + +Performance: 67958.372 tau/day, 157.311 timesteps/s, 629.244 katom-step/s +98.1% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.37522 | 1.3792 | 2.3831 | 85.5 | 43.39 +Neigh | 0.27684 | 0.50251 | 0.72818 | 31.8 | 15.81 +Comm | 0.046802 | 1.2782 | 2.5097 | 108.9 | 40.22 +Output | 0.00037247 | 0.00037744 | 0.00038242 | 0.0 | 0.01 +Modify | 0.0074902 | 0.010381 | 0.013273 | 2.8 | 0.33 +Other | | 0.007739 | | | 0.24 + +Nlocal: 2000 ave 2773 max 1227 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10234 ave 11398 max 9070 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 300836 ave 527715 max 73956 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 601671 +Ave neighs/atom = 150.41775 +Neighbor list builds = 51 +Dangerous builds = 0 + +balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + group weights: fast=0.8 slow=2.5 + storing weight in atom property d_WEIGHT + initial/final maximal load/proc = 4598.4 2803.1 + initial/final imbalance factor = 1.648172 1.0046953 + x cuts: 0 0.45499213 1 + y cuts: 0 1 + z cuts: 0 1 + +fix 0 all balance 50 1.0 shift x 5 1.0 weight var lastweight weight neigh 0.5 weight store WEIGHT + +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 5.483 | 5.66 | 5.837 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1000 0.54200867 -6.2591246 0 -5.4463148 -1.8881624 4738.2137 + 1050 0.54633412 -6.2656384 0 -5.4463421 -1.9012895 4738.2137 + 1100 0.54325667 -6.2612166 0 -5.4465353 -1.8870463 4738.2137 + 1150 0.55057583 -6.2719187 0 -5.4462614 -1.9575881 4738.2137 + 1200 0.53728175 -6.251744 0 -5.4460228 -1.8124097 4738.2137 + 1250 0.54077561 -6.2567544 0 -5.4457938 -1.8418134 4738.2137 + 1300 0.54430333 -6.260995 0 -5.4447442 -1.856351 4738.2137 + 1350 0.55097839 -6.2715909 0 -5.4453299 -1.9014337 4738.2137 + 1400 0.53858139 -6.2526781 0 -5.445008 -1.7965773 4738.2137 + 1450 0.54218439 -6.2574683 0 -5.444395 -1.7901189 4738.2137 + 1500 0.54200616 -6.2571433 0 -5.4443373 -1.8000345 4738.2137 +Loop time of 3.02969 on 2 procs for 500 steps with 4000 atoms + +Performance: 71294.507 tau/day, 165.034 timesteps/s, 660.134 katom-step/s +98.7% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.5714 | 1.3936 | 2.2158 | 69.6 | 46.00 +Neigh | 0.2744 | 0.51127 | 0.74814 | 33.1 | 16.88 +Comm | 0.046434 | 1.1076 | 2.1688 | 100.8 | 36.56 +Output | 0.00031672 | 0.00037175 | 0.00042678 | 0.0 | 0.01 +Modify | 0.0066955 | 0.0094869 | 0.012278 | 2.9 | 0.31 +Other | | 0.007313 | | | 0.24 + +Nlocal: 2000 ave 3014 max 986 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10343 ave 12125 max 8561 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 302958 ave 519610 max 86307 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 605917 +Ave neighs/atom = 151.47925 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 5.864 | 5.882 | 5.899 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1500 0.54200616 -6.2571433 0 -5.4443373 -1.8000345 4738.2137 + 1550 0.5371361 -6.2504031 0 -5.4449003 -1.7647032 4738.2137 + 1600 0.54679571 -6.2646443 0 -5.4446558 -1.8115722 4738.2137 + 1650 0.53806589 -6.2519009 0 -5.4450038 -1.740915 4738.2137 + 1700 0.53479448 -6.2469033 0 -5.4449122 -1.7162445 4738.2137 + 1750 0.53714069 -6.2506511 0 -5.4451415 -1.734019 4738.2137 + 1800 0.52750498 -6.2358815 0 -5.4448219 -1.6875349 4738.2137 + 1850 0.54585338 -6.2629367 0 -5.4443613 -1.7758582 4738.2137 + 1900 0.53011122 -6.2387673 0 -5.4437993 -1.6382079 4738.2137 + 1950 0.5428773 -6.2583146 0 -5.4442022 -1.7367714 4738.2137 + 2000 0.52771538 -6.2349676 0 -5.4435924 -1.5594006 4738.2137 +Loop time of 3.18739 on 2 procs for 500 steps with 4000 atoms + +Performance: 67767.083 tau/day, 156.868 timesteps/s, 627.473 katom-step/s +98.5% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.39584 | 1.3793 | 2.3628 | 83.7 | 43.27 +Neigh | 0.21951 | 0.48818 | 0.75684 | 38.5 | 15.32 +Comm | 0.047346 | 1.3021 | 2.5568 | 110.0 | 40.85 +Output | 0.00031641 | 0.00037624 | 0.00043608 | 0.0 | 0.01 +Modify | 0.0061382 | 0.0096203 | 0.013102 | 3.6 | 0.30 +Other | | 0.007838 | | | 0.25 + +Nlocal: 2000 ave 3033 max 967 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 10266 ave 12244 max 8288 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 303996 ave 525260 max 82733 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 607993 +Ave neighs/atom = 151.99825 +Neighbor list builds = 51 +Dangerous builds = 0 +Total wall time: 0:00:12 diff --git a/examples/balance/log.3Nov23.balance.var.dynamic.g++.4 b/examples/balance/log.3Nov23.balance.var.dynamic.g++.4 new file mode 100644 index 0000000000..8ab61a6eca --- /dev/null +++ b/examples/balance/log.3Nov23.balance.var.dynamic.g++.4 @@ -0,0 +1,268 @@ +LAMMPS (3 Aug 2023 - Development - patch_2Aug2023-790-g0fbe388cbd) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic +processors * 1 1 + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 3 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 4 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +Setting atom values ... + 1400 settings made for type + +velocity all create 1.0 87287 + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_coeff * 2 1.0 1.0 5.0 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes +fix p all property/atom d_WEIGHT +compute p all property/atom d_WEIGHT + +group fast type 1 +2600 atoms in group fast +group slow type 2 +1400 atoms in group slow +balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 2 steps, delay = 4 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.3 + ghost atom cutoff = 5.3 + binsize = 2.65, bins = 7 7 7 + 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 + bin: standard + rebalancing time: 0.001 seconds + iteration count = 10 + group weights: fast=0.8 slow=2.5 + storing weight in atom property d_WEIGHT + initial/final maximal load/proc = 2160 1620 + initial/final imbalance factor = 1.5483871 1.1612903 + x cuts: 0 0.30004883 0.44995117 0.59985352 1 + y cuts: 0 1 + z cuts: 0 1 +variable lastweight atom c_p + +fix 0 all balance 50 1.0 shift x 10 1.0 weight var lastweight weight time 0.5 weight store WEIGHT +variable maximb equal f_0[1] +variable iter equal f_0[2] +variable prev equal f_0[3] +variable final equal f_0 + +#fix 3 all print 50 "${iter} ${prev} ${final} ${maximb}" + +fix 1 all nve + +#dump id all atom 50 dump.melt +#dump id all custom 50 dump.lammpstrj id type x y z c_p + +#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 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.134 | 4.194 | 4.276 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 0 1 -6.9453205 0 -5.4456955 -5.6812358 4738.2137 + 50 0.48653399 -6.1788509 0 -5.4492324 -1.6017778 4738.2137 + 100 0.53411175 -6.249885 0 -5.4489177 -1.9317606 4738.2137 + 150 0.53646658 -6.2527206 0 -5.4482219 -1.9689568 4738.2137 + 200 0.54551611 -6.2656326 0 -5.4475631 -2.0042104 4738.2137 + 250 0.54677719 -6.2671162 0 -5.4471555 -2.0015995 4738.2137 + 300 0.5477618 -6.2678071 0 -5.4463698 -1.997842 4738.2137 + 350 0.55600296 -6.2801497 0 -5.4463538 -2.0394056 4738.2137 + 400 0.53241503 -6.2453665 0 -5.4469436 -1.878594 4738.2137 + 450 0.5439158 -6.2623 0 -5.4466302 -1.9744161 4738.2137 + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 +Loop time of 1.75963 on 4 procs for 500 steps with 4000 atoms + +Performance: 122752.823 tau/day, 284.150 timesteps/s, 1.137 Matom-step/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.68268 | 0.90239 | 1.1178 | 21.1 | 51.28 +Neigh | 0.14555 | 0.31884 | 0.53079 | 30.7 | 18.12 +Comm | 0.1258 | 0.52379 | 0.91801 | 51.5 | 29.77 +Output | 0.00034604 | 0.00041026 | 0.00047658 | 0.0 | 0.02 +Modify | 0.004958 | 0.0071987 | 0.010065 | 2.7 | 0.41 +Other | | 0.007007 | | | 0.40 + +Nlocal: 1000 ave 1818 max 353 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 8752 ave 10126 max 7737 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Neighs: 149308 ave 201250 max 96144 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 597231 +Ave neighs/atom = 149.30775 +Neighbor list builds = 50 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.136 | 4.388 | 4.665 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 500 0.55526241 -6.2793396 0 -5.4466542 -2.0595015 4738.2137 + 550 0.53879347 -6.2554274 0 -5.4474393 -1.9756834 4738.2137 + 600 0.54275982 -6.2616799 0 -5.4477437 -1.9939993 4738.2137 + 650 0.54526651 -6.265098 0 -5.4474027 -2.0303672 4738.2137 + 700 0.54369381 -6.263201 0 -5.4478642 -1.9921967 4738.2137 + 750 0.54452777 -6.2640839 0 -5.4474964 -1.9658675 4738.2137 + 800 0.55061744 -6.2725556 0 -5.4468359 -2.0100922 4738.2137 + 850 0.55371614 -6.2763992 0 -5.4460326 -2.0065329 4738.2137 + 900 0.54756622 -6.2668303 0 -5.4456863 -1.9796122 4738.2137 + 950 0.54791593 -6.2673161 0 -5.4456477 -1.9598278 4738.2137 + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 +Loop time of 2.16561 on 4 procs for 500 steps with 4000 atoms + +Performance: 99740.900 tau/day, 230.882 timesteps/s, 923.527 katom-step/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.50258 | 0.94516 | 1.4087 | 45.5 | 43.64 +Neigh | 0.11215 | 0.35365 | 0.65108 | 40.8 | 16.33 +Comm | 0.087035 | 0.85049 | 1.5351 | 74.3 | 39.27 +Output | 0.00038778 | 0.00044723 | 0.00047387 | 0.0 | 0.02 +Modify | 0.0047248 | 0.0077357 | 0.011417 | 3.4 | 0.36 +Other | | 0.008132 | | | 0.38 + +Nlocal: 1000 ave 1913 max 271 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 8713.25 ave 10520 max 7313 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Neighs: 150170 ave 225174 max 74461 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 600678 +Ave neighs/atom = 150.1695 +Neighbor list builds = 53 +Dangerous builds = 0 + +balance 1.0 shift x 10 1.0 weight group 2 fast 0.8 slow 2.5 weight store WEIGHT +Balancing ... +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule + rebalancing time: 0.000 seconds + iteration count = 10 + group weights: fast=0.8 slow=2.5 + storing weight in atom property d_WEIGHT + initial/final maximal load/proc = 2263.1 1415 + initial/final imbalance factor = 1.6222939 1.0143369 + x cuts: 0 0.33693529 0.45444001 0.59634919 1 + y cuts: 0 1 + z cuts: 0 1 + +fix 0 all balance 50 1.0 shift x 5 1.0 weight var lastweight weight neigh 0.5 weight store WEIGHT + +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.136 | 4.391 | 4.67 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1000 0.54173198 -6.2586101 0 -5.4462153 -1.9007466 4738.2137 + 1050 0.54629742 -6.2657526 0 -5.4465113 -1.945821 4738.2137 + 1100 0.55427881 -6.2781733 0 -5.446963 -2.0021027 4738.2137 + 1150 0.54730654 -6.267257 0 -5.4465025 -1.9420678 4738.2137 + 1200 0.5388281 -6.2547963 0 -5.4467562 -1.890178 4738.2137 + 1250 0.54848768 -6.2694237 0 -5.4468979 -1.9636797 4738.2137 + 1300 0.54134321 -6.2590728 0 -5.447261 -1.917027 4738.2137 + 1350 0.53564389 -6.2501521 0 -5.4468871 -1.8642306 4738.2137 + 1400 0.53726925 -6.2518379 0 -5.4461355 -1.8544028 4738.2137 + 1450 0.54525929 -6.2632653 0 -5.4455808 -1.9072158 4738.2137 + 1500 0.5422334 -6.2591056 0 -5.4459588 -1.8866983 4738.2137 +Loop time of 2.13466 on 4 procs for 500 steps with 4000 atoms + +Performance: 101187.057 tau/day, 234.229 timesteps/s, 936.917 katom-step/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.51842 | 0.95273 | 1.4498 | 43.3 | 44.63 +Neigh | 0.10961 | 0.34434 | 0.60309 | 39.3 | 16.13 +Comm | 0.12298 | 0.82248 | 1.494 | 71.8 | 38.53 +Output | 0.00035703 | 0.00041491 | 0.00044876 | 0.0 | 0.02 +Modify | 0.0041412 | 0.0071285 | 0.010464 | 3.4 | 0.33 +Other | | 0.007562 | | | 0.35 + +Nlocal: 1000 ave 1957 max 197 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Nghost: 8729 ave 10470 max 7399 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Neighs: 150494 ave 251670 max 54014 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 601974 +Ave neighs/atom = 150.4935 +Neighbor list builds = 51 +Dangerous builds = 0 +run 500 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 4.138 | 4.391 | 4.67 Mbytes + Step Temp E_pair E_mol TotEng Press Volume + 1500 0.5422334 -6.2591056 0 -5.4459588 -1.8866983 4738.2137 + 1550 0.55327047 -6.2750129 0 -5.4453147 -1.9506601 4738.2137 + 1600 0.54419057 -6.2612631 0 -5.4451813 -1.8559469 4738.2137 + 1650 0.5471001 -6.2661978 0 -5.4457528 -1.888283 4738.2137 + 1700 0.53665427 -6.250492 0 -5.4457118 -1.8067906 4738.2137 + 1750 0.54864956 -6.26812 0 -5.4453514 -1.8662931 4738.2137 + 1800 0.54476992 -6.2615116 0 -5.444561 -1.8353034 4738.2137 + 1850 0.54143122 -6.255562 0 -5.4436182 -1.8005828 4738.2137 + 1900 0.539946 -6.2541877 0 -5.4444712 -1.7770616 4738.2137 + 1950 0.54665381 -6.2641025 0 -5.4443268 -1.7946294 4738.2137 + 2000 0.54548936 -6.2623904 0 -5.4443609 -1.8063359 4738.2137 +Loop time of 2.41945 on 4 procs for 500 steps with 4000 atoms + +Performance: 89276.563 tau/day, 206.659 timesteps/s, 826.635 katom-step/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.27258 | 0.93844 | 1.5963 | 67.8 | 38.79 +Neigh | 0.066471 | 0.37001 | 0.71699 | 50.0 | 15.29 +Comm | 0.087137 | 1.095 | 2.0664 | 92.0 | 45.26 +Output | 0.00036093 | 0.00042589 | 0.00046706 | 0.0 | 0.02 +Modify | 0.0037164 | 0.0072792 | 0.011595 | 4.2 | 0.30 +Other | | 0.008293 | | | 0.34 + +Nlocal: 1000 ave 2047 max 120 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Nghost: 8721.75 ave 10454 max 7446 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Neighs: 151641 ave 268854 max 34056 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 606565 +Ave neighs/atom = 151.64125 +Neighbor list builds = 56 +Dangerous builds = 0 +Total wall time: 0:00:08 From 3d3b07f0d410f3f553125d0b7ffa0a5f31eea07a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 3 Nov 2023 22:39:42 -0400 Subject: [PATCH 328/417] consolidate nb3b pair style docs --- doc/src/Commands_pair.rst | 4 ++-- doc/src/{pair_nb3b_harmonic.rst => pair_nb3b.rst} | 0 doc/src/pair_style.rst | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename doc/src/{pair_nb3b_harmonic.rst => pair_nb3b.rst} (100%) diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index 1b98bbad47..828f0b10d9 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -220,8 +220,8 @@ OPT. * :doc:`morse/soft ` * :doc:`multi/lucy ` * :doc:`multi/lucy/rx (k) ` - * :doc:`nb3b/harmonic ` - * :doc:`nb3b/screened ` + * :doc:`nb3b/harmonic ` + * :doc:`nb3b/screened ` * :doc:`nm/cut (o) ` * :doc:`nm/cut/coul/cut (o) ` * :doc:`nm/cut/coul/long (o) ` diff --git a/doc/src/pair_nb3b_harmonic.rst b/doc/src/pair_nb3b.rst similarity index 100% rename from doc/src/pair_nb3b_harmonic.rst rename to doc/src/pair_nb3b.rst diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index 9c3a65514a..a2467bff2b 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -297,8 +297,8 @@ accelerated styles exist. * :doc:`morse/soft ` - Morse potential with a soft core * :doc:`multi/lucy ` - DPD potential with density-dependent force * :doc:`multi/lucy/rx ` - reactive DPD potential with density-dependent force -* :doc:`nb3b/harmonic ` - non-bonded 3-body harmonic potential -* :doc:`nb3b/screened ` - non-bonded 3-body screened harmonic potential +* :doc:`nb3b/harmonic ` - non-bonded 3-body harmonic potential +* :doc:`nb3b/screened ` - non-bonded 3-body screened harmonic potential * :doc:`nm/cut ` - N-M potential * :doc:`nm/cut/coul/cut ` - N-M potential with cutoff Coulomb * :doc:`nm/cut/coul/long ` - N-M potential with long-range Coulomb From 17640f54d2a43a71f4bd8bdc5e333575afec5548 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sat, 4 Nov 2023 17:53:19 -0400 Subject: [PATCH 329/417] reset warnflag for each run --- src/fix_deposit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index 6dea4a0932..4a9c5aa9da 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -232,6 +232,8 @@ int FixDeposit::setmask() void FixDeposit::init() { + warnflag = 1; + // set index and check validity of region iregion = domain->get_region_by_id(idregion); From 6fef7871e8dd1639140fd1cba41fc7c27fae8be0 Mon Sep 17 00:00:00 2001 From: yury-lysogorskiy Date: Tue, 7 Nov 2023 16:46:47 +0100 Subject: [PATCH 330/417] Update pair_pace_extrapolation.cpp BUGFIX: pair_pace_extrapolation: setup flag aceimpl->ace->compute_projections = true before computing extrapolation grade --- src/ML-PACE/pair_pace_extrapolation.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 8a0116526a..dc0fb1848b 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -202,8 +202,10 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) // jnum(0) = 50 // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] try { - if (flag_compute_extrapolation_grade) + if (flag_compute_extrapolation_grade) { + aceimpl->ace->compute_projections = true; aceimpl->ace->compute_atom(i, x, type, jnum, jlist); + } else aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); } catch (std::exception &e) { From 46768d0ff3dd2a201afb4d78400d92b6d467b8a2 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 6 Nov 2023 23:18:42 -0700 Subject: [PATCH 331/417] Correctly build argv with nullptr at the end --- src/angle_write.cpp | 8 +- src/dihedral_write.cpp | 8 +- src/lammps.cpp | 23 +++++ src/lammps.h | 6 ++ unittest/c-library/test_library_commands.cpp | 5 +- unittest/c-library/test_library_config.cpp | 5 +- unittest/c-library/test_library_external.cpp | 8 +- unittest/c-library/test_library_mpi.cpp | 20 ++-- unittest/c-library/test_library_open.cpp | 20 ++-- .../c-library/test_library_properties.cpp | 13 +-- .../c-library/test_library_scatter_gather.cpp | 5 +- unittest/commands/test_mpi_load_balancing.cpp | 6 +- unittest/cplusplus/test_input_class.cpp | 15 ++- unittest/cplusplus/test_lammps_class.cpp | 52 +++++------ unittest/force-styles/test_angle_style.cpp | 44 +++------ unittest/force-styles/test_bond_style.cpp | 44 +++------ unittest/force-styles/test_dihedral_style.cpp | 32 +++---- unittest/force-styles/test_fix_timestep.cpp | 30 +++--- unittest/force-styles/test_improper_style.cpp | 30 +++--- unittest/force-styles/test_pair_style.cpp | 92 +++++++------------ unittest/fortran/wrap_extract_variable.cpp | 4 +- unittest/testing/core.h | 20 +--- 22 files changed, 207 insertions(+), 283 deletions(-) diff --git a/src/angle_write.cpp b/src/angle_write.cpp index e64c2f23c8..fb0e65ccf5 100644 --- a/src/angle_write.cpp +++ b/src/angle_write.cpp @@ -123,11 +123,9 @@ void AngleWrite::command(int narg, char **arg) if (comm->me == 0) { // set up new LAMMPS instance with dummy system to evaluate angle potential - const char *args[] = {"AngleWrite", "-nocite", "-echo", "none", - "-log", "none", "-screen", "none"}; - char **argv = (char **) args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *writer = new LAMMPS(argc, argv, singlecomm); + LAMMPS::argv args = {"AngleWrite", "-nocite", "-echo", "none", + "-log", "none", "-screen", "none"}; + LAMMPS *writer = new LAMMPS(args, singlecomm); // create dummy system replicating angle style settings writer->input->one(fmt::format("units {}", update->unit_style)); diff --git a/src/dihedral_write.cpp b/src/dihedral_write.cpp index 285d9cf931..3d87591bcc 100644 --- a/src/dihedral_write.cpp +++ b/src/dihedral_write.cpp @@ -124,12 +124,8 @@ void DihedralWrite::command(int narg, char **arg) if (comm->me == 0) { // set up new LAMMPS instance with dummy system to evaluate dihedral potential - // const char *args[] = {"DihedralWrite", "-nocite", "-echo", "none", - // "-log", "none", "-screen", "none"}; - const char *args[] = {"DihedralWrite", "-nocite", "-echo", "screen", "-log", "none"}; - char **argv = (char **) args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *writer = new LAMMPS(argc, argv, singlecomm); + LAMMPS::argv args = {"DihedralWrite", "-nocite", "-echo", "screen", "-log", "none"}; + LAMMPS *writer = new LAMMPS(args, singlecomm); // create dummy system replicating dihedral style settings writer->input->one(fmt::format("units {}", update->unit_style)); diff --git a/src/lammps.cpp b/src/lammps.cpp index 6fc06521d1..c0336ee588 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -107,6 +107,15 @@ using namespace LAMMPS_NS; * The specifics of setting up and running a simulation are handled by the * individual component class instances. */ +/** Create a LAMMPS simulation instance + * + * \param args list of arguments + * \param communicator MPI communicator used by this LAMMPS instance + */ +LAMMPS::LAMMPS(argv & args, MPI_Comm communicator) : + LAMMPS(args.size(), argv_pointers(args).data(), communicator) { +} + /** Create a LAMMPS simulation instance * * The LAMMPS constructor starts up a simulation by allocating all @@ -1464,3 +1473,17 @@ void LAMMPS::print_config(FILE *fp) } fputs("\n\n",fp); } + +/** Create vector of argv string pointers including terminating nullptr element + * + * \param args list of arguments + */ +std::vector LAMMPS::argv_pointers(argv & args){ + std::vector r; + r.reserve(args.size()+1); + for(auto & a : args) { + r.push_back((char*)a.data()); + } + r.push_back(nullptr); + return r; +} diff --git a/src/lammps.h b/src/lammps.h index 05a215eeac..4ec3f384d9 100644 --- a/src/lammps.h +++ b/src/lammps.h @@ -16,6 +16,8 @@ #include #include +#include +#include namespace LAMMPS_NS { @@ -84,6 +86,10 @@ class LAMMPS { static const char *git_branch(); static const char *git_descriptor(); + using argv = std::vector; + static std::vector argv_pointers(argv & args); + + LAMMPS(argv & args, MPI_Comm); LAMMPS(int, char **, MPI_Comm); ~LAMMPS() noexcept(false); void create(); diff --git a/unittest/c-library/test_library_commands.cpp b/unittest/c-library/test_library_commands.cpp index d4e326cd36..31f8268a8f 100644 --- a/unittest/c-library/test_library_commands.cpp +++ b/unittest/c-library/test_library_commands.cpp @@ -26,10 +26,11 @@ protected: void SetUp() override { const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", - "-var", "x", "2", "-var", "zpos", "1.5"}; + "-var", "x", "2", "-var", "zpos", "1.5", + nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); lmp = lammps_open_no_mpi(argc, argv, nullptr); diff --git a/unittest/c-library/test_library_config.cpp b/unittest/c-library/test_library_config.cpp index 78d6439c17..64a5ee89be 100644 --- a/unittest/c-library/test_library_config.cpp +++ b/unittest/c-library/test_library_config.cpp @@ -29,10 +29,11 @@ protected: { const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", - "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER)}; + "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER), + nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); lmp = lammps_open_no_mpi(argc, argv, nullptr); diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 57d3bef080..9011ac19a8 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -64,9 +64,9 @@ static void callback(void *handle, step_t timestep, int nlocal, tag_t *, double TEST(lammps_external, callback) { - const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + const char *args[] = {"liblammps", "-log", "none", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *handle = lammps_open_no_mpi(argc, argv, nullptr); @@ -131,9 +131,9 @@ TEST(lammps_external, callback) TEST(lammps_external, array) { - const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + const char *args[] = {"liblammps", "-log", "none", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *handle = lammps_open_no_mpi(argc, argv, nullptr); diff --git a/unittest/c-library/test_library_mpi.cpp b/unittest/c-library/test_library_mpi.cpp index 1609107ae0..f60105a229 100644 --- a/unittest/c-library/test_library_mpi.cpp +++ b/unittest/c-library/test_library_mpi.cpp @@ -34,9 +34,9 @@ TEST(MPI, global_box) int boxflag; ::testing::internal::CaptureStdout(); - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite"}; + const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; void *lmp = lammps_open(argc, argv, MPI_COMM_WORLD, nullptr); lammps_command(lmp, "units lj"); lammps_command(lmp, "atom_style atomic"); @@ -77,9 +77,9 @@ TEST(MPI, sub_box) int boxflag; ::testing::internal::CaptureStdout(); - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite"}; + const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; void *lmp = lammps_open(argc, argv, MPI_COMM_WORLD, nullptr); lammps_command(lmp, "units lj"); lammps_command(lmp, "atom_style atomic"); @@ -143,9 +143,9 @@ TEST(MPI, split_comm) MPI_Comm_split(MPI_COMM_WORLD, color, key, &newcomm); - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite"}; + const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; void *lmp = lammps_open(argc, argv, newcomm, nullptr); lammps_command(lmp, "units lj"); lammps_command(lmp, "atom_style atomic"); @@ -173,9 +173,9 @@ TEST(MPI, multi_partition) MPI_Comm_rank(MPI_COMM_WORLD, &me); const char *args[] = {"LAMMPS_test", "-log", "none", "-partition", "4x1", - "-echo", "screen", "-nocite", "-in", "none"}; + "-echo", "screen", "-nocite", "-in", "none", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; void *lmp = lammps_open(argc, argv, MPI_COMM_WORLD, nullptr); lammps_command(lmp, "units lj"); @@ -205,9 +205,9 @@ protected: void SetUp() override { - const char *args[] = {testbinary, "-log", "none", "-echo", "screen", "-nocite"}; + const char *args[] = {testbinary, "-log", "none", "-echo", "screen", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; if (!verbose) ::testing::internal::CaptureStdout(); lmp = lammps_open(argc, argv, MPI_COMM_WORLD, nullptr); InitSystem(); diff --git a/unittest/c-library/test_library_open.cpp b/unittest/c-library/test_library_open.cpp index 1cd65d843d..267f8e0978 100644 --- a/unittest/c-library/test_library_open.cpp +++ b/unittest/c-library/test_library_open.cpp @@ -39,9 +39,9 @@ TEST(lammps_open, null_args) TEST(lammps_open, with_args) { - const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + const char *args[] = {"liblammps", "-log", "none", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; // MPI is already initialized MPI_Comm mycomm; @@ -78,9 +78,9 @@ TEST(lammps_open, with_args) TEST(lammps_open, with_kokkos) { if (!LAMMPS_NS::LAMMPS::is_installed_pkg("KOKKOS")) GTEST_SKIP(); - const char *args[] = {"liblammps", "-k", "on", "t", "2", "-sf", "kk", "-log", "none"}; + const char *args[] = {"liblammps", "-k", "on", "t", "2", "-sf", "kk", "-log", "none", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *alt_ptr; @@ -108,9 +108,9 @@ TEST(lammps_open, with_kokkos) TEST(lammps_open_no_mpi, no_screen) { - const char *args[] = {"liblammps", "-log", "none", "-screen", "none", "-nocite"}; + const char *args[] = {"liblammps", "-log", "none", "-screen", "none", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *alt_ptr; @@ -139,9 +139,9 @@ TEST(lammps_open_no_mpi, with_omp) { if (!LAMMPS_NS::LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); const char *args[] = {"liblammps", "-pk", "omp", "2", "neigh", "no", - "-sf", "omp", "-log", "none", "-nocite"}; + "-sf", "omp", "-log", "none", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *alt_ptr; @@ -201,9 +201,9 @@ TEST(lammps_open_fortran, no_args) TEST(lammps_open_no_mpi, lammps_error) { - const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + const char *args[] = {"liblammps", "-log", "none", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *alt_ptr; diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 0c5ad2c809..40d0d08575 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -33,10 +33,11 @@ protected: { const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", - "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER)}; + "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER), + nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); lmp = lammps_open_no_mpi(argc, argv, nullptr); @@ -551,10 +552,10 @@ protected: void SetUp() override { - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite"}; + const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); lmp = lammps_open_no_mpi(argc, argv, nullptr); @@ -632,10 +633,10 @@ TEST(SystemSettings, kokkos) // clang-format off const char *args[] = {"SystemSettings", "-log", "none", "-echo", "screen", "-nocite", - "-k", "on", "t", "4", "-sf", "kk"}; + "-k", "on", "t", "4", "-sf", "kk", nullptr}; // clang-format on char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); void *lmp = lammps_open_no_mpi(argc, argv, nullptr); diff --git a/unittest/c-library/test_library_scatter_gather.cpp b/unittest/c-library/test_library_scatter_gather.cpp index ee672c9b86..0303a47337 100644 --- a/unittest/c-library/test_library_scatter_gather.cpp +++ b/unittest/c-library/test_library_scatter_gather.cpp @@ -32,10 +32,11 @@ protected: { const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", - "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER)}; + "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER), + nullptr}; char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + int argc = (sizeof(args) / sizeof(char *)) - 1; ::testing::internal::CaptureStdout(); lmp = lammps_open_no_mpi(argc, argv, nullptr); diff --git a/unittest/commands/test_mpi_load_balancing.cpp b/unittest/commands/test_mpi_load_balancing.cpp index bc5f07beb1..efdee8c4eb 100644 --- a/unittest/commands/test_mpi_load_balancing.cpp +++ b/unittest/commands/test_mpi_load_balancing.cpp @@ -33,11 +33,9 @@ protected: void SetUp() override { - const char *args[] = {testbinary, "-log", "none", "-echo", "screen", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {testbinary, "-log", "none", "-echo", "screen", "-nocite"}; if (!verbose) ::testing::internal::CaptureStdout(); - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); InitSystem(); if (!verbose) ::testing::internal::GetCapturedStdout(); } diff --git a/unittest/cplusplus/test_input_class.cpp b/unittest/cplusplus/test_input_class.cpp index 6595c24695..708d3f7cae 100644 --- a/unittest/cplusplus/test_input_class.cpp +++ b/unittest/cplusplus/test_input_class.cpp @@ -8,6 +8,7 @@ #include #include +#include "../testing/utils.h" #include "gtest/gtest.h" const char *demo_input[] = {"region box block 0 $x 0 2 0 2", "create_box 1 box", @@ -21,9 +22,9 @@ protected: LAMMPS *lmp; Input_commands() { - const char *args[] = {"LAMMPS_test"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + const char * args[] = {"LAMMPS_test", nullptr}; + char ** argv = (char**)args; + int argc = 1; int flag; MPI_Initialized(&flag); @@ -33,13 +34,11 @@ protected: void SetUp() override { - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", - "-var", "zpos", "1.5", "-var", "x", "2"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite", + "-var", "zpos", "1.5", "-var", "x", "2"}; ::testing::internal::CaptureStdout(); - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); } diff --git a/unittest/cplusplus/test_lammps_class.cpp b/unittest/cplusplus/test_lammps_class.cpp index 64ce1eefb1..6f279fc96c 100644 --- a/unittest/cplusplus/test_lammps_class.cpp +++ b/unittest/cplusplus/test_lammps_class.cpp @@ -21,9 +21,9 @@ protected: LAMMPS *lmp; LAMMPS_plain() : lmp(nullptr) { - const char *args[] = {"LAMMPS_test"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + const char * args[] = {"LAMMPS_test", nullptr}; + char ** argv = (char**)args; + int argc = 1; int flag; MPI_Initialized(&flag); @@ -34,12 +34,10 @@ protected: void SetUp() override { - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "both", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"LAMMPS_test", "-log", "none", "-echo", "both", "-nocite"}; ::testing::internal::CaptureStdout(); - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_THAT(output, StartsWith("LAMMPS (")); } @@ -159,9 +157,9 @@ protected: LAMMPS *lmp; LAMMPS_omp() : lmp(nullptr) { - const char *args[] = {"LAMMPS_test"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + const char * args[] = {"LAMMPS_test", nullptr}; + char ** argv = (char**)args; + int argc = 1; int flag; MPI_Initialized(&flag); @@ -172,15 +170,13 @@ protected: void SetUp() override { - const char *args[] = {"LAMMPS_test", "-log", "none", "-screen", "none", "-echo", "screen", - "-pk", "omp", "2", "neigh", "yes", "-sf", "omp"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"LAMMPS_test", "-log", "none", "-screen", "none", "-echo", "screen", + "-pk", "omp", "2", "neigh", "yes", "-sf", "omp"}; // only run this test fixture with omp suffix if OPENMP package is installed if (LAMMPS::is_installed_pkg("OPENMP")) - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); else GTEST_SKIP(); } @@ -242,9 +238,9 @@ protected: LAMMPS *lmp; LAMMPS_kokkos() : lmp(nullptr) { - const char *args[] = {"LAMMPS_test"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + const char * args[] = {"LAMMPS_test", nullptr}; + char ** argv = (char**)args; + int argc = 1; int flag; MPI_Initialized(&flag); @@ -255,15 +251,13 @@ protected: void SetUp() override { - const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "none", "-screen", "none", - "-k", "on", "t", "1", "-sf", "kk"}; + LAMMPS::argv args = {"LAMMPS_test", "-log", "none", "-echo", "none", "-screen", "none", + "-k", "on", "t", "1", "-sf", "kk"}; if (Info::has_accelerator_feature("KOKKOS", "api", "openmp")) args[10] = "2"; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); if (LAMMPS::is_installed_pkg("KOKKOS")) { ::testing::internal::CaptureStdout(); - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); ::testing::internal::GetCapturedStdout(); } else GTEST_SKIP(); @@ -333,12 +327,10 @@ TEST(LAMMPS_init, OpenMP) fputs("\n", fp); fclose(fp); - const char *args[] = {"LAMMPS_init", "-in", "in.lammps_empty", "-log", "none", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"LAMMPS_init", "-in", "in.lammps_empty", "-log", "none", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + LAMMPS *lmp = new LAMMPS(args, MPI_COMM_WORLD); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_THAT(output, ContainsRegex(".*using 2 OpenMP thread.*per MPI task.*")); @@ -366,12 +358,10 @@ TEST(LAMMPS_init, NoOpenMP) fclose(fp); platform::unsetenv("OMP_NUM_THREADS"); - const char *args[] = {"LAMMPS_init", "-in", "in.lammps_class_noomp", "-log", "none", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"LAMMPS_init", "-in", "in.lammps_class_noomp", "-log", "none", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + LAMMPS *lmp = new LAMMPS(args, MPI_COMM_WORLD); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_THAT(output, ContainsRegex( ".*OMP_NUM_THREADS environment is not set.*Defaulting to 1 thread.*")); diff --git a/unittest/force-styles/test_angle_style.cpp b/unittest/force-styles/test_angle_style.cpp index e9f4a3f7fc..bd0e3d8859 100644 --- a/unittest/force-styles/test_angle_style.cpp +++ b/unittest/force-styles/test_angle_style.cpp @@ -59,11 +59,11 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(int argc, char **argv, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); // check if prerequisite styles are available Info *info = new Info(lmp); @@ -211,11 +211,9 @@ void data_lammps(LAMMPS *lmp, const TestConfig &cfg) void generate_yaml_file(const char *outfile, const TestConfig &config) { // initialize system geometry - const char *args[] = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; + LAMMPS::argv args = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *lmp = init_lammps(argc, argv, config); + LAMMPS *lmp = init_lammps(args, config); if (!lmp) { std::cerr << "One or more prerequisite styles are not available " "in this LAMMPS configuration:\n"; @@ -303,13 +301,10 @@ TEST(AngleStyle, plain) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -358,7 +353,7 @@ TEST(AngleStyle, plain) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on @@ -422,14 +417,11 @@ TEST(AngleStyle, omp) if (!LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "omp", "4", "-sf", "omp"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "omp", "4", "-sf", "omp"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -482,7 +474,7 @@ TEST(AngleStyle, omp) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on @@ -525,14 +517,11 @@ TEST(AngleStyle, single) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; // create a LAMMPS instance with standard settings to detect the number of atom types if (!verbose) ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config); + LAMMPS *lmp = init_lammps(args, test_config); if (!verbose) ::testing::internal::GetCapturedStdout(); if (!lmp) { @@ -672,13 +661,10 @@ TEST(AngleStyle, extract) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"AngleStyle", "-log", "none", "-echo", "screen", "-nocite"}; if (!verbose) ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); if (!verbose) ::testing::internal::GetCapturedStdout(); if (!lmp) { diff --git a/unittest/force-styles/test_bond_style.cpp b/unittest/force-styles/test_bond_style.cpp index c723541366..aa99f41f8d 100644 --- a/unittest/force-styles/test_bond_style.cpp +++ b/unittest/force-styles/test_bond_style.cpp @@ -59,11 +59,11 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(int argc, char **argv, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); // check if prerequisite styles are available Info *info = new Info(lmp); @@ -211,11 +211,9 @@ void data_lammps(LAMMPS *lmp, const TestConfig &cfg) void generate_yaml_file(const char *outfile, const TestConfig &config) { // initialize system geometry - const char *args[] = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; + LAMMPS::argv args = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *lmp = init_lammps(argc, argv, config); + LAMMPS *lmp = init_lammps(args, config); if (!lmp) { std::cerr << "One or more prerequisite styles are not available " "in this LAMMPS configuration:\n"; @@ -303,13 +301,10 @@ TEST(BondStyle, plain) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -358,7 +353,7 @@ TEST(BondStyle, plain) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on @@ -424,14 +419,11 @@ TEST(BondStyle, omp) if (!LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "omp", "4", "-sf", "omp"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "omp", "4", "-sf", "omp"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -484,7 +476,7 @@ TEST(BondStyle, omp) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on @@ -527,14 +519,11 @@ TEST(BondStyle, single) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; // create a LAMMPS instance with standard settings to detect the number of atom types if (!verbose) ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config); + LAMMPS *lmp = init_lammps(args, test_config); if (!verbose) ::testing::internal::GetCapturedStdout(); if (!lmp) { @@ -785,13 +774,10 @@ TEST(BondStyle, extract) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"BondStyle", "-log", "none", "-echo", "screen", "-nocite"}; if (!verbose) ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); if (!verbose) ::testing::internal::GetCapturedStdout(); if (!lmp) { diff --git a/unittest/force-styles/test_dihedral_style.cpp b/unittest/force-styles/test_dihedral_style.cpp index 2039155644..25690fc33d 100644 --- a/unittest/force-styles/test_dihedral_style.cpp +++ b/unittest/force-styles/test_dihedral_style.cpp @@ -59,11 +59,9 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(int argc, char **argv, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) { - LAMMPS *lmp; - - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + LAMMPS *lmp = new LAMMPS(args, MPI_COMM_WORLD); // check if prerequisite styles are available Info *info = new Info(lmp); @@ -220,11 +218,9 @@ void data_lammps(LAMMPS *lmp, const TestConfig &cfg) void generate_yaml_file(const char *outfile, const TestConfig &config) { // initialize system geometry - const char *args[] = {"DihedralStyle", "-log", "none", "-echo", "screen", "-nocite"}; + LAMMPS::argv args = {"DihedralStyle", "-log", "none", "-echo", "screen", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *lmp = init_lammps(argc, argv, config); + LAMMPS *lmp = init_lammps(args, config); if (!lmp) { std::cerr << "One or more prerequisite styles are not available " "in this LAMMPS configuration:\n"; @@ -306,13 +302,10 @@ TEST(DihedralStyle, plain) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"DihedralStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"DihedralStyle", "-log", "none", "-echo", "screen", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -361,7 +354,7 @@ TEST(DihedralStyle, plain) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on @@ -427,14 +420,11 @@ TEST(DihedralStyle, omp) if (!LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"DihedralStyle", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "omp", "4", "-sf", "omp"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"DihedralStyle", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "omp", "4", "-sf", "omp"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -488,7 +478,7 @@ TEST(DihedralStyle, omp) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on diff --git a/unittest/force-styles/test_fix_timestep.cpp b/unittest/force-styles/test_fix_timestep.cpp index b65eab2049..2d2c2fa0b8 100644 --- a/unittest/force-styles/test_fix_timestep.cpp +++ b/unittest/force-styles/test_fix_timestep.cpp @@ -61,11 +61,11 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(int argc, char **argv, const TestConfig &cfg, const bool use_respa = false) +LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool use_respa = false) { LAMMPS *lmp; - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); // check if prerequisite styles are available Info *info = new Info(lmp); @@ -169,11 +169,8 @@ void restart_lammps(LAMMPS *lmp, const TestConfig &cfg, bool use_rmass, bool use void generate_yaml_file(const char *outfile, const TestConfig &config) { // initialize system geometry - const char *args[] = {"FixIntegrate", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *lmp = init_lammps(argc, argv, config); + LAMMPS::argv args = {"FixIntegrate", "-log", "none", "-echo", "screen", "-nocite"}; + LAMMPS *lmp = init_lammps(args, config); if (!lmp) { std::cerr << "One or more prerequisite styles are not available " "in this LAMMPS configuration:\n"; @@ -252,13 +249,10 @@ TEST(FixTimestep, plain) if (test_config.skip_tests.count("static")) GTEST_SKIP(); #endif - const char *args[] = {"FixTimestep", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"FixTimestep", "-log", "none", "-echo", "screen", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config); + LAMMPS *lmp = init_lammps(args, test_config); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -420,7 +414,7 @@ TEST(FixTimestep, plain) if (!verbose) ::testing::internal::GetCapturedStdout(); ::testing::internal::CaptureStdout(); - lmp = init_lammps(argc, argv, test_config, true); + lmp = init_lammps(args, test_config, true); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -554,14 +548,12 @@ TEST(FixTimestep, omp) if (test_config.skip_tests.count("static")) GTEST_SKIP(); #endif - const char *args[] = {"FixTimestep", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "omp", "4", "-sf", "omp"}; + LAMMPS::argv args = {"FixTimestep", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "omp", "4", "-sf", "omp"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config); + LAMMPS *lmp = init_lammps(args, test_config); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -723,7 +715,7 @@ TEST(FixTimestep, omp) if (!verbose) ::testing::internal::GetCapturedStdout(); ::testing::internal::CaptureStdout(); - lmp = init_lammps(argc, argv, test_config, true); + lmp = init_lammps(args, test_config, true); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; diff --git a/unittest/force-styles/test_improper_style.cpp b/unittest/force-styles/test_improper_style.cpp index 259bd9008d..b4096df868 100644 --- a/unittest/force-styles/test_improper_style.cpp +++ b/unittest/force-styles/test_improper_style.cpp @@ -59,11 +59,11 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(int argc, char **argv, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); // check if prerequisite styles are available Info *info = new Info(lmp); @@ -211,11 +211,9 @@ void data_lammps(LAMMPS *lmp, const TestConfig &cfg) void generate_yaml_file(const char *outfile, const TestConfig &config) { // initialize system geometry - const char *args[] = {"ImproperStyle", "-log", "none", "-echo", "screen", "-nocite"}; + LAMMPS::argv args = {"ImproperStyle", "-log", "none", "-echo", "screen", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *lmp = init_lammps(argc, argv, config); + LAMMPS *lmp = init_lammps(args, config); if (!lmp) { std::cerr << "One or more prerequisite styles are not available " "in this LAMMPS configuration:\n"; @@ -297,13 +295,10 @@ TEST(ImproperStyle, plain) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"ImproperStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"ImproperStyle", "-log", "none", "-echo", "screen", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -352,7 +347,7 @@ TEST(ImproperStyle, plain) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on @@ -418,14 +413,11 @@ TEST(ImproperStyle, omp) if (!LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"ImproperStyle", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "omp", "4", "-sf", "omp"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"ImproperStyle", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "omp", "4", "-sf", "omp"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -479,7 +471,7 @@ TEST(ImproperStyle, omp) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton bond is forced to be on diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index f44a6e61d3..8ad2ce9aaa 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -61,11 +61,11 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(int argc, char **argv, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(args, MPI_COMM_WORLD); // check if prerequisite styles are available Info *info = new Info(lmp); @@ -225,11 +225,9 @@ void data_lammps(LAMMPS *lmp, const TestConfig &cfg) void generate_yaml_file(const char *outfile, const TestConfig &config) { // initialize system geometry - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - LAMMPS *lmp = init_lammps(argc, argv, config); + LAMMPS *lmp = init_lammps(args, config); if (!lmp) { std::cerr << "One or more prerequisite styles are not available " "in this LAMMPS configuration:\n"; @@ -323,13 +321,10 @@ TEST(PairStyle, plain) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -388,7 +383,7 @@ TEST(PairStyle, plain) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); // skip over these tests if newton pair is forced to be on @@ -469,7 +464,7 @@ TEST(PairStyle, plain) if (pair->respa_enable) { if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); lmp->input->one("run_style respa 2 1 inner 1 4.8 5.5 outer 2"); run_lammps(lmp); if (!verbose) ::testing::internal::GetCapturedStdout(); @@ -501,17 +496,14 @@ TEST(PairStyle, omp) if (!LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "omp", "4", "-sf", "omp"}; + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "omp", "4", "-sf", "omp"}; // cannot run dpd styles with more than 1 thread due to using multiple pRNGs if (utils::strmatch(test_config.pair_style, "^dpd")) args[8] = "1"; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -570,7 +562,7 @@ TEST(PairStyle, omp) if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); pair = lmp->force->pair; @@ -626,8 +618,8 @@ TEST(PairStyle, kokkos_omp) if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); if (!Info::has_accelerator_feature("KOKKOS", "api", "openmp")) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", - "-k", "on", "t", "4", "-sf", "kk"}; + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", + "-k", "on", "t", "4", "-sf", "kk"}; // cannot run dpd styles in plain or hybrid with more than 1 thread due to using multiple pRNGs if (utils::strmatch(test_config.pair_style, "^dpd") || @@ -642,11 +634,8 @@ TEST(PairStyle, kokkos_omp) utils::strmatch(test_config.pair_style, " pace")) args[9] = "1"; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -704,7 +693,7 @@ TEST(PairStyle, kokkos_omp) if (lmp->force->newton_pair == 0) { if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); - lmp = init_lammps(argc, argv, test_config, false); + lmp = init_lammps(args, test_config, false); if (!verbose) ::testing::internal::GetCapturedStdout(); pair = lmp->force->pair; @@ -767,22 +756,19 @@ TEST(PairStyle, gpu) (!Info::has_fft_single_support())) GTEST_SKIP(); - const char *args_neigh[] = {"PairStyle", "-log", "none", "-echo", - "screen", "-nocite", "-sf", "gpu"}; - const char *args_noneigh[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", - "gpu", "-pk", "gpu", "0", "neigh", "no"}; - - char **argv = (char **)args_neigh; - int argc = sizeof(args_neigh) / sizeof(char *); + LAMMPS::argv args_neigh = {"PairStyle", "-log", "none", "-echo", + "screen", "-nocite", "-sf", "gpu"}; + LAMMPS::argv args_noneigh = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", + "gpu", "-pk", "gpu", "0", "neigh", "no"}; + LAMMPS::argv args = args_neigh; // cannot use GPU neighbor list with hybrid pair style (yet) if (test_config.pair_style.substr(0, 6) == "hybrid") { - argv = (char **)args_noneigh; - argc = sizeof(args_noneigh) / sizeof(char *); + args = args_noneigh; } ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, false); + LAMMPS *lmp = init_lammps(args, test_config, false); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -854,18 +840,15 @@ TEST(PairStyle, intel) if (!LAMMPS::is_installed_pkg("INTEL")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", - "-pk", "intel", "0", "mode", "double", "omp", - "4", "lrt", "no", "-sf", "intel"}; + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", + "-pk", "intel", "0", "mode", "double", "omp", + "4", "lrt", "no", "-sf", "intel"}; // cannot use more than 1 thread for dpd styles due to pRNG if (utils::strmatch(test_config.pair_style, "^dpd")) args[12] = "1"; - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); - ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -942,13 +925,10 @@ TEST(PairStyle, opt) if (!LAMMPS::is_installed_pkg("OPT")) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", "opt"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", "opt"}; ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config); + LAMMPS *lmp = init_lammps(args, test_config); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -1025,17 +1005,14 @@ TEST(PairStyle, single) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; // need to add this dependency test_config.prerequisites.emplace_back("atom", "full"); // create a LAMMPS instance with standard settings to detect the number of atom types if (!verbose) ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config); + LAMMPS *lmp = init_lammps(args, test_config); if (!verbose) ::testing::internal::GetCapturedStdout(); if (!lmp) { @@ -1276,13 +1253,10 @@ TEST(PairStyle, extract) { if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); - const char *args[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; - - char **argv = (char **)args; - int argc = sizeof(args) / sizeof(char *); + LAMMPS::argv args = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite"}; if (!verbose) ::testing::internal::CaptureStdout(); - LAMMPS *lmp = init_lammps(argc, argv, test_config, true); + LAMMPS *lmp = init_lammps(args, test_config, true); if (!verbose) ::testing::internal::GetCapturedStdout(); if (!lmp) { diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index 1082a381bb..8c81897c0a 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -71,10 +71,10 @@ protected: // clang-format off const char *args[] = { "LAMMPS_Fortran_test", "-l", "none", "-echo", "screen", "-nocite", - "-var", "input_dir", input_dir, "-var", "zpos", "1.5", "-var", "x", "2" }; + "-var", "input_dir", input_dir, "-var", "zpos", "1.5", "-var", "x", "2", nullptr }; // clang-format on char **argv = (char **)args; - int argc = sizeof(args) / sizeof(const char *); + int argc = (sizeof(args) / sizeof(const char *)) - 1; ::testing::internal::CaptureStdout(); lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_c_args(argc, argv); diff --git a/unittest/testing/core.h b/unittest/testing/core.h index 88503dc188..8f1a84d2d8 100644 --- a/unittest/testing/core.h +++ b/unittest/testing/core.h @@ -106,31 +106,21 @@ public: } protected: - std::string testbinary = "LAMMPSTest"; - std::vector args = {"-log", "none", "-echo", "screen", "-nocite"}; + std::string testbinary = "LAMMPSTest"; + LAMMPS::argv args = {"-log", "none", "-echo", "screen", "-nocite"}; LAMMPS *lmp; Info *info; void SetUp() override { - int argc = args.size() + 1; - char **argv = new char *[argc]; - argv[0] = LAMMPS_NS::utils::strdup(testbinary); - for (int i = 1; i < argc; i++) { - argv[i] = LAMMPS_NS::utils::strdup(args[i - 1]); - } + LAMMPS::argv full_args = {testbinary}; + full_args.insert(full_args.end(), args.begin(), args.end()); HIDE_OUTPUT([&] { - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + lmp = new LAMMPS(full_args, MPI_COMM_WORLD); info = new Info(lmp); }); InitSystem(); - - for (int i = 0; i < argc; i++) { - delete[] argv[i]; - argv[i] = nullptr; - } - delete[] argv; } virtual void InitSystem() {} From 053a904d08506f95001d976305b592c887821045 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 7 Nov 2023 17:55:32 -0700 Subject: [PATCH 332/417] bugfix: make copy of exename --- src/lammps.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lammps.cpp b/src/lammps.cpp index c0336ee588..0914658d75 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -219,7 +219,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : suffix = suffix2 = nullptr; suffix_enable = 0; pair_only_flag = 0; - if (arg) exename = arg[0]; + if (arg) exename = utils::strdup(arg[0]); else exename = nullptr; packargs = nullptr; num_package = 0; @@ -809,6 +809,7 @@ LAMMPS::~LAMMPS() noexcept(false) delete memory; delete pkg_lists; + delete[] exename; } /* ---------------------------------------------------------------------- From eff65ad3f33a47fafa2c3c67b48807461ad0e3dc Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 9 Nov 2023 20:29:14 -0700 Subject: [PATCH 333/417] bugfix: correctly build argv when using Python interface --- python/lammps/core.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 84a80e77a3..1ff123760b 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -379,8 +379,9 @@ class lammps(object): for i in range(narg): if type(cmdargs[i]) is str: cmdargs[i] = cmdargs[i].encode() - cargs = (c_char_p*narg)(*cmdargs) - self.lib.lammps_open.argtypes = [c_int, c_char_p*narg, MPI_Comm, c_void_p] + cargs = (c_char_p*(narg+1))(*cmdargs) + cargs[narg] = None + self.lib.lammps_open.argtypes = [c_int, c_char_p*(narg+1), MPI_Comm, c_void_p] else: self.lib.lammps_open.argtypes = [c_int, c_char_p, MPI_Comm, c_void_p] @@ -399,8 +400,9 @@ class lammps(object): for i in range(narg): if type(cmdargs[i]) is str: cmdargs[i] = cmdargs[i].encode() - cargs = (c_char_p*narg)(*cmdargs) - self.lib.lammps_open_no_mpi.argtypes = [c_int, c_char_p*narg, c_void_p] + cargs = (c_char_p*(narg+1))(*cmdargs) + cargs[narg] = None + self.lib.lammps_open_no_mpi.argtypes = [c_int, c_char_p*(narg+1), c_void_p] self.lmp = c_void_p(self.lib.lammps_open_no_mpi(narg,cargs,None)) else: self.lib.lammps_open_no_mpi.argtypes = [c_int, c_char_p, c_void_p] From e6d31485335cb3f239d3d722d0bddd151bbd4cc3 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Thu, 9 Nov 2023 23:34:01 -0500 Subject: [PATCH 334/417] add method=pimd support for Langevin thermostat --- src/REPLICA/fix_pimd_langevin.cpp | 120 +++++++++++++++++++----------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index cffaf327e4..d4e2b6e526 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -50,7 +50,7 @@ using namespace FixConst; using MathConst::MY_PI; using MathConst::THIRD; -enum { NMPIMD }; +enum { PIMD, NMPIMD }; enum { PHYSICAL, NORMAL }; enum { BAOAB, OBABO }; enum { ISO, ANISO, TRICLINIC }; @@ -121,6 +121,8 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[i], "method") == 0) { if (strcmp(arg[i + 1], "nmpimd") == 0) method = NMPIMD; + elif (strcmp(arg[i + 1], "pimd") == 0) + method = PIMD; else error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin"); } else if (strcmp(arg[i], "integrator") == 0) { @@ -159,7 +161,7 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : error->universe_all(FLERR, "Invalid fmass value for fix pimd/langevin"); } else if (strcmp(arg[i], "sp") == 0) { sp = utils::numeric(FLERR, arg[i + 1], false, lmp); - if (sp < 0.0) error->universe_all(FLERR, "Invalid sp value for fix pimd/nvt"); + if (sp < 0.0) error->universe_all(FLERR, "Invalid sp value for fix pimd/langevin"); } else if (strcmp(arg[i], "fmmode") == 0) { if (strcmp(arg[i + 1], "physical") == 0) fmmode = PHYSICAL; @@ -170,9 +172,11 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : "Unknown fictitious mass mode for fix pimd/langevin. Only physical " "mass and normal mode mass are supported!"); } else if (strcmp(arg[i], "scale") == 0) { + if (method == PIMD) + error->universe_all(FLERR, "The scale parameter of the PILE_L thermostat is not supported for method pimd. Delete scale parameter if you do want to use method pimd."); pilescale = utils::numeric(FLERR, arg[i + 1], false, lmp); if (pilescale < 0.0) - error->universe_all(FLERR, "Invalid pile scale value for fix pimd/langevin"); + error->universe_all(FLERR, "Invalid PILE_L scale value for fix pimd/langevin"); } else if (strcmp(arg[i], "temp") == 0) { temp = utils::numeric(FLERR, arg[i + 1], false, lmp); if (temp < 0.0) error->universe_all(FLERR, "Invalid temp value for fix pimd/langevin"); @@ -245,6 +249,12 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : error->universe_all( FLERR, fmt::format("Must not use pressure coupling with {} ensemble", Ensembles[ensemble])); + if (method == PIMD && pstat_flag) + error->universe_all(FLERR, "Pressure control has not been supported for method pimd yet. Please set method to nmpimd."); + + if (method == PIMD && fmmode == NORMAL) + error->universe_all(FLERR, "Normal mode mass is not supported for method pimd. Please set method to nmpimd."); + /* Initiation */ global_freq = 1; @@ -890,20 +900,22 @@ void FixPIMDLangevin::langevin_init() _omega_k = new double[np]; Lan_c = new double[np]; Lan_s = new double[np]; - if (fmmode == PHYSICAL) { - for (int i = 0; i < np; i++) { - _omega_k[i] = _omega_np * sqrt(lam[i]) / sqrt(fmass); - Lan_c[i] = cos(sqrt(lam[i]) * _omega_np_dt_half); - Lan_s[i] = sin(sqrt(lam[i]) * _omega_np_dt_half); + if (method == NMPIMD) { + if (fmmode == PHYSICAL) { + for (int i = 0; i < np; i++) { + _omega_k[i] = _omega_np * sqrt(lam[i]) / sqrt(fmass); + Lan_c[i] = cos(sqrt(lam[i]) * _omega_np_dt_half); + Lan_s[i] = sin(sqrt(lam[i]) * _omega_np_dt_half); + } + } else if (fmmode == NORMAL) { + for (int i = 0; i < np; i++) { + _omega_k[i] = _omega_np / sqrt(fmass); + Lan_c[i] = cos(_omega_np_dt_half); + Lan_s[i] = sin(_omega_np_dt_half); + } + } else { + error->universe_all(FLERR, "Unknown fmmode setting; only physical and normal are supported!"); } - } else if (fmmode == NORMAL) { - for (int i = 0; i < np; i++) { - _omega_k[i] = _omega_np / sqrt(fmass); - Lan_c[i] = cos(_omega_np_dt_half); - Lan_s[i] = sin(_omega_np_dt_half); - } - } else { - error->universe_all(FLERR, "Unknown fmmode setting; only physical and normal are supported!"); } if (tau > 0) @@ -925,27 +937,35 @@ void FixPIMDLangevin::langevin_init() if (thermostat == PILE_L) { std::string out = "\nInitializing PI Langevin equation thermostat...\n"; out += "Bead ID | omega | tau | c1 | c2\n"; - tau_k = new double[np]; - c1_k = new double[np]; - c2_k = new double[np]; - tau_k[0] = tau; - c1_k[0] = c1; - c2_k[0] = c2; - for (int i = 1; i < np; i++) { - tau_k[i] = 0.5 / pilescale / _omega_k[i]; - if (integrator == OBABO) - c1_k[i] = exp(-0.5 * update->dt / tau_k[i]); - else if (integrator == BAOAB) - c1_k[i] = exp(-1.0 * update->dt / tau_k[i]); - else - error->universe_all(FLERR, - "Unknown integrator parameter for fix pimd/langevin. Only obabo and " - "baoab integrators are supported!"); - c2_k[i] = sqrt(1.0 - c1_k[i] * c1_k[i]); - } - for (int i = 0; i < np; i++) { - out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_k[i], tau_k[i], - c1_k[i], c2_k[i]); + if (method == NMPIMD) { + tau_k = new double[np]; + c1_k = new double[np]; + c2_k = new double[np]; + tau_k[0] = tau; + c1_k[0] = c1; + c2_k[0] = c2; + for (int i = 1; i < np; i++) { + tau_k[i] = 0.5 / pilescale / _omega_k[i]; + if (integrator == OBABO) + c1_k[i] = exp(-0.5 * update->dt / tau_k[i]); + else if (integrator == BAOAB) + c1_k[i] = exp(-1.0 * update->dt / tau_k[i]); + else + error->universe_all(FLERR, + "Unknown integrator parameter for fix pimd/langevin. Only obabo and " + "baoab integrators are supported!"); + c2_k[i] = sqrt(1.0 - c1_k[i] * c1_k[i]); + } + for (int i = 0; i < np; i++) { + out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_k[i], tau_k[i], + c1_k[i], c2_k[i]); + } + } + else if (method == PIMD) { + for (int i = 0; i < np; i++) { + out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_np / sqrt(fmass), tau, + c1, c2); + } } if (thermostat == PILE_L) out += "PILE_L thermostat successfully initialized!\n"; out += "\n"; @@ -961,13 +981,25 @@ void FixPIMDLangevin::o_step() int *type = atom->type; double beta_np = 1.0 / force->boltz / Lan_temp * inverse_np * force->mvv2e; if (thermostat == PILE_L) { - for (int i = 0; i < nlocal; i++) { - atom->v[i][0] = c1_k[universe->iworld] * atom->v[i][0] + - c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); - atom->v[i][1] = c1_k[universe->iworld] * atom->v[i][1] + - c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); - atom->v[i][2] = c1_k[universe->iworld] * atom->v[i][2] + - c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + if (method == NMPIMD) { + for (int i = 0; i < nlocal; i++) { + atom->v[i][0] = c1_k[universe->iworld] * atom->v[i][0] + + c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][1] = c1_k[universe->iworld] * atom->v[i][1] + + c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][2] = c1_k[universe->iworld] * atom->v[i][2] + + c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + } + } + else if (method == PIMD) { + for (int i = 0; i < nlocal; i++) { + atom->v[i][0] = c1 * atom->v[i][0] + + c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][1] = c1 * atom->v[i][1] + + c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][2] = c1 * atom->v[i][2] + + c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + } } } } From f413d395a52c54b9e0e47e0adcd0c3a297aaba75 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Fri, 10 Nov 2023 00:20:51 -0500 Subject: [PATCH 335/417] add support for method=PIMD; add q_step function --- src/REPLICA/fix_pimd_langevin.cpp | 74 ++++++++++++++++++++++++++----- src/REPLICA/fix_pimd_langevin.h | 4 ++ 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index d4e2b6e526..0068546f44 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -538,11 +538,18 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) nmpimd_transform(bufsortedall, x, M_x2xp[universe->iworld]); else if (cmode == MULTI_PROC) nmpimd_transform(bufbeads, x, M_x2xp[universe->iworld]); + qc_step(); + a_step(); + qc_step(); + a_step(); + } + else if (method == PIMD) { + q_step(); + q_step(); + } + else { + error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } - qc_step(); - a_step(); - qc_step(); - a_step(); } else if (integrator == BAOAB) { if (pstat_flag) { compute_totke(); @@ -556,18 +563,32 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) nmpimd_transform(bufsortedall, x, M_x2xp[universe->iworld]); else if (cmode == MULTI_PROC) nmpimd_transform(bufbeads, x, M_x2xp[universe->iworld]); + qc_step(); + a_step(); + } + else if (method == PIMD) { + q_step(); + } + else { + error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } - qc_step(); - a_step(); if (tstat_flag) { o_step(); if (removecomflag) remove_com_motion(); if (pstat_flag) press_o_step(); } - qc_step(); - a_step(); + if (method == NMPIMD) { + qc_step(); + a_step(); + } + else if (method == PIMD) { + q_step(); + } + else { + error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } } else { - error->universe_all(FLERR, "Unknown integrator parameter for fix pimd/langevin"); + error->universe_all(FLERR, "Unknown integrator parameter for fix pimd/langevin. Only obabo and baoab integrators are supported!"); } collect_xc(); compute_spring_energy(); @@ -614,6 +635,7 @@ void FixPIMDLangevin::final_integrate() void FixPIMDLangevin::post_force(int /*flag*/) { + if (method == NMPIMD) { if (atom->nmax > maxunwrap) reallocate_x_unwrap(); if (atom->nmax > maxxc) reallocate_xc(); int nlocal = atom->nlocal; @@ -638,6 +660,7 @@ void FixPIMDLangevin::post_force(int /*flag*/) compute_vir(); compute_cvir(); compute_t_vir(); + } compute_pote(); if (method == NMPIMD) { inter_replica_comm(f); @@ -646,6 +669,12 @@ void FixPIMDLangevin::post_force(int /*flag*/) else if (cmode == MULTI_PROC) nmpimd_transform(bufbeads, f, M_x2xp[universe->iworld]); } + else if (method == PIMD) { + spring_force(); + } + else { + error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } c_pe->addstep(update->ntimestep + 1); c_press->addstep(update->ntimestep + 1); } @@ -660,6 +689,8 @@ void FixPIMDLangevin::end_of_step() if (pstat_flag) compute_totenthalpy(); } +/* ---------------------------------------------------------------------- */ + void FixPIMDLangevin::collect_xc() { int nlocal = atom->nlocal; @@ -693,7 +724,9 @@ void FixPIMDLangevin::collect_xc() void FixPIMDLangevin::b_step() { - + // used for both NMPIMD and PIMD + // For NMPIMD, force only includes the contribution of external potential. + // For PIMD, force includes the contributions of external potential and spring force. int n = atom->nlocal; int *type = atom->type; double **v = atom->v; @@ -711,6 +744,8 @@ void FixPIMDLangevin::b_step() void FixPIMDLangevin::qc_step() { + // used for NMPIMD + // evolve the centroid mode int nlocal = atom->nlocal; double **x = atom->x; double **v = atom->v; @@ -775,6 +810,8 @@ void FixPIMDLangevin::qc_step() void FixPIMDLangevin::a_step() { + // used for NMPIMD + // use analytical solution of harmonic oscillator to evolve the non-centroid modes int n = atom->nlocal; double **x = atom->x; double **v = atom->v; @@ -806,6 +843,14 @@ void FixPIMDLangevin::a_step() /* ---------------------------------------------------------------------- */ +void FixPIMDLangevin::q_step() +{ + // used for PIMD + // evolve all beads +} + +/* ---------------------------------------------------------------------- */ + void FixPIMDLangevin::baro_init() { vw[0] = vw[1] = vw[2] = vw[3] = vw[4] = vw[5] = 0.0; @@ -1086,6 +1131,12 @@ void FixPIMDLangevin::nmpimd_transform(double **src, double **des, double *vecto } } +/* ---------------------------------------------------------------------- */ + +void FixPIMDLangevin::spring_force() +{ +} + /* ---------------------------------------------------------------------- Comm operations ------------------------------------------------------------------------- */ @@ -1111,6 +1162,9 @@ void FixPIMDLangevin::comm_init() planrecv[i] = universe->root_proc[irecv]; modeindex[i] = irecv; } + + x_next = (universe->iworld + 1 + universe->nworlds) % (universe->nworlds); + x_last = (universe->iworld - 1 + universe->nworlds) % (universe->nworlds); } /* ---------------------------------------------------------------------- */ diff --git a/src/REPLICA/fix_pimd_langevin.h b/src/REPLICA/fix_pimd_langevin.h index 9730f65376..0f21b908b0 100644 --- a/src/REPLICA/fix_pimd_langevin.h +++ b/src/REPLICA/fix_pimd_langevin.h @@ -77,6 +77,8 @@ class FixPIMDLangevin : public Fix { int me, nprocs, ireplica, nreplica, nprocs_universe; int ntotal, maxlocal; + int x_last, x_next; + int cmode; int sizeplan; int *plansend, *planrecv; @@ -93,6 +95,7 @@ class FixPIMDLangevin : public Fix { void comm_init(); void inter_replica_comm(double **ptr); + void spring_force(); /* normal-mode operations */ @@ -121,6 +124,7 @@ class FixPIMDLangevin : public Fix { a_step(); // integrate for dt/2 according to A part (non-centroid mode, harmonic force between replicas) void qc_step(); // integrate for dt/2 for the centroid mode (x <- x + v * dt/2) void o_step(); // integrate for dt according to O part (O-U process, for thermostating) + void q_step(); // integrate for dt/2 for all the beads (x <- x + v * dt/2) /* Bussi-Zykova-Parrinello barostat */ From 63935194191f8b5d06005647d8c28914cc475b73 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Fri, 10 Nov 2023 16:07:00 -0500 Subject: [PATCH 336/417] q_step function --- src/REPLICA/fix_pimd_langevin.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index 0068546f44..5a2df1bc75 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -847,6 +847,17 @@ void FixPIMDLangevin::q_step() { // used for PIMD // evolve all beads + int nlocal = atom->nlocal; + double **x = atom->x; + double **v = atom->v; + + if (!pstat_flag) { + for (int i = 0; i < nlocal; i++) { + x[i][0] += dtv * v[i][0]; + x[i][1] += dtv * v[i][1]; + x[i][2] += dtv * v[i][2]; + } + } } /* ---------------------------------------------------------------------- */ From 98a0f43c9bbeac7f1688b073710d6b8d4e3aea09 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Sat, 11 Nov 2023 01:04:13 -0500 Subject: [PATCH 337/417] add spring_force function --- src/REPLICA/fix_pimd_langevin.cpp | 82 ++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index 5a2df1bc75..6ef74c2a1a 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -121,7 +121,7 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[i], "method") == 0) { if (strcmp(arg[i + 1], "nmpimd") == 0) method = NMPIMD; - elif (strcmp(arg[i + 1], "pimd") == 0) + else if (strcmp(arg[i + 1], "pimd") == 0) method = PIMD; else error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin"); @@ -488,6 +488,13 @@ void FixPIMDLangevin::setup(int vflag) else if (cmode == MULTI_PROC) nmpimd_transform(bufbeads, x, M_x2xp[universe->iworld]); } + else if (method == PIMD) { + inter_replica_comm(x); + spring_force(); + } + else { + error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } collect_xc(); compute_spring_energy(); compute_t_prim(); @@ -591,9 +598,16 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) error->universe_all(FLERR, "Unknown integrator parameter for fix pimd/langevin. Only obabo and baoab integrators are supported!"); } collect_xc(); - compute_spring_energy(); - compute_t_prim(); - compute_p_prim(); + if (method == PIMD) { + inter_replica_comm(x); + spring_force(); + compute_spring_energy(); + } + if (method == NMPIMD) { + compute_spring_energy(); + compute_t_prim(); + compute_p_prim(); + } if (method == NMPIMD) { inter_replica_comm(x); @@ -635,14 +649,15 @@ void FixPIMDLangevin::final_integrate() void FixPIMDLangevin::post_force(int /*flag*/) { - if (method == NMPIMD) { - if (atom->nmax > maxunwrap) reallocate_x_unwrap(); - if (atom->nmax > maxxc) reallocate_xc(); int nlocal = atom->nlocal; double **x = atom->x; double **f = atom->f; imageint *image = atom->image; tagint *tag = atom->tag; + + if (method == NMPIMD) { + if (atom->nmax > maxunwrap) reallocate_x_unwrap(); + if (atom->nmax > maxxc) reallocate_xc(); for (int i = 0; i < nlocal; i++) { x_unwrap[i][0] = x[i][0]; x_unwrap[i][1] = x[i][1]; @@ -669,12 +684,7 @@ void FixPIMDLangevin::post_force(int /*flag*/) else if (cmode == MULTI_PROC) nmpimd_transform(bufbeads, f, M_x2xp[universe->iworld]); } - else if (method == PIMD) { - spring_force(); - } - else { - error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); - } + c_pe->addstep(update->ntimestep + 1); c_press->addstep(update->ntimestep + 1); } @@ -1146,6 +1156,41 @@ void FixPIMDLangevin::nmpimd_transform(double **src, double **des, double *vecto void FixPIMDLangevin::spring_force() { + spring_energy = 0.0; + + double **x = atom->x; + double **f = atom->f; + double* _mass = atom->mass; + int* type = atom->type; + int nlocal = atom->nlocal; + tagint* tagtmp = atom->tag; + + int *mask = atom->mask; + + for (int i=0; iuworld); total_spring_energy /= universe->procs_per_world[universe->iworld]; + } + else if (method == PIMD) { + total_spring_energy = se_bead = 0.0; + MPI_Allreduce(&spring_energy, &se_bead, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&se_bead, &total_spring_energy, 1, MPI_DOUBLE, MPI_SUM, universe->uworld); + total_spring_energy /= universe->procs_per_world[universe->iworld]; + } + else { + error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } } /* ---------------------------------------------------------------------- */ From ba32afc06e293384653f4856069575268ae47e9c Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Sat, 11 Nov 2023 01:45:36 -0500 Subject: [PATCH 338/417] fix spring_energy --- src/REPLICA/fix_pimd_langevin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index 6ef74c2a1a..96cf4bef35 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -1188,7 +1188,7 @@ void FixPIMDLangevin::spring_force() f[i][1] -= (dy) * ff; f[i][2] -= (dz) * ff; - spring_energy += ff * (delx2*delx2+dely2*dely2+delz2*delz2); + spring_energy += 0.5 * ff * (delx2*delx2+dely2*dely2+delz2*delz2); } } } From 4ef27552c4492b92c3ea889309ccd2ec3e2c8245 Mon Sep 17 00:00:00 2001 From: Yifan Li Date: Sat, 11 Nov 2023 03:10:00 -0500 Subject: [PATCH 339/417] fix spring_force()'s position --- src/REPLICA/fix_pimd_langevin.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index 96cf4bef35..4e94b77a86 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -598,11 +598,7 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) error->universe_all(FLERR, "Unknown integrator parameter for fix pimd/langevin. Only obabo and baoab integrators are supported!"); } collect_xc(); - if (method == PIMD) { - inter_replica_comm(x); - spring_force(); - compute_spring_energy(); - } + if (method == NMPIMD) { compute_spring_energy(); compute_t_prim(); @@ -676,6 +672,18 @@ void FixPIMDLangevin::post_force(int /*flag*/) compute_cvir(); compute_t_vir(); } + + if (method == PIMD) { + if (mapflag) { + for (int i = 0; i < nlocal; i++) { domain->unmap(x[i], image[i]); } + } + inter_replica_comm(x); + spring_force(); + compute_spring_energy(); + if (mapflag) { + for (int i = 0; i < nlocal; i++) { domain->unmap_inv(x[i], image[i]); } + } + } compute_pote(); if (method == NMPIMD) { inter_replica_comm(f); @@ -1165,7 +1173,10 @@ void FixPIMDLangevin::spring_force() int nlocal = atom->nlocal; tagint* tagtmp = atom->tag; + // printf("iworld = %d, x_last = %d, x_next = %d\n", universe->iworld, x_last, x_next); int *mask = atom->mask; + + // int idx_tmp = atom->map(1); for (int i=0; i Date: Sat, 11 Nov 2023 04:10:31 -0500 Subject: [PATCH 340/417] update document for method=pimd --- doc/src/fix_pimd.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/src/fix_pimd.rst b/doc/src/fix_pimd.rst index 5b51b97c52..6abac408ca 100644 --- a/doc/src/fix_pimd.rst +++ b/doc/src/fix_pimd.rst @@ -31,7 +31,7 @@ Syntax .. parsed-literal:: *keywords* = *method* or *integrator* or *ensemble* or *fmmode* or *fmass* or *scale* or *temp* or *thermostat* or *tau* or *iso* or *aniso* or *barostat* or *taup* or *fixcom* or *lj* - *method* value = *nmpimd* + *method* value = *nmpimd* (default) or *pimd* *integrator* value = *obabo* or *baoab* *fmmode* value = *physical* or *normal* *fmass* value = scaling factor on mass @@ -137,9 +137,6 @@ normal-mode PIMD. A value of *cmd* is for centroid molecular dynamics the real particle. .. note:: - Fix pimd/langevin only supports *method* value *nmpimd*. This should be enough - for most PIMD applications for quantum thermodynamics purpose. - Motion of the centroid can be effectively uncoupled from the other normal modes by scaling the fictitious masses to achieve a partial adiabatic separation. This is called a Centroid Molecular Dynamics @@ -151,6 +148,10 @@ normal-mode PIMD. A value of *cmd* is for centroid molecular dynamics only the k > 0 modes are thermostatted, not the centroid degrees of freedom. +Fix pimd/langevin supports *method* value *nmpimd* and *pimd*. The default value is *nmpimd*. +If *method* is *nmpimd*, the normal mode representation is used to integrate the equations of motion. The exact solution of harmonic oscillator is used to propagate the free ring polymer part of the Hamiltonian. +If *method* is *pimd*, the Cartesian representation is used to integrate the equations of motion. The harmonic force is added to the total force of the system, and the numerical integrator is used to propagate the Hamiltonian. + The keyword *integrator* specifies the Trotter splitting method used by *fix pimd/langevin*. See :ref:`(Liu) ` for a discussion on the OBABO and BAOAB splitting schemes. Typically either of the two should work fine. From 2e43bb08652f86f48b73bf64376058caf88feb75 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 05:56:06 -0500 Subject: [PATCH 341/417] correct usage of virtual and override for rigid fixes and OpenMP versions --- src/OPENMP/fix_rigid_nh_omp.h | 4 ++-- src/OPENMP/fix_rigid_omp.h | 2 +- src/OPENMP/fix_rigid_small_omp.h | 2 +- src/RIGID/fix_rigid.h | 2 +- src/RIGID/fix_rigid_nh.h | 2 +- src/RIGID/fix_rigid_small.h | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/OPENMP/fix_rigid_nh_omp.h b/src/OPENMP/fix_rigid_nh_omp.h index dcd893b161..169bef706f 100644 --- a/src/OPENMP/fix_rigid_nh_omp.h +++ b/src/OPENMP/fix_rigid_nh_omp.h @@ -24,10 +24,10 @@ class FixRigidNHOMP : public FixRigidNH { void initial_integrate(int) override; void final_integrate() override; - virtual void remap(); + void remap() override; protected: - virtual void compute_forces_and_torques(); + void compute_forces_and_torques() override; private: // copied from FixRigidOMP template void set_xv_thr(); diff --git a/src/OPENMP/fix_rigid_omp.h b/src/OPENMP/fix_rigid_omp.h index 618ce5ddf7..b74b808544 100644 --- a/src/OPENMP/fix_rigid_omp.h +++ b/src/OPENMP/fix_rigid_omp.h @@ -32,7 +32,7 @@ class FixRigidOMP : public FixRigid { void final_integrate() override; protected: - virtual void compute_forces_and_torques(); + void compute_forces_and_torques() override; private: template void set_xv_thr(); diff --git a/src/OPENMP/fix_rigid_small_omp.h b/src/OPENMP/fix_rigid_small_omp.h index 1accb8a470..d3a7bd6349 100644 --- a/src/OPENMP/fix_rigid_small_omp.h +++ b/src/OPENMP/fix_rigid_small_omp.h @@ -36,7 +36,7 @@ class FixRigidSmallOMP : public FixRigidSmall { void final_integrate() override; protected: - virtual void compute_forces_and_torques(); + void compute_forces_and_torques() override; private: template void set_xv_thr(); diff --git a/src/RIGID/fix_rigid.h b/src/RIGID/fix_rigid.h index df0bcbda0c..2de1b59de6 100644 --- a/src/RIGID/fix_rigid.h +++ b/src/RIGID/fix_rigid.h @@ -145,7 +145,7 @@ class FixRigid : public Fix { void setup_bodies_static(); void setup_bodies_dynamic(); void apply_langevin_thermostat(); - void compute_forces_and_torques(); + virtual void compute_forces_and_torques(); void enforce2d(); void readfile(int, double *, double **, double **, double **, imageint *, int *); }; diff --git a/src/RIGID/fix_rigid_nh.h b/src/RIGID/fix_rigid_nh.h index 94600f97d1..93a299f41f 100644 --- a/src/RIGID/fix_rigid_nh.h +++ b/src/RIGID/fix_rigid_nh.h @@ -70,7 +70,7 @@ class FixRigidNH : public FixRigid { int tcomputeflag, pcomputeflag; // 1 = compute was created by fix. 0 = external void couple(); - void remap(); + virtual void remap(); void nhc_temp_integrate(); void nhc_press_integrate(); diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index 144b2aad70..75cc432c7a 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -202,7 +202,7 @@ class FixRigidSmall : public Fix { void setup_bodies_static(); void setup_bodies_dynamic(); void apply_langevin_thermostat(); - void compute_forces_and_torques(); + virtual void compute_forces_and_torques(); void enforce2d(); void readfile(int, double **, int *); void grow_body(); From 3d14e2e0e23b1b7ee4efb74b71613c129910260e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 06:05:07 -0500 Subject: [PATCH 342/417] whitespace --- src/REPLICA/fix_pimd_langevin.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index 4e94b77a86..ba02b7a184 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -1177,25 +1177,25 @@ void FixPIMDLangevin::spring_force() int *mask = atom->mask; // int idx_tmp = atom->map(1); - + for (int i=0; i Date: Sat, 11 Nov 2023 06:09:15 -0500 Subject: [PATCH 343/417] doc tweaks --- doc/src/fix_pimd.rst | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/src/fix_pimd.rst b/doc/src/fix_pimd.rst index 6abac408ca..91c5e58add 100644 --- a/doc/src/fix_pimd.rst +++ b/doc/src/fix_pimd.rst @@ -137,6 +137,7 @@ normal-mode PIMD. A value of *cmd* is for centroid molecular dynamics the real particle. .. note:: + Motion of the centroid can be effectively uncoupled from the other normal modes by scaling the fictitious masses to achieve a partial adiabatic separation. This is called a Centroid Molecular Dynamics @@ -148,9 +149,15 @@ normal-mode PIMD. A value of *cmd* is for centroid molecular dynamics only the k > 0 modes are thermostatted, not the centroid degrees of freedom. -Fix pimd/langevin supports *method* value *nmpimd* and *pimd*. The default value is *nmpimd*. -If *method* is *nmpimd*, the normal mode representation is used to integrate the equations of motion. The exact solution of harmonic oscillator is used to propagate the free ring polymer part of the Hamiltonian. -If *method* is *pimd*, the Cartesian representation is used to integrate the equations of motion. The harmonic force is added to the total force of the system, and the numerical integrator is used to propagate the Hamiltonian. +.. versionadded:: TBD + + Mode *pimd* added to fix pimd/langevin. + +Fix pimd/langevin supports the *method* values *nmpimd* and *pimd*. The default value is *nmpimd*. +If *method* is *nmpimd*, the normal mode representation is used to integrate the equations of motion. +The exact solution of harmonic oscillator is used to propagate the free ring polymer part of the Hamiltonian. +If *method* is *pimd*, the Cartesian representation is used to integrate the equations of motion. +The harmonic force is added to the total force of the system, and the numerical integrator is used to propagate the Hamiltonian. The keyword *integrator* specifies the Trotter splitting method used by *fix pimd/langevin*. See :ref:`(Liu) ` for a discussion on the OBABO and BAOAB splitting schemes. Typically @@ -208,6 +215,7 @@ The keyword *thermostat* reads *style* and *seed* of thermostat for fix style *p be *PILE_L* (path integral Langevin equation local thermostat, as described in :ref:`Ceriotti `), and *seed* should a positive integer number, which serves as the seed of the pseudo random number generator. .. note:: + The fix style *pimd/langevin* uses the stochastic PILE_L thermostat to control temperature. This thermostat works on the normal modes of the ring polymer. The *tau* parameter controls the centroid mode, and the *scale* parameter controls the non-centroid modes. @@ -270,6 +278,7 @@ related tasks for each of the partitions, e.g. read_restart system_${ibead}.restart2 .. note:: + Fix *pimd/langevin* dumps the Cartesian coordinates, but dumps the velocities and forces in the normal mode representation. If the Cartesian velocities and forces are needed, it is easy to perform the transformation when doing post-processing. From 9ef1b2d64d7a97af80cb20462026533430781dfc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 06:20:55 -0500 Subject: [PATCH 344/417] apply clang-format --- src/REPLICA/fix_pimd_langevin.cpp | 195 +++++++++++++++--------------- 1 file changed, 100 insertions(+), 95 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index ba02b7a184..d328420ce9 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -173,7 +173,10 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : "mass and normal mode mass are supported!"); } else if (strcmp(arg[i], "scale") == 0) { if (method == PIMD) - error->universe_all(FLERR, "The scale parameter of the PILE_L thermostat is not supported for method pimd. Delete scale parameter if you do want to use method pimd."); + error->universe_all( + FLERR, + "The scale parameter of the PILE_L thermostat is not supported for method pimd. Delete " + "scale parameter if you do want to use method pimd."); pilescale = utils::numeric(FLERR, arg[i + 1], false, lmp); if (pilescale < 0.0) error->universe_all(FLERR, "Invalid PILE_L scale value for fix pimd/langevin"); @@ -250,10 +253,13 @@ FixPIMDLangevin::FixPIMDLangevin(LAMMPS *lmp, int narg, char **arg) : FLERR, fmt::format("Must not use pressure coupling with {} ensemble", Ensembles[ensemble])); if (method == PIMD && pstat_flag) - error->universe_all(FLERR, "Pressure control has not been supported for method pimd yet. Please set method to nmpimd."); + error->universe_all(FLERR, + "Pressure control has not been supported for method pimd yet. Please set " + "method to nmpimd."); if (method == PIMD && fmmode == NORMAL) - error->universe_all(FLERR, "Normal mode mass is not supported for method pimd. Please set method to nmpimd."); + error->universe_all( + FLERR, "Normal mode mass is not supported for method pimd. Please set method to nmpimd."); /* Initiation */ @@ -487,13 +493,13 @@ void FixPIMDLangevin::setup(int vflag) nmpimd_transform(bufsortedall, x, M_x2xp[universe->iworld]); else if (cmode == MULTI_PROC) nmpimd_transform(bufbeads, x, M_x2xp[universe->iworld]); - } - else if (method == PIMD) { + } else if (method == PIMD) { inter_replica_comm(x); spring_force(); - } - else { - error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } else { + error->universe_all( + FLERR, + "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } collect_xc(); compute_spring_energy(); @@ -549,13 +555,13 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) a_step(); qc_step(); a_step(); - } - else if (method == PIMD) { + } else if (method == PIMD) { q_step(); q_step(); - } - else { - error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } else { + error->universe_all( + FLERR, + "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } } else if (integrator == BAOAB) { if (pstat_flag) { @@ -572,12 +578,12 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) nmpimd_transform(bufbeads, x, M_x2xp[universe->iworld]); qc_step(); a_step(); - } - else if (method == PIMD) { + } else if (method == PIMD) { q_step(); - } - else { - error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } else { + error->universe_all( + FLERR, + "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } if (tstat_flag) { o_step(); @@ -587,15 +593,17 @@ void FixPIMDLangevin::initial_integrate(int /*vflag*/) if (method == NMPIMD) { qc_step(); a_step(); - } - else if (method == PIMD) { + } else if (method == PIMD) { q_step(); - } - else { - error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + } else { + error->universe_all( + FLERR, + "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } } else { - error->universe_all(FLERR, "Unknown integrator parameter for fix pimd/langevin. Only obabo and baoab integrators are supported!"); + error->universe_all(FLERR, + "Unknown integrator parameter for fix pimd/langevin. Only obabo and baoab " + "integrators are supported!"); } collect_xc(); @@ -652,25 +660,25 @@ void FixPIMDLangevin::post_force(int /*flag*/) tagint *tag = atom->tag; if (method == NMPIMD) { - if (atom->nmax > maxunwrap) reallocate_x_unwrap(); - if (atom->nmax > maxxc) reallocate_xc(); - for (int i = 0; i < nlocal; i++) { - x_unwrap[i][0] = x[i][0]; - x_unwrap[i][1] = x[i][1]; - x_unwrap[i][2] = x[i][2]; - } - if (mapflag) { - for (int i = 0; i < nlocal; i++) { domain->unmap(x_unwrap[i], image[i]); } - } - for (int i = 0; i < nlocal; i++) { - xc[i][0] = xcall[3 * (tag[i] - 1) + 0]; - xc[i][1] = xcall[3 * (tag[i] - 1) + 1]; - xc[i][2] = xcall[3 * (tag[i] - 1) + 2]; - } + if (atom->nmax > maxunwrap) reallocate_x_unwrap(); + if (atom->nmax > maxxc) reallocate_xc(); + for (int i = 0; i < nlocal; i++) { + x_unwrap[i][0] = x[i][0]; + x_unwrap[i][1] = x[i][1]; + x_unwrap[i][2] = x[i][2]; + } + if (mapflag) { + for (int i = 0; i < nlocal; i++) { domain->unmap(x_unwrap[i], image[i]); } + } + for (int i = 0; i < nlocal; i++) { + xc[i][0] = xcall[3 * (tag[i] - 1) + 0]; + xc[i][1] = xcall[3 * (tag[i] - 1) + 1]; + xc[i][2] = xcall[3 * (tag[i] - 1) + 2]; + } - compute_vir(); - compute_cvir(); - compute_t_vir(); + compute_vir(); + compute_cvir(); + compute_t_vir(); } if (method == PIMD) { @@ -1032,13 +1040,12 @@ void FixPIMDLangevin::langevin_init() } for (int i = 0; i < np; i++) { out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_k[i], tau_k[i], - c1_k[i], c2_k[i]); + c1_k[i], c2_k[i]); } - } - else if (method == PIMD) { + } else if (method == PIMD) { for (int i = 0; i < np; i++) { - out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_np / sqrt(fmass), tau, - c1, c2); + out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_np / sqrt(fmass), + tau, c1, c2); } } if (thermostat == PILE_L) out += "PILE_L thermostat successfully initialized!\n"; @@ -1064,15 +1071,14 @@ void FixPIMDLangevin::o_step() atom->v[i][2] = c1_k[universe->iworld] * atom->v[i][2] + c2_k[universe->iworld] * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); } - } - else if (method == PIMD) { + } else if (method == PIMD) { for (int i = 0; i < nlocal; i++) { - atom->v[i][0] = c1 * atom->v[i][0] + - c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); - atom->v[i][1] = c1 * atom->v[i][1] + - c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); - atom->v[i][2] = c1 * atom->v[i][2] + - c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][0] = + c1 * atom->v[i][0] + c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][1] = + c1 * atom->v[i][1] + c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); + atom->v[i][2] = + c1 * atom->v[i][2] + c2 * sqrt(1.0 / mass[type[i]] / beta_np) * random->gaussian(); } } } @@ -1168,39 +1174,38 @@ void FixPIMDLangevin::spring_force() double **x = atom->x; double **f = atom->f; - double* _mass = atom->mass; - int* type = atom->type; + double *_mass = atom->mass; + int *type = atom->type; int nlocal = atom->nlocal; - tagint* tagtmp = atom->tag; + tagint *tagtmp = atom->tag; // printf("iworld = %d, x_last = %d, x_next = %d\n", universe->iworld, x_last, x_next); int *mask = atom->mask; // int idx_tmp = atom->map(1); - for (int i=0; ix; - double *_mass = atom->mass; - int *type = atom->type; - int nlocal = atom->nlocal; + double **x = atom->x; + double *_mass = atom->mass; + int *type = atom->type; + int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) { - spring_energy += 0.5 * _mass[type[i]] * fbond * lam[universe->iworld] * - (x[i][0] * x[i][0] + x[i][1] * x[i][1] + x[i][2] * x[i][2]); - } - MPI_Allreduce(&spring_energy, &se_bead, 1, MPI_DOUBLE, MPI_SUM, world); - MPI_Allreduce(&se_bead, &total_spring_energy, 1, MPI_DOUBLE, MPI_SUM, universe->uworld); - total_spring_energy /= universe->procs_per_world[universe->iworld]; - } - else if (method == PIMD) { + for (int i = 0; i < nlocal; i++) { + spring_energy += 0.5 * _mass[type[i]] * fbond * lam[universe->iworld] * + (x[i][0] * x[i][0] + x[i][1] * x[i][1] + x[i][2] * x[i][2]); + } + MPI_Allreduce(&spring_energy, &se_bead, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&se_bead, &total_spring_energy, 1, MPI_DOUBLE, MPI_SUM, universe->uworld); + total_spring_energy /= universe->procs_per_world[universe->iworld]; + } else if (method == PIMD) { total_spring_energy = se_bead = 0.0; MPI_Allreduce(&spring_energy, &se_bead, 1, MPI_DOUBLE, MPI_SUM, world); MPI_Allreduce(&se_bead, &total_spring_energy, 1, MPI_DOUBLE, MPI_SUM, universe->uworld); - total_spring_energy /= universe->procs_per_world[universe->iworld]; - } - else { - error->universe_all(FLERR, "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); + total_spring_energy /= universe->procs_per_world[universe->iworld]; + } else { + error->universe_all( + FLERR, + "Unknown method parameter for fix pimd/langevin. Only nmpimd and pimd are supported!"); } } From 7a425475e039b341489ad080a6ebfc71cab46e1a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 10:27:28 -0500 Subject: [PATCH 345/417] get rid of redundant class members --- src/OPENMP/fix_rigid_nh_omp.cpp | 8 +++-- src/OPENMP/fix_rigid_omp.cpp | 38 +++++++++++++---------- src/OPENMP/fix_rigid_small_omp.cpp | 14 ++++++--- src/RIGID/fix_rigid.cpp | 49 ++++++++++++++---------------- src/RIGID/fix_rigid.h | 2 -- src/RIGID/fix_rigid_nh.cpp | 17 ++++++----- src/RIGID/fix_rigid_nh_small.cpp | 21 +++++++------ src/RIGID/fix_rigid_small.cpp | 47 ++++++++++++++-------------- src/RIGID/fix_rigid_small.h | 2 -- 9 files changed, 106 insertions(+), 92 deletions(-) diff --git a/src/OPENMP/fix_rigid_nh_omp.cpp b/src/OPENMP/fix_rigid_nh_omp.cpp index 78dcd96f22..d02b69b3be 100644 --- a/src/OPENMP/fix_rigid_nh_omp.cpp +++ b/src/OPENMP/fix_rigid_nh_omp.cpp @@ -211,7 +211,7 @@ void FixRigidNHOMP::initial_integrate(int vflag) // set coords/orient and velocity/rotation of atoms in rigid bodies // from quarternion and omega - if (dimension == 2) { + if (domain->dimension == 2) { if (triclinic) { if (evflag) set_xv_thr<1,1,2>(); @@ -338,11 +338,13 @@ void FixRigidNHOMP::compute_forces_and_torques() // a few atoms each. so we loop over all atoms for all threads // and then each thread only processes some bodies. - const int nthreads=comm->nthreads; memset(&sum[0][0],0,6*nbody*sizeof(double)); #if defined(_OPENMP) + const int nthreads=comm->nthreads; #pragma omp parallel LMP_DEFAULT_NONE +#else + const int nthreads=1; #endif { #if defined(_OPENMP) @@ -518,7 +520,7 @@ void FixRigidNHOMP::final_integrate() // virial is already setup from initial_integrate // triclinic only matters for virial calculation. - if (dimension == 2) { + if (domain->dimension == 2) { if (evflag) if (triclinic) set_v_thr<1,1,2>(); diff --git a/src/OPENMP/fix_rigid_omp.cpp b/src/OPENMP/fix_rigid_omp.cpp index c9cfee07c6..75794b3419 100644 --- a/src/OPENMP/fix_rigid_omp.cpp +++ b/src/OPENMP/fix_rigid_omp.cpp @@ -92,7 +92,7 @@ void FixRigidOMP::initial_integrate(int vflag) // set coords/orient and velocity/rotation of atoms in rigid bodies // from quarternion and omega - if (dimension == 2) { + if (domain->dimension == 2) { if (triclinic) { if (evflag) set_xv_thr<1,1,2>(); @@ -212,11 +212,13 @@ void FixRigidOMP::compute_forces_and_torques() // a few atoms each. so we loop over all atoms for all threads // and then each thread only processes some bodies. - const int nthreads=comm->nthreads; memset(&sum[0][0],0,6*nbody*sizeof(double)); #if defined(_OPENMP) + const int nthreads=comm->nthreads; #pragma omp parallel LMP_DEFAULT_NONE +#else + const int nthreads=1; #endif { #if defined(_OPENMP) @@ -293,7 +295,7 @@ void FixRigidOMP::compute_forces_and_torques() void FixRigidOMP::final_integrate() { if (!earlyflag) compute_forces_and_torques(); - if (dimension == 2) enforce2d(); + if (domain->dimension == 2) enforce2d(); // update vcm and angmom @@ -323,23 +325,27 @@ void FixRigidOMP::final_integrate() // virial is already setup from initial_integrate // triclinic only matters for virial calculation. - if (dimension == 2) { - if (evflag) - if (triclinic) - set_v_thr<1,1,2>(); +#if defined(_OPENMP) + if (domain->dimension == 2) { + if (evflag) + if (triclinic) + set_v_thr<1,1,2>(); + else + set_v_thr<0,1,2>(); else - set_v_thr<0,1,2>(); - else - set_v_thr<0,0,2>(); + set_v_thr<0,0,2>(); } else { - if (evflag) - if (triclinic) - set_v_thr<1,1,3>(); + if (evflag) + if (triclinic) + set_v_thr<1,1,3>(); + else + set_v_thr<0,1,3>(); else - set_v_thr<0,1,3>(); - else - set_v_thr<0,0,3>(); + set_v_thr<0,0,3>(); } +#else + set_v(); +#endif } /* ---------------------------------------------------------------------- diff --git a/src/OPENMP/fix_rigid_small_omp.cpp b/src/OPENMP/fix_rigid_small_omp.cpp index 0eda964368..59fd274f95 100644 --- a/src/OPENMP/fix_rigid_small_omp.cpp +++ b/src/OPENMP/fix_rigid_small_omp.cpp @@ -98,7 +98,8 @@ void FixRigidSmallOMP::initial_integrate(int vflag) // set coords/orient and velocity/rotation of atoms in rigid bodies - if (dimension == 2) { +#if defined(_OPENMP) + if (domain->dimension == 2) { if (triclinic) { if (evflag) set_xv_thr<1,1,2>(); @@ -124,6 +125,9 @@ void FixRigidSmallOMP::initial_integrate(int vflag) set_xv_thr<0,0,3>(); } } +#else + set_xv(); +#endif } /* ---------------------------------------------------------------------- */ @@ -134,7 +138,6 @@ void FixRigidSmallOMP::compute_forces_and_torques() const auto * _noalias const f = (dbl3_t *) atom->f[0]; const double * const * const torque_one = atom->torque; const int nlocal = atom->nlocal; - const int nthreads=comm->nthreads; #if defined(_OPENMP) #pragma omp parallel for LMP_DEFAULT_NONE schedule(static) @@ -152,7 +155,10 @@ void FixRigidSmallOMP::compute_forces_and_torques() // and then each thread only processes some bodies. #if defined(_OPENMP) + const int nthreads=comm->nthreads; #pragma omp parallel LMP_DEFAULT_NONE +#else + const int nthreads=1; #endif { #if defined(_OPENMP) @@ -238,7 +244,7 @@ void FixRigidSmallOMP::compute_forces_and_torques() void FixRigidSmallOMP::final_integrate() { if (!earlyflag) compute_forces_and_torques(); - if (dimension == 2) enforce2d(); + if (domain->dimension == 2) enforce2d(); // update vcm and angmom, recompute omega @@ -274,7 +280,7 @@ void FixRigidSmallOMP::final_integrate() // virial is already setup from initial_integrate // triclinic only matters for virial calculation. - if (dimension == 2) { + if (domain->dimension == 2) { if (evflag) { if (triclinic) set_v_thr<1,1,2>(); diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index e15d43bcbc..628abb240e 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -67,13 +67,9 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : dof_flag = 1; centroidstressflag = CENTROID_NOTAVAIL; - MPI_Comm_rank(world, &me); - MPI_Comm_size(world, &nprocs); - // perform initial allocation of atom-based arrays // register with Atom class - dimension = domain->dimension; extended = orientflag = dorientflag = 0; body = nullptr; xcmimage = nullptr; @@ -300,7 +296,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nbody; i++) { fflag[i][0] = fflag[i][1] = fflag[i][2] = 1.0; tflag[i][0] = tflag[i][1] = tflag[i][2] = 1.0; - if (dimension == 2) fflag[i][2] = tflag[i][0] = tflag[i][1] = 0.0; + if (domain->dimension == 2) fflag[i][2] = tflag[i][0] = tflag[i][1] = 0.0; } // number of linear rigid bodies is counted later @@ -361,7 +357,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR, "Illegal fix {} command", style); - if ((dimension == 2) && (zflag == 1.0)) + if ((domain->dimension == 2) && (zflag == 1.0)) error->all(FLERR, "Fix rigid z force cannot be on for 2d simulation"); int count = 0; @@ -401,7 +397,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR, "Illegal fix {} command", style); - if (dimension == 2 && (xflag == 1.0 || yflag == 1.0)) + if (domain->dimension == 2 && (xflag == 1.0 || yflag == 1.0)) error->all(FLERR, "Fix rigid xy torque cannot be on for 2d simulation"); int count = 0; @@ -446,7 +442,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; - if (dimension == 2) { + if (domain->dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } @@ -459,7 +455,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : p_stop[0] = p_stop[1] = p_stop[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; - if (dimension == 2) { + if (domain->dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } @@ -576,12 +572,12 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < 3; i++) if (p_flag[i]) pstat_flag = 1; - if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; + if (pcouple == XYZ || (domain->dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; // initialize Marsaglia RNG with processor-unique seed - if (langflag) random = new RanMars(lmp,seed + me); + if (langflag) random = new RanMars(lmp, seed + comm->me); else random = nullptr; // initialize vector output quantities in case accessed before run @@ -623,7 +619,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : int nsum = 0; for (ibody = 0; ibody < nbody; ibody++) nsum += nrigid[ibody]; - if (me == 0) + if (comm->me == 0) utils::logmesg(lmp," {} rigid bodies with {} atoms\n",nbody,nsum); } @@ -709,14 +705,15 @@ void FixRigid::init() int count = 0; for (auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) count++; - if (count > 1 && me == 0) error->warning(FLERR,"More than one fix rigid"); + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one fix rigid"); if (earlyflag) { bool rflag = false; for (auto &ifix : modify->get_fix_list()) { if (ifix->rigid_flag) rflag = true; if ((comm->me == 0) && rflag && (ifix->setmask() & POST_FORCE) && !ifix->rigid_flag) - error->warning(FLERR,"Fix {} with ID {} alters forces after fix rigid", + error->warning(FLERR, "Fix {} with ID {} alters forces after fix rigid", ifix->style, ifix->id); } } @@ -881,7 +878,7 @@ void FixRigid::setup(int vflag) // enforce 2d body forces and torques - if (dimension == 2) enforce2d(); + if (domain->dimension == 2) enforce2d(); // zero langextra in case Langevin thermostat not used // no point to calling post_force() here since langextra @@ -1006,7 +1003,7 @@ void FixRigid::final_integrate() // if 2d model, enforce2d() on body forces/torques if (!earlyflag) compute_forces_and_torques(); - if (dimension == 2) enforce2d(); + if (domain->dimension == 2) enforce2d(); // update vcm and angmom // fflag,tflag = 0 for some dimensions in 2d @@ -1097,7 +1094,7 @@ void FixRigid::image_shift() void FixRigid::apply_langevin_thermostat() { - if (me == 0) { + if (comm->me == 0) { double gamma1,gamma2; double wbody[3],tbody[3]; double delta = update->ntimestep - update->beginstep; @@ -1295,7 +1292,7 @@ int FixRigid::dof(int tgroup) if (nall[ibody]+mall[ibody] > 0 && nall[ibody]+mall[ibody] != nrigid[ibody]) flag = 1; } - if (flag && me == 0) + if (flag && (comm->me == 0)) error->warning(FLERR,"Computing temperature of portions of rigid bodies"); // remove appropriate DOFs for each rigid body wholly in temperature group @@ -1311,7 +1308,7 @@ int FixRigid::dof(int tgroup) int n = 0; nlinear = 0; - if (dimension == 3) { + if (domain->dimension == 3) { for (int ibody = 0; ibody < nbody; ibody++) if (nall[ibody]+mall[ibody] == nrigid[ibody]) { n += 3*nall[ibody] + 6*mall[ibody] - 6; @@ -1321,7 +1318,7 @@ int FixRigid::dof(int tgroup) nlinear++; } } - } else if (dimension == 2) { + } else if (domain->dimension == 2) { for (int ibody = 0; ibody < nbody; ibody++) if (nall[ibody]+mall[ibody] == nrigid[ibody]) n += 2*nall[ibody] + 3*mall[ibody] - 3; @@ -1422,7 +1419,7 @@ void FixRigid::set_xv() v[i][1] = omega[ibody][2]*x[i][0] - omega[ibody][0]*x[i][2] + vcm[ibody][1]; v[i][2] = omega[ibody][0]*x[i][1] - omega[ibody][1]*x[i][0] + vcm[ibody][2]; - if (dimension == 2) { + if (domain->dimension == 2) { x[i][2] = 0.0; v[i][2] = 0.0; } @@ -1585,7 +1582,7 @@ void FixRigid::set_v() v[i][1] = omega[ibody][2]*delta[0] - omega[ibody][0]*delta[2] + vcm[ibody][1]; v[i][2] = omega[ibody][0]*delta[1] - omega[ibody][1]*delta[0] + vcm[ibody][2]; - if (dimension == 2) v[i][2] = 0.0; + if (domain->dimension == 2) v[i][2] = 0.0; // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external @@ -1798,8 +1795,7 @@ void FixRigid::setup_bodies_static() if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) || (zbox && !periodicity[2])) - error->one(FLERR,"Fix rigid atom has non-zero image flag " - "in a non-periodic dimension"); + error->one(FLERR,"Fix rigid atom has non-zero image flag in a non-periodic dimension"); if (triclinic == 0) { xunwrap = x[i][0] + xbox*xprd; @@ -2307,7 +2303,7 @@ void FixRigid::readfile(int which, double *vec, double **array1, double **array2 char line[MAXLINE]; // open file and read and parse first non-empty, non-comment line containing the number of bodies - if (me == 0) { + if (comm->me == 0) { fp = fopen(inpfile,"r"); if (fp == nullptr) error->one(FLERR,"Cannot open fix rigid infile {}: {}", inpfile, utils::getsyserror()); @@ -2332,6 +2328,7 @@ void FixRigid::readfile(int which, double *vec, double **array1, double **array2 auto buffer = new char[CHUNK*MAXLINE]; int nread = 0; + int me = comm->me; while (nread < nlines) { nchunk = MIN(nlines-nread,CHUNK); eofflag = utils::read_lines_from_file(fp,nchunk,MAXLINE,buffer,me,world); @@ -2406,7 +2403,7 @@ void FixRigid::readfile(int which, double *vec, double **array1, double **array2 nread += nchunk; } - if (me == 0) fclose(fp); + if (comm->me == 0) fclose(fp); delete[] buffer; } diff --git a/src/RIGID/fix_rigid.h b/src/RIGID/fix_rigid.h index 2de1b59de6..361ddd2720 100644 --- a/src/RIGID/fix_rigid.h +++ b/src/RIGID/fix_rigid.h @@ -60,7 +60,6 @@ class FixRigid : public Fix { double compute_array(int, int) override; protected: - int me, nprocs; double dtv, dtf, dtq; double *step_respa; int triclinic; @@ -71,7 +70,6 @@ class FixRigid : public Fix { int setupflag; // 1 if body properties are setup, else 0 int earlyflag; // 1 if forces/torques computed at post_force() - int dimension; // # of dimensions int nbody; // # of rigid bodies int nlinear; // # of linear rigid bodies int *nrigid; // # of atoms in each rigid body diff --git a/src/RIGID/fix_rigid_nh.cpp b/src/RIGID/fix_rigid_nh.cpp index 9c9d582d94..f694d090d1 100644 --- a/src/RIGID/fix_rigid_nh.cpp +++ b/src/RIGID/fix_rigid_nh.cpp @@ -61,14 +61,14 @@ FixRigidNH::FixRigidNH(LAMMPS *lmp, int narg, char **arg) : (p_flag[2] == 1 && p_period[2] <= 0.0)) error->all(FLERR,"Fix rigid npt/nph period must be > 0.0"); - if (dimension == 2 && p_flag[2]) + if (domain->dimension == 2 && p_flag[2]) error->all(FLERR,"Invalid fix rigid npt/nph command for a 2d simulation"); - if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) + if (domain->dimension == 2 && (pcouple == YZ || pcouple == XZ)) error->all(FLERR,"Invalid fix rigid npt/nph command for a 2d simulation"); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); - if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) + if (pcouple == XYZ && domain->dimension == 3 && p_flag[2] == 0) error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); @@ -89,12 +89,12 @@ FixRigidNH::FixRigidNH(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Cannot use fix rigid npt/nph on a non-periodic dimension"); - if (pcouple == XYZ && dimension == 3 && + if (pcouple == XYZ && domain->dimension == 3 && (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); - if (pcouple == XYZ && dimension == 2 && + if (pcouple == XYZ && domain->dimension == 2 && (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); @@ -224,6 +224,7 @@ void FixRigidNH::init() if (force->kspace) kspace_flag = 1; else kspace_flag = 0; + int dimension = domain->dimension; nf_t = dimension * nbody; if (dimension == 3) { nf_r = dimension * nbody; @@ -391,6 +392,7 @@ void FixRigidNH::setup(int vflag) // initial forces on barostat thermostat variables + int dimension = domain->dimension; if (pstat_flag) { for (int i = 0; i < 3; i++) if (p_flag[i]) { @@ -821,6 +823,7 @@ void FixRigidNH::nhc_press_integrate() // update thermostat masses + int dimension = domain->dimension; double tb_mass = kt / (p_freq_max * p_freq_max); q_b[0] = dimension * dimension * tb_mass; for (i = 1; i < p_chain; i++) { @@ -927,7 +930,7 @@ double FixRigidNH::compute_scalar() energy += e*(0.5/pdim); double vol; - if (dimension == 2) vol = domain->xprd * domain->yprd; + if (domain->dimension == 2) vol = domain->xprd * domain->yprd; else vol = domain->xprd * domain->yprd * domain->zprd; double p0 = (p_target[0] + p_target[1] + p_target[2]) / 3.0; @@ -1071,7 +1074,7 @@ void FixRigidNH::nh_epsilon_dot() int i; double volume,scale,f_epsilon; - if (dimension == 2) volume = domain->xprd*domain->yprd; + if (domain->dimension == 2) volume = domain->xprd*domain->yprd; else volume = domain->xprd*domain->yprd*domain->zprd; // MTK terms diff --git a/src/RIGID/fix_rigid_nh_small.cpp b/src/RIGID/fix_rigid_nh_small.cpp index 7780a15011..b00fca6a2e 100644 --- a/src/RIGID/fix_rigid_nh_small.cpp +++ b/src/RIGID/fix_rigid_nh_small.cpp @@ -57,14 +57,14 @@ FixRigidNHSmall::FixRigidNHSmall(LAMMPS *lmp, int narg, char **arg) : // error checks - if (dimension == 2 && p_flag[2]) + if (domain->dimension == 2 && p_flag[2]) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); - if (dimension == 2 && (pcouple == YZ || pcouple == XZ)) + if (domain->dimension == 2 && (pcouple == YZ || pcouple == XZ)) error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) error->all(FLERR,"Invalid fix {} command pressure settings", style); - if (pcouple == XYZ && dimension == 3 && p_flag[2] == 0) + if (pcouple == XYZ && domain->dimension == 3 && p_flag[2] == 0) error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) error->all(FLERR,"Invalid fix {} command pressure settings", style); @@ -82,12 +82,12 @@ FixRigidNHSmall::FixRigidNHSmall(LAMMPS *lmp, int narg, char **arg) : if (p_flag[2] && domain->zperiodic == 0) error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); - if (pcouple == XYZ && dimension == 3 && + if (pcouple == XYZ && domain->dimension == 3 && (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) error->all(FLERR, "Invalid fix {} command pressure settings", style); - if (pcouple == XYZ && dimension == 2 && + if (pcouple == XYZ && domain->dimension == 2 && (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) error->all(FLERR, "Invalid fix {} command pressure settings", style); @@ -264,7 +264,7 @@ void FixRigidNHSmall::init() pdim = p_flag[0] + p_flag[1] + p_flag[2]; if (vol0 == 0.0) { - if (dimension == 2) vol0 = domain->xprd * domain->yprd; + if (domain->dimension == 2) vol0 = domain->xprd * domain->yprd; else vol0 = domain->xprd * domain->yprd * domain->zprd; } @@ -382,6 +382,7 @@ void FixRigidNHSmall::setup(int vflag) } // initial forces on barostat thermostat variables + int dimension = domain->dimension; if (pstat_flag) { for (int i = 0; i < 3; i++) @@ -832,7 +833,8 @@ void FixRigidNHSmall::nhc_press_integrate() double lkt_press = kt; // update thermostat masses - + + int dimension = domain->dimension; double tb_mass = kt / (p_freq_max * p_freq_max); q_b[0] = dimension * dimension * tb_mass; for (i = 1; i < p_chain; i++) { @@ -989,7 +991,7 @@ double FixRigidNHSmall::compute_scalar() energy += e*(0.5/pdim); double vol; - if (dimension == 2) vol = domain->xprd * domain->yprd; + if (domain->dimension == 2) vol = domain->xprd * domain->yprd; else vol = domain->xprd * domain->yprd * domain->zprd; double p0 = (p_target[0] + p_target[1] + p_target[2]) / 3.0; @@ -1133,7 +1135,7 @@ void FixRigidNHSmall::nh_epsilon_dot() int i; double volume,scale,f_epsilon; - if (dimension == 2) volume = domain->xprd*domain->yprd; + if (domain->dimension == 2) volume = domain->xprd*domain->yprd; else volume = domain->xprd*domain->yprd*domain->zprd; // MTK terms @@ -1161,6 +1163,7 @@ void FixRigidNHSmall::nh_epsilon_dot() void FixRigidNHSmall::compute_dof() { // total translational and rotational degrees of freedom + int dimension = domain->dimension; nf_t = dimension * nlocal_body; if (dimension == 3) { diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index d8e6358ddb..bd49834f15 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -75,13 +75,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : stores_ids = 1; centroidstressflag = CENTROID_AVAIL; - MPI_Comm_rank(world,&me); - MPI_Comm_size(world,&nprocs); - // perform initial allocation of atom-based arrays // register with Atom class - dimension = domain->dimension; extended = orientflag = dorientflag = customflag = 0; bodyown = nullptr; bodytag = nullptr; @@ -257,7 +253,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; - if (dimension == 2) { + if (domain->dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } @@ -272,7 +268,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : p_period[0] = p_period[1] = p_period[2] = utils::numeric(FLERR,arg[iarg+3],false,lmp); p_flag[0] = p_flag[1] = p_flag[2] = 1; - if (dimension == 2) { + if (domain->dimension == 2) { p_start[2] = p_stop[2] = p_period[2] = 0.0; p_flag[2] = 0; } @@ -381,7 +377,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < 3; i++) if (p_flag[i]) pstat_flag = 1; - if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO; + if (pcouple == XYZ || (domain->dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; // create rigid bodies based on molecule or custom ID @@ -450,7 +446,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : bigint atomall; MPI_Allreduce(&atomone,&atomall,1,MPI_LMP_BIGINT,MPI_SUM,world); - if (me == 0) { + if (comm->me == 0) { utils::logmesg(lmp," {} rigid bodies with {} atoms\n" " {:.8} = max distance from body owner to body atom\n", nbody,atomall,maxextent); @@ -529,7 +525,8 @@ void FixRigidSmall::init() int count = 0; for (auto &ifix : modify->get_fix_list()) if (ifix->rigid_flag) count++; - if (count > 1 && me == 0) error->warning(FLERR, "More than one fix rigid command"); + if (count > 1 && comm->me == 0) + error->warning(FLERR, "More than one fix rigid command"); if (earlyflag) { bool rflag = false; @@ -690,7 +687,7 @@ void FixRigidSmall::setup(int vflag) // enforce 2d body forces and torques - if (dimension == 2) enforce2d(); + if (domain->dimension == 2) enforce2d(); // reverse communicate fcm, torque of all bodies @@ -841,7 +838,7 @@ void FixRigidSmall::final_integrate() // if 2d model, enforce2d() on body forces/torques if (!earlyflag) compute_forces_and_torques(); - if (dimension == 2) enforce2d(); + if (domain->dimension == 2) enforce2d(); // update vcm and angmom, recompute omega @@ -1182,7 +1179,7 @@ int FixRigidSmall::dof(int tgroup) } int flagall; MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_MAX,world); - if (flagall && me == 0) + if (flagall && comm->me == 0) error->warning(FLERR,"Computing temperature of portions of rigid bodies"); // remove appropriate DOFs for each rigid body wholly in temperature group @@ -1200,7 +1197,7 @@ int FixRigidSmall::dof(int tgroup) int n = 0; nlinear = 0; - if (dimension == 3) { + if (domain->dimension == 3) { for (int ibody = 0; ibody < nlocal_body; ibody++) { if (counts[ibody][0]+counts[ibody][1] == counts[ibody][2]) { n += 3*counts[ibody][0] + 6*counts[ibody][1] - 6; @@ -1211,7 +1208,7 @@ int FixRigidSmall::dof(int tgroup) } } } - } else if (dimension == 2) { + } else if (domain->dimension == 2) { for (int ibody = 0; ibody < nlocal_body; ibody++) if (counts[ibody][0]+counts[ibody][1] == counts[ibody][2]) n += 2*counts[ibody][0] + 3*counts[ibody][1] - 3; @@ -1305,7 +1302,7 @@ void FixRigidSmall::set_xv() v[i][1] = b->omega[2]*x[i][0] - b->omega[0]*x[i][2] + b->vcm[1]; v[i][2] = b->omega[0]*x[i][1] - b->omega[1]*x[i][0] + b->vcm[2]; - if (dimension == 2) { + if (domain->dimension == 2) { x[i][2] = 0.0; v[i][2] = 0.0; } @@ -1476,7 +1473,7 @@ void FixRigidSmall::set_v() v[i][1] = b->omega[2]*delta[0] - b->omega[0]*delta[2] + b->vcm[1]; v[i][2] = b->omega[0]*delta[1] - b->omega[1]*delta[0] + b->vcm[2]; - if (dimension == 2) v[i][2] = 0.0; + if (domain->dimension == 2) v[i][2] = 0.0; // virial = unwrapped coords dotted into body constraint force // body constraint force = implied force due to v change minus f external @@ -1595,6 +1592,8 @@ void FixRigidSmall::create_bodies(tagint *bodyID) double **x = atom->x; tagint *tag = atom->tag; imageint *image = atom->image; + int me = comm->me; + int nprocs = comm->nprocs; m = 0; for (i = 0; i < nlocal; i++) { @@ -2485,7 +2484,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) // open file and read header - if (me == 0) { + if (comm->me == 0) { fp = fopen(inpfile,"r"); if (fp == nullptr) error->one(FLERR,"Cannot open fix {} file {}: {}", style, inpfile, utils::getsyserror()); @@ -2510,6 +2509,8 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) auto buffer = new char[CHUNK*MAXLINE]; int nread = 0; + int me = comm->me; + while (nread < nlines) { nchunk = MIN(nlines-nread,CHUNK); eofflag = utils::read_lines_from_file(fp,nchunk,MAXLINE,buffer,me,world); @@ -2583,7 +2584,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) nread += nchunk; } - if (me == 0) fclose(fp); + if (comm->me == 0) fclose(fp); delete[] buffer; } @@ -2603,7 +2604,7 @@ void FixRigidSmall::write_restart_file(const char *file) // proc 0 opens file and writes header - if (me == 0) { + if (comm->me == 0) { auto outfile = std::string(file) + ".rigid"; fp = fopen(outfile.c_str(),"w"); if (fp == nullptr) @@ -2625,7 +2626,7 @@ void FixRigidSmall::write_restart_file(const char *file) MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world); double **buf; - if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"rigid/small:buf"); + if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"rigid/small:buf"); else memory->create(buf,MAX(1,sendrow),ncol,"rigid/small:buf"); // pack my rigid body info into buf @@ -2668,10 +2669,10 @@ void FixRigidSmall::write_restart_file(const char *file) int tmp,recvrow; - if (me == 0) { + if (comm->me == 0) { MPI_Status status; MPI_Request request; - for (int iproc = 0; iproc < nprocs; iproc++) { + for (int iproc = 0; iproc < comm->nprocs; iproc++) { if (iproc) { MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_DOUBLE,iproc,0,world,&request); MPI_Send(&tmp,0,MPI_INT,iproc,0,world); @@ -2703,7 +2704,7 @@ void FixRigidSmall::write_restart_file(const char *file) // clean up and close file memory->destroy(buf); - if (me == 0) fclose(fp); + if (comm->me == 0) fclose(fp); } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index 75cc432c7a..0070d976df 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -67,11 +67,9 @@ class FixRigidSmall : public Fix { double memory_usage() override; protected: - int me, nprocs; double dtv, dtf, dtq; double *step_respa; int triclinic; - int dimension; char *inpfile; // file to read rigid body attributes from int setupflag; // 1 if body properties are setup, else 0 From 649aad3877f029cf7e56e925e7ea6885e1033b4f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 11:14:07 -0500 Subject: [PATCH 346/417] modernize --- src/RIGID/fix_rigid_nh.cpp | 88 +++++++++++++++----------------- src/RIGID/fix_rigid_nh_small.cpp | 32 ++++++------ 2 files changed, 55 insertions(+), 65 deletions(-) diff --git a/src/RIGID/fix_rigid_nh.cpp b/src/RIGID/fix_rigid_nh.cpp index f694d090d1..ec5e7845ad 100644 --- a/src/RIGID/fix_rigid_nh.cpp +++ b/src/RIGID/fix_rigid_nh.cpp @@ -175,13 +175,13 @@ FixRigidNH::~FixRigidNH() delete[] rfix; if (tcomputeflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; // delete pressure if fix created it if (pstat_flag) { if (pcomputeflag) modify->delete_compute(id_press); - delete [] id_press; + delete[] id_press; } } @@ -255,28 +255,27 @@ void FixRigidNH::init() } } - int icompute; if (tcomputeflag) { - icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature ID for fix rigid nvt/npt/nph does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR,"Temperature ID {} for fix {} does not exist", id_temp, style); } if (pstat_flag) { if (domain->triclinic) - error->all(FLERR,"Fix rigid npt/nph does not yet allow triclinic box"); + error->all(FLERR,"Fix {} does not yet allow triclinic box", style); // ensure no conflict with fix deform - for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { - int *dimflag = (dynamic_cast(modify->fix[i]))->dimflag; + for (auto &ifix : modify->get_fix_by_style("^deform")) { + auto deform = dynamic_cast(ifix); + if (deform) { + int *dimflag = deform->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) - error->all(FLERR,"Cannot use fix rigid npt/nph and fix deform on " - "same component of stress tensor"); + error->all(FLERR,"Cannot use fix {} and fix deform on same component of stress tensor", style); } + } // set frequency @@ -295,10 +294,8 @@ void FixRigidNH::init() // set pressure compute ptr - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix rigid npt/nph does not exist"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); // detect if any rigid fixes exist so rigid bodies move on remap // rfix[] = indices to each fix rigid @@ -1209,13 +1206,11 @@ int FixRigidNH::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tcomputeflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) error->all(FLERR, @@ -1226,10 +1221,9 @@ int FixRigidNH::modify_param(int narg, char **arg) // reset id_temp of pressure to new temperature ID if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix modify does not exist"); - modify->compute[icompute]->reset_extra_compute_fix(id_temp); + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix modify does not exist", id_press); + pressure->reset_extra_compute_fix(id_temp); } return 2; @@ -1241,15 +1235,13 @@ int FixRigidNH::modify_param(int narg, char **arg) modify->delete_compute(id_press); pcomputeflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); - - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Could not find fix_modify pressure ID {}", id_press); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR,"Fix_modify pressure ID {} does not compute pressure", id_press); return 2; } @@ -1301,21 +1293,21 @@ void FixRigidNH::allocate_order() void FixRigidNH::deallocate_chain() { if (tstat_flag) { - delete [] q_t; - delete [] q_r; - delete [] eta_t; - delete [] eta_r; - delete [] eta_dot_t; - delete [] eta_dot_r; - delete [] f_eta_t; - delete [] f_eta_r; + delete[] q_t; + delete[] q_r; + delete[] eta_t; + delete[] eta_r; + delete[] eta_dot_t; + delete[] eta_dot_r; + delete[] f_eta_t; + delete[] f_eta_r; } if (pstat_flag) { - delete [] q_b; - delete [] eta_b; - delete [] eta_dot_b; - delete [] f_eta_b; + delete[] q_b; + delete[] eta_b; + delete[] eta_dot_b; + delete[] f_eta_b; } } @@ -1323,8 +1315,8 @@ void FixRigidNH::deallocate_chain() void FixRigidNH::deallocate_order() { - delete [] w; - delete [] wdti1; - delete [] wdti2; - delete [] wdti4; + delete[] w; + delete[] wdti1; + delete[] wdti2; + delete[] wdti4; } diff --git a/src/RIGID/fix_rigid_nh_small.cpp b/src/RIGID/fix_rigid_nh_small.cpp index b00fca6a2e..6a9589f085 100644 --- a/src/RIGID/fix_rigid_nh_small.cpp +++ b/src/RIGID/fix_rigid_nh_small.cpp @@ -232,26 +232,26 @@ void FixRigidNHSmall::init() int icompute; if (tcomputeflag) { - icompute = modify->find_compute(id_temp); - if (icompute < 0) + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Temperature ID {} for fix {} does not exist", id_temp, style); - temperature = modify->compute[icompute]; } if (pstat_flag) { if (domain->triclinic) - error->all(FLERR,"Fix rigid npt/nph does not yet allow triclinic box"); + error->all(FLERR,"Fix {} does not yet allow triclinic box", style); // ensure no conflict with fix deform - for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { - int *dimflag = (dynamic_cast(modify->fix[i]))->dimflag; + for (auto &ifix : modify->get_fix_by_style("^deform")) { + auto deform = dynamic_cast(ifix); + if (deform) { + int *dimflag = deform->dimflag; if ((p_flag[0] && dimflag[0]) || (p_flag[1] && dimflag[1]) || (p_flag[2] && dimflag[2])) - error->all(FLERR, "Cannot use fix {} and fix deform on the same stress tensor component", - style); + error->all(FLERR,"Cannot use fix {} and fix deform on same component of stress tensor", style); } + } // set frequency @@ -270,10 +270,8 @@ void FixRigidNHSmall::init() // set pressure compute ptr - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); // detect if any rigid fixes exist so rigid bodies move on remap // rfix[] = indices to each fix rigid @@ -833,7 +831,7 @@ void FixRigidNHSmall::nhc_press_integrate() double lkt_press = kt; // update thermostat masses - + int dimension = domain->dimension; double tb_mass = kt / (p_freq_max * p_freq_max); q_b[0] = dimension * dimension * tb_mass; @@ -1311,9 +1309,9 @@ int FixRigidNHSmall::modify_param(int narg, char **arg) // reset id_temp of pressure to new temperature ID if (pstat_flag) { - auto icompute = modify->get_compute_by_id(id_press); - if (!icompute) error->all(FLERR,"Pressure ID {} for fix modify does not exist", id_press); - icompute->reset_extra_compute_fix(id_temp); + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix modify does not exist", id_press); + pressure->reset_extra_compute_fix(id_temp); } return 2; From 0f375715db5773646e1f7acff266d28b73624c6e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 13:27:44 -0500 Subject: [PATCH 347/417] modernize --- src/OPENMP/fix_rigid_nh_omp.cpp | 8 +--- src/RIGID/fix_rigid_nh.cpp | 81 +++++++++++--------------------- src/RIGID/fix_rigid_nh.h | 5 +- src/RIGID/fix_rigid_nh_small.cpp | 81 +++++++++++--------------------- src/RIGID/fix_rigid_nh_small.h | 5 +- 5 files changed, 62 insertions(+), 118 deletions(-) diff --git a/src/OPENMP/fix_rigid_nh_omp.cpp b/src/OPENMP/fix_rigid_nh_omp.cpp index d02b69b3be..19e5d4f240 100644 --- a/src/OPENMP/fix_rigid_nh_omp.cpp +++ b/src/OPENMP/fix_rigid_nh_omp.cpp @@ -585,9 +585,7 @@ void FixRigidNHOMP::remap() domain->x2lamda(x[i],x[i]); } - if (nrigid) - for (int i = 0; i < nrigidfix; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -617,9 +615,7 @@ void FixRigidNHOMP::remap() domain->lamda2x(x[i],x[i]); } - if (nrigid) - for (int i = 0; i< nrigidfix; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_rigid_nh.cpp b/src/RIGID/fix_rigid_nh.cpp index ec5e7845ad..f628b639ab 100644 --- a/src/RIGID/fix_rigid_nh.cpp +++ b/src/RIGID/fix_rigid_nh.cpp @@ -45,12 +45,11 @@ using namespace RigidConst; /* ---------------------------------------------------------------------- */ FixRigidNH::FixRigidNH(LAMMPS *lmp, int narg, char **arg) : - FixRigid(lmp, narg, arg), conjqm(nullptr), w(nullptr), - wdti1(nullptr), wdti2(nullptr), wdti4(nullptr), q_t(nullptr), q_r(nullptr), - eta_t(nullptr), eta_r(nullptr), eta_dot_t(nullptr), eta_dot_r(nullptr), - f_eta_t(nullptr), f_eta_r(nullptr), q_b(nullptr), eta_b(nullptr), - eta_dot_b(nullptr), f_eta_b(nullptr), rfix(nullptr), id_temp(nullptr), - id_press(nullptr), temperature(nullptr), pressure(nullptr) + FixRigid(lmp, narg, arg), conjqm(nullptr), w(nullptr), wdti1(nullptr), wdti2(nullptr), + wdti4(nullptr), q_t(nullptr), q_r(nullptr), eta_t(nullptr), eta_r(nullptr), eta_dot_t(nullptr), + eta_dot_r(nullptr), f_eta_t(nullptr), f_eta_r(nullptr), q_b(nullptr), eta_b(nullptr), + eta_dot_b(nullptr), f_eta_b(nullptr), id_temp(nullptr), id_press(nullptr), + temperature(nullptr), pressure(nullptr) { if (tstat_flag || pstat_flag) ecouple_flag = 1; @@ -59,57 +58,54 @@ FixRigidNH::FixRigidNH(LAMMPS *lmp, int narg, char **arg) : if ((p_flag[0] == 1 && p_period[0] <= 0.0) || (p_flag[1] == 1 && p_period[1] <= 0.0) || (p_flag[2] == 1 && p_period[2] <= 0.0)) - error->all(FLERR,"Fix rigid npt/nph period must be > 0.0"); + error->all(FLERR,"Fix {} period must be > 0.0", style); if (domain->dimension == 2 && p_flag[2]) - error->all(FLERR,"Invalid fix rigid npt/nph command for a 2d simulation"); + error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); if (domain->dimension == 2 && (pcouple == YZ || pcouple == XZ)) - error->all(FLERR,"Invalid fix rigid npt/nph command for a 2d simulation"); + error->all(FLERR,"Invalid fix {} command for a 2d simulation", style); if (pcouple == XYZ && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XYZ && domain->dimension == 3 && p_flag[2] == 0) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XY && (p_flag[0] == 0 || p_flag[1] == 0)) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == YZ && (p_flag[1] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XZ && (p_flag[0] == 0 || p_flag[2] == 0)) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); // require periodicity in tensile dimension if (p_flag[0] && domain->xperiodic == 0) - error->all(FLERR, - "Cannot use fix rigid npt/nph on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); if (p_flag[1] && domain->yperiodic == 0) - error->all(FLERR, - "Cannot use fix rigid npt/nph on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); if (p_flag[2] && domain->zperiodic == 0) - error->all(FLERR, - "Cannot use fix rigid npt/nph on a non-periodic dimension"); + error->all(FLERR, "Cannot use fix {} on a non-periodic dimension", style); if (pcouple == XYZ && domain->dimension == 3 && (p_start[0] != p_start[1] || p_start[0] != p_start[2] || p_stop[0] != p_stop[1] || p_stop[0] != p_stop[2] || p_period[0] != p_period[1] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XYZ && domain->dimension == 2 && (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XY && (p_start[0] != p_start[1] || p_stop[0] != p_stop[1] || p_period[0] != p_period[1])) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == YZ && (p_start[1] != p_start[2] || p_stop[1] != p_stop[2] || p_period[1] != p_period[2])) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (pcouple == XZ && (p_start[0] != p_start[2] || p_stop[0] != p_stop[2] || p_period[0] != p_period[2])) - error->all(FLERR,"Invalid fix rigid npt/nph command pressure settings"); + error->all(FLERR,"Invalid fix {} command pressure settings", style); if (p_flag[0]) box_change |= BOX_CHANGE_X; if (p_flag[1]) box_change |= BOX_CHANGE_Y; @@ -119,7 +115,7 @@ FixRigidNH::FixRigidNH(LAMMPS *lmp, int narg, char **arg) : (p_flag[0] && p_period[0] <= 0.0) || (p_flag[1] && p_period[1] <= 0.0) || (p_flag[2] && p_period[2] <= 0.0)) - error->all(FLERR,"Fix rigid nvt/npt/nph damping parameters must be > 0.0"); + error->all(FLERR,"Fix {} damping parameters must be > 0.0", style); // memory allocation and initialization @@ -147,11 +143,6 @@ FixRigidNH::FixRigidNH(LAMMPS *lmp, int narg, char **arg) : eta_b[i] = eta_dot_b[i] = 0.0; } - // rigid body pointers - - nrigidfix = 0; - rfix = nullptr; - vol0 = 0.0; t0 = 1.0; @@ -172,8 +163,6 @@ FixRigidNH::~FixRigidNH() deallocate_order(); } - delete[] rfix; - if (tcomputeflag) modify->delete_compute(id_temp); delete[] id_temp; @@ -205,7 +194,7 @@ void FixRigidNH::init() if (allremap == 0) { int idilate = group->find(id_dilate); if (idilate == -1) - error->all(FLERR,"Fix rigid npt/nph dilate group ID does not exist"); + error->all(FLERR,"Fix {} dilate group ID does not exist", style); dilate_group_bit = group->bitmask[idilate]; } @@ -298,21 +287,11 @@ void FixRigidNH::init() if (!pressure) error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); // detect if any rigid fixes exist so rigid bodies move on remap - // rfix[] = indices to each fix rigid // this will include self - delete[] rfix; - nrigidfix = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigidfix++; - if (nrigidfix) { - rfix = new int[nrigidfix]; - nrigidfix = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigidfix++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } } @@ -996,9 +975,7 @@ void FixRigidNH::remap() domain->x2lamda(x[i],x[i]); } - if (nrigidfix) - for (i = 0; i < nrigidfix; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -1025,9 +1002,7 @@ void FixRigidNH::remap() domain->lamda2x(x[i],x[i]); } - if (nrigidfix) - for (i = 0; i< nrigidfix; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_rigid_nh.h b/src/RIGID/fix_rigid_nh.h index 93a299f41f..7d357cfdf9 100644 --- a/src/RIGID/fix_rigid_nh.h +++ b/src/RIGID/fix_rigid_nh.h @@ -50,9 +50,8 @@ class FixRigidNH : public FixRigid { double *f_eta_b; // thermo forces double akin_t, akin_r; // translational/rotational kinetic energies - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigidfix; // number of rigid fixes - int *rfix; // indices of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + std::vector rfix; // indices of rigid fixes double vol0; // reference volume double t0; // reference temperature diff --git a/src/RIGID/fix_rigid_nh_small.cpp b/src/RIGID/fix_rigid_nh_small.cpp index 6a9589f085..952dc29032 100644 --- a/src/RIGID/fix_rigid_nh_small.cpp +++ b/src/RIGID/fix_rigid_nh_small.cpp @@ -46,12 +46,11 @@ using namespace RigidConst; /* ---------------------------------------------------------------------- */ FixRigidNHSmall::FixRigidNHSmall(LAMMPS *lmp, int narg, char **arg) : - FixRigidSmall(lmp, narg, arg), w(nullptr), wdti1(nullptr), - wdti2(nullptr), wdti4(nullptr), q_t(nullptr), q_r(nullptr), eta_t(nullptr), - eta_r(nullptr), eta_dot_t(nullptr), eta_dot_r(nullptr), f_eta_t(nullptr), - f_eta_r(nullptr), q_b(nullptr), eta_b(nullptr), eta_dot_b(nullptr), - f_eta_b(nullptr), rfix(nullptr), id_temp(nullptr), id_press(nullptr), - temperature(nullptr), pressure(nullptr) + FixRigidSmall(lmp, narg, arg), w(nullptr), wdti1(nullptr), wdti2(nullptr), wdti4(nullptr), + q_t(nullptr), q_r(nullptr), eta_t(nullptr), eta_r(nullptr), eta_dot_t(nullptr), + eta_dot_r(nullptr), f_eta_t(nullptr), f_eta_r(nullptr), q_b(nullptr), eta_b(nullptr), + eta_dot_b(nullptr), f_eta_b(nullptr), id_temp(nullptr), id_press(nullptr), + temperature(nullptr), pressure(nullptr) { if (tstat_flag || pstat_flag) ecouple_flag = 1; @@ -139,19 +138,11 @@ FixRigidNHSmall::FixRigidNHSmall(LAMMPS *lmp, int narg, char **arg) : eta_b[i] = eta_dot_b[i] = 0.0; } - // rigid body pointers - - nrigidfix = 0; - rfix = nullptr; - vol0 = 0.0; t0 = 1.0; tcomputeflag = 0; pcomputeflag = 0; - - id_temp = nullptr; - id_press = nullptr; } /* ---------------------------------------------------------------------- */ @@ -163,16 +154,14 @@ FixRigidNHSmall::~FixRigidNHSmall() deallocate_order(); } - delete[] rfix; - if (tcomputeflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; // delete pressure if fix created it if (pstat_flag) { if (pcomputeflag) modify->delete_compute(id_press); - delete [] id_press; + delete[] id_press; } } @@ -274,21 +263,11 @@ void FixRigidNHSmall::init() if (!pressure) error->all(FLERR,"Pressure ID {} for fix {} does not exist", id_press, style); // detect if any rigid fixes exist so rigid bodies move on remap - // rfix[] = indices to each fix rigid // this will include self - delete[] rfix; - nrigidfix = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigidfix++; - if (nrigidfix) { - rfix = new int[nrigidfix]; - nrigidfix = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigidfix++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } } @@ -1058,9 +1037,7 @@ void FixRigidNHSmall::remap() domain->x2lamda(x[i],x[i]); } - if (nrigidfix) - for (i = 0; i < nrigidfix; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -1087,9 +1064,7 @@ void FixRigidNHSmall::remap() domain->lamda2x(x[i],x[i]); } - if (nrigidfix) - for (i = 0; i< nrigidfix; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- @@ -1382,21 +1357,21 @@ void FixRigidNHSmall::allocate_order() void FixRigidNHSmall::deallocate_chain() { if (tstat_flag) { - delete [] q_t; - delete [] q_r; - delete [] eta_t; - delete [] eta_r; - delete [] eta_dot_t; - delete [] eta_dot_r; - delete [] f_eta_t; - delete [] f_eta_r; + delete[] q_t; + delete[] q_r; + delete[] eta_t; + delete[] eta_r; + delete[] eta_dot_t; + delete[] eta_dot_r; + delete[] f_eta_t; + delete[] f_eta_r; } if (pstat_flag) { - delete [] q_b; - delete [] eta_b; - delete [] eta_dot_b; - delete [] f_eta_b; + delete[] q_b; + delete[] eta_b; + delete[] eta_dot_b; + delete[] f_eta_b; } } @@ -1404,8 +1379,8 @@ void FixRigidNHSmall::deallocate_chain() void FixRigidNHSmall::deallocate_order() { - delete [] w; - delete [] wdti1; - delete [] wdti2; - delete [] wdti4; + delete[] w; + delete[] wdti1; + delete[] wdti2; + delete[] wdti4; } diff --git a/src/RIGID/fix_rigid_nh_small.h b/src/RIGID/fix_rigid_nh_small.h index cb0d3516f6..735a15205c 100644 --- a/src/RIGID/fix_rigid_nh_small.h +++ b/src/RIGID/fix_rigid_nh_small.h @@ -49,9 +49,8 @@ class FixRigidNHSmall : public FixRigidSmall { double *f_eta_b; // thermo forces double akin_t, akin_r; // translational/rotational kinetic energies - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigidfix; // number of rigid fixes - int *rfix; // indices of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + std::vector rfix; // indices of rigid fixes double vol0; // reference volume double t0; // reference temperature From be02ef3a536cd3b9b9223a844ad92c874de83955 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 08:58:27 -0500 Subject: [PATCH 348/417] fix broken link --- doc/src/fix_deposit.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index d7c78c5d15..4c256f524f 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -220,6 +220,8 @@ rotated configuration of the molecule. existing particle. LAMMPS will issue a warning if R is smaller than this value, based on the radii of existing and inserted particles. +.. versionadded:: TBD + The *var* and *set* keywords can be used together to provide a criterion for accepting or rejecting the addition of an individual atom, based on its coordinates. The *name* specified for the *var* keyword is the name of an @@ -236,7 +238,7 @@ created atom, one for *y*, and one for *z*. When an atom is created, its is defined. The *var* variable is then evaluated. If the returned value is 0.0, the atom is not created. If it is non-zero, the atom is created. For an example of how to use these keywords, see the -:doc:`create_atoms `command. +:doc:`create_atoms ` command. The *rate* option moves the insertion volume in the z direction (3d) or y direction (2d). This enables particles to be inserted from a From e6524b59fab72b0521eeeebca88076553313d0ac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 08:58:58 -0500 Subject: [PATCH 349/417] only check significant chunk of the words --- src/info.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/info.cpp b/src/info.cpp index 948cbbfe15..491cfc728d 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -167,16 +167,16 @@ void Info::command(int narg, char **arg) if ((out != screen) && (out != logfile)) fclose(out); out = fopen(arg[idx+2],"w"); idx += 3; - } else if (strncmp(arg[idx],"communication",5) == 0) { + } else if (strncmp(arg[idx],"communication",4) == 0) { flags |= COMM; ++idx; - } else if (strncmp(arg[idx],"computes",5) == 0) { + } else if (strncmp(arg[idx],"computes",4) == 0) { flags |= COMPUTES; ++idx; - } else if (strncmp(arg[idx],"dumps",5) == 0) { + } else if (strncmp(arg[idx],"dumps",3) == 0) { flags |= DUMPS; ++idx; - } else if (strncmp(arg[idx],"fixes",5) == 0) { + } else if (strncmp(arg[idx],"fixes",3) == 0) { flags |= FIXES; ++idx; } else if (strncmp(arg[idx],"groups",3) == 0) { From be6fcaa77fe18a81cb8b00a961d68fd614596018 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Nov 2023 12:07:05 -0500 Subject: [PATCH 350/417] modernize --- src/BOCS/fix_bocs.cpp | 94 +++---- src/BOCS/fix_bocs.h | 3 +- src/DRUDE/fix_tgnh_drude.cpp | 129 ++++------ src/DRUDE/fix_tgnh_drude.h | 3 +- src/EXTRA-FIX/fix_npt_cauchy.cpp | 76 ++---- src/EXTRA-FIX/fix_npt_cauchy.h | 3 +- src/QTB/fix_qbmsst.cpp | 38 +-- src/QTB/fix_qbmsst.h | 3 +- src/SHOCK/fix_msst.cpp | 418 ++++++++++++++----------------- src/SHOCK/fix_msst.h | 5 +- src/fix_press_berendsen.cpp | 27 +- src/fix_press_berendsen.h | 5 +- src/fix_press_langevin.cpp | 26 +- src/fix_press_langevin.h | 5 +- 14 files changed, 328 insertions(+), 507 deletions(-) diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index d35facdc5a..4918f8d879 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -69,12 +69,9 @@ const int NUM_INPUT_DATA_COLUMNS = 2; // columns in the pressure correction ---------------------------------------------------------------------- */ FixBocs::FixBocs(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - rfix(nullptr), id_dilate(nullptr), irregular(nullptr), - id_temp(nullptr), id_press(nullptr), - eta(nullptr), eta_dot(nullptr), eta_dotdot(nullptr), - eta_mass(nullptr), etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), - etap_mass(nullptr) + Fix(lmp, narg, arg), id_dilate(nullptr), irregular(nullptr), id_temp(nullptr), + id_press(nullptr), eta(nullptr), eta_dot(nullptr), eta_dotdot(nullptr), eta_mass(nullptr), + etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), etap_mass(nullptr) { if (lmp->citeme) lmp->citeme->add(cite_user_bocs_package); @@ -379,9 +376,6 @@ FixBocs::FixBocs(LAMMPS *lmp, int narg, char **arg) : if (deviatoric_flag) size_vector += 1; } - nrigid = 0; - rfix = nullptr; - if (pre_exchange_flag) irregular = new Irregular(lmp); else irregular = nullptr; @@ -424,31 +418,29 @@ FixBocs::~FixBocs() { if (copymode) return; - delete [] id_dilate; - delete [] rfix; - + delete[] id_dilate; delete irregular; // delete temperature and pressure if fix created them if (tcomputeflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; if (tstat_flag) { - delete [] eta; - delete [] eta_dot; - delete [] eta_dotdot; - delete [] eta_mass; + delete[] eta; + delete[] eta_dot; + delete[] eta_dotdot; + delete[] eta_mass; } if (pstat_flag) { if (pcomputeflag) modify->delete_compute(id_press); - delete [] id_press; + delete[] id_press; if (mpchain) { - delete [] etap; - delete [] etap_dot; - delete [] etap_dotdot; - delete [] etap_mass; + delete[] etap; + delete[] etap_dot; + delete[] etap_dotdot; + delete[] etap_mass; } } if (p_match_coeffs) free(p_match_coeffs); @@ -596,20 +588,10 @@ void FixBocs::init() } // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete [] rfix; - nrigid = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; - if (nrigid) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } // NJD MRD 2 functions @@ -1204,9 +1186,7 @@ void FixBocs::remap() domain->x2lamda(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -1351,9 +1331,7 @@ void FixBocs::remap() domain->lamda2x(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- @@ -1512,7 +1490,7 @@ int FixBocs::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tcomputeflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); int icompute = modify->find_compute(arg[1]); @@ -1544,29 +1522,23 @@ int FixBocs::modify_param(int narg, char **arg) modify->delete_compute(id_press); pcomputeflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Could not find fix_modify pressure ID {}", id_press); + if (!pressure->pressflag) + error->all(FLERR, "Fix_modify pressure ID {} does not compute pressure", id_press); - if (p_match_flag) // NJD MRD - { - if (p_basis_type == BASIS_ANALYTIC) - { - (dynamic_cast(pressure))->send_cg_info(p_basis_type, N_p_match, - p_match_coeffs, N_mol, vavg); + if (p_match_flag) { + auto bocspress = dynamic_cast(pressure); + if (bocspress) { + if (p_basis_type == BASIS_ANALYTIC) { + bocspress->send_cg_info(p_basis_type, N_p_match, p_match_coeffs, N_mol, vavg); + } else if (p_basis_type == BASIS_LINEAR_SPLINE || p_basis_type == BASIS_CUBIC_SPLINE) { + bocspress->send_cg_info(p_basis_type, splines, spline_length); + } } - else if (p_basis_type == BASIS_LINEAR_SPLINE || p_basis_type == BASIS_CUBIC_SPLINE ) - { - (dynamic_cast(pressure))->send_cg_info(p_basis_type, splines, spline_length ); - } - } - - if (pressure->pressflag == 0) - { - error->all(FLERR, "Fix_modify pressure ID does not compute pressure"); } return 2; } diff --git a/src/BOCS/fix_bocs.h b/src/BOCS/fix_bocs.h index fd47fda4d7..71fbc273d8 100644 --- a/src/BOCS/fix_bocs.h +++ b/src/BOCS/fix_bocs.h @@ -75,9 +75,8 @@ class FixBocs : public Fix { double drag, tdrag_factor; // drag factor on particle thermostat double pdrag_factor; // drag factor on barostat int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes int dilate_group_bit; // mask for dilation group - int *rfix; // indices of rigid fixes + std::vector rfix; // list of rigid fixes char *id_dilate; // group name to dilate class Irregular *irregular; // for migrating atoms after box flips diff --git a/src/DRUDE/fix_tgnh_drude.cpp b/src/DRUDE/fix_tgnh_drude.cpp index 273f163303..987408fe63 100644 --- a/src/DRUDE/fix_tgnh_drude.cpp +++ b/src/DRUDE/fix_tgnh_drude.cpp @@ -52,14 +52,13 @@ enum{ISO,ANISO,TRICLINIC}; ---------------------------------------------------------------------- */ FixTGNHDrude::FixTGNHDrude(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - rfix(nullptr), irregular(nullptr), id_temp(nullptr), id_press(nullptr), - etamol(nullptr), etamol_dot(nullptr), etamol_dotdot(nullptr), etamol_mass(nullptr), - etaint(nullptr), etaint_dot(nullptr), etaint_dotdot(nullptr), etaint_mass(nullptr), - etadrude(nullptr), etadrude_dot(nullptr), etadrude_dotdot(nullptr), etadrude_mass(nullptr), - etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), etap_mass(nullptr) + Fix(lmp, narg, arg), irregular(nullptr), id_temp(nullptr), id_press(nullptr), etamol(nullptr), + etamol_dot(nullptr), etamol_dotdot(nullptr), etamol_mass(nullptr), etaint(nullptr), + etaint_dot(nullptr), etaint_dotdot(nullptr), etaint_mass(nullptr), etadrude(nullptr), + etadrude_dot(nullptr), etadrude_dotdot(nullptr), etadrude_mass(nullptr), etap(nullptr), + etap_dot(nullptr), etap_dotdot(nullptr), etap_mass(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal fix nvt/npt/nph command"); + if (narg < 4) error->all(FLERR, "Illegal fix {} command", style); restart_global = 1; dynamic_group_allow = 0; @@ -507,9 +506,6 @@ FixTGNHDrude::FixTGNHDrude(LAMMPS *lmp, int narg, char **arg) : } } - nrigid = 0; - rfix = nullptr; - if (pre_exchange_flag) irregular = new Irregular(lmp); else irregular = nullptr; @@ -519,15 +515,15 @@ FixTGNHDrude::FixTGNHDrude(LAMMPS *lmp, int narg, char **arg) : vol0 = t0 = 0.0; // find fix drude - int ifix; - for (ifix = 0; ifix < modify->nfix; ifix++) - if (strcmp(modify->fix[ifix]->style,"drude") == 0) break; - if (ifix == modify->nfix) error->all(FLERR, "fix tgnh/drude requires fix drude"); - fix_drude = dynamic_cast(modify->fix[ifix]); + + auto fdrude = modify->get_fix_by_style("^drude"); + if (fdrude.size() < 1) error->all(FLERR, "Fix {} requires fix drude", style); + fix_drude = dynamic_cast(fdrude[0]); + if (!fix_drude) error->all(FLERR, "Fix {} requires fix drude", style); // make sure ghost atoms have velocity if (!comm->ghost_velocity) - error->all(FLERR,"fix tgnh/drude requires ghost velocities. Use comm_modify vel yes"); + error->all(FLERR,"Fix {} requires ghost velocities. Use comm_modify vel yes", style); } /* ---------------------------------------------------------------------- */ @@ -536,38 +532,36 @@ FixTGNHDrude::~FixTGNHDrude() { if (copymode) return; - delete [] rfix; - delete irregular; // delete temperature and pressure if fix created them if (tcomputeflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; if (tstat_flag) { - delete [] etaint; - delete [] etaint_dot; - delete [] etaint_dotdot; - delete [] etaint_mass; - delete [] etamol; - delete [] etamol_dot; - delete [] etamol_dotdot; - delete [] etamol_mass; - delete [] etadrude; - delete [] etadrude_dot; - delete [] etadrude_dotdot; - delete [] etadrude_mass; + delete[] etaint; + delete[] etaint_dot; + delete[] etaint_dotdot; + delete[] etaint_mass; + delete[] etamol; + delete[] etamol_dot; + delete[] etamol_dotdot; + delete[] etamol_mass; + delete[] etadrude; + delete[] etadrude_dot; + delete[] etadrude_dotdot; + delete[] etadrude_mass; } if (pstat_flag) { if (pcomputeflag) modify->delete_compute(id_press); - delete [] id_press; + delete[] id_press; if (mpchain) { - delete [] etap; - delete [] etap_dot; - delete [] etap_dotdot; - delete [] etap_mass; + delete[] etap; + delete[] etap_dot; + delete[] etap_dotdot; + delete[] etap_mass; } } } @@ -605,19 +599,15 @@ void FixTGNHDrude::init() // set temperature and pressure ptrs - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature ID for fix nvt/npt does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Temperature ID for fix {} does not exist", style); if (temperature->tempbias) which = BIAS; else which = NOBIAS; if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix npt/nph does not exist"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID for fix {} does not exist", id_press); } // set timesteps and frequencies @@ -670,20 +660,10 @@ void FixTGNHDrude::init() } // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete [] rfix; - nrigid = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; - if (nrigid) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } /* ---------------------------------------------------------------------- @@ -1111,9 +1091,7 @@ void FixTGNHDrude::remap() domain->x2lamda(nlocal); - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -1253,9 +1231,7 @@ void FixTGNHDrude::remap() domain->lamda2x(nlocal); - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- @@ -1426,27 +1402,23 @@ int FixTGNHDrude::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tcomputeflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR, - "Fix_modify temperature ID does not compute temperature"); + error->all(FLERR, "Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != 0 && comm->me == 0) error->warning(FLERR,"Temperature for fix modify is not for group all"); // reset id_temp of pressure to new temperature ID if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix modify does not exist"); - modify->compute[icompute]->reset_extra_compute_fix(id_temp); + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix modify does not exist", id_press); + pressure->reset_extra_compute_fix(id_temp); } return 2; @@ -1458,15 +1430,14 @@ int FixTGNHDrude::modify_param(int narg, char **arg) modify->delete_compute(id_press); pcomputeflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Could not find fix_modify pressure ID {}", id_press); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR,"Fix_modify pressure ID {} does not compute pressure", id_press); return 2; } diff --git a/src/DRUDE/fix_tgnh_drude.h b/src/DRUDE/fix_tgnh_drude.h index adfa69671a..b2724809b4 100644 --- a/src/DRUDE/fix_tgnh_drude.h +++ b/src/DRUDE/fix_tgnh_drude.h @@ -63,8 +63,7 @@ class FixTGNHDrude : public Fix { double omega_mass[6]; double p_current[6]; int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + std::vector rfix; // indices of rigid fixes class Irregular *irregular; // for migrating atoms after box flips int nlevels_respa; diff --git a/src/EXTRA-FIX/fix_npt_cauchy.cpp b/src/EXTRA-FIX/fix_npt_cauchy.cpp index feb5a95c6f..f3dfd1af36 100644 --- a/src/EXTRA-FIX/fix_npt_cauchy.cpp +++ b/src/EXTRA-FIX/fix_npt_cauchy.cpp @@ -54,14 +54,12 @@ enum{ISO,ANISO,TRICLINIC}; ---------------------------------------------------------------------- */ FixNPTCauchy::FixNPTCauchy(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - rfix(nullptr), id_dilate(nullptr), irregular(nullptr), - id_temp(nullptr), id_press(nullptr), - eta(nullptr), eta_dot(nullptr), eta_dotdot(nullptr), - eta_mass(nullptr), etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), - etap_mass(nullptr), id_store(nullptr), init_store(nullptr) + Fix(lmp, narg, arg), id_dilate(nullptr), irregular(nullptr), id_temp(nullptr), + id_press(nullptr), eta(nullptr), eta_dot(nullptr), eta_dotdot(nullptr), eta_mass(nullptr), + etap(nullptr), etap_dot(nullptr), etap_dotdot(nullptr), etap_mass(nullptr), id_store(nullptr), + init_store(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal fix npt/cauchy command"); + if (narg < 4) error->all(FLERR, "Illegal fix npt/cauchy command"); dynamic_group_allow = 1; ecouple_flag = 1; @@ -571,9 +569,6 @@ FixNPTCauchy::FixNPTCauchy(LAMMPS *lmp, int narg, char **arg) : if (deviatoric_flag) size_vector += 1; } - nrigid = 0; - rfix = nullptr; - if (pre_exchange_flag) irregular = new Irregular(lmp); else irregular = nullptr; @@ -619,8 +614,6 @@ FixNPTCauchy::~FixNPTCauchy() if (copymode) return; delete[] id_dilate; - delete[] rfix; - delete[] id_store; delete irregular; @@ -690,19 +683,16 @@ void FixNPTCauchy::init() // set temperature and pressure ptrs - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature ID for fix npt/cauchy does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR,"Temperature ID {} for fix npt/cauchy does not exist", id_temp); if (temperature->tempbias) which = BIAS; else which = NOBIAS; if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix npt/cauchy does not exist"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix npt/cauchy does not exist", id_press); } // set timesteps and frequencies @@ -759,20 +749,10 @@ void FixNPTCauchy::init() } // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete[] rfix; - nrigid = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) nrigid++; - if (nrigid) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->rigid_flag) rfix[nrigid++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } /* ---------------------------------------------------------------------- @@ -1121,9 +1101,7 @@ void FixNPTCauchy::remap() domain->x2lamda(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -1268,9 +1246,7 @@ void FixNPTCauchy::remap() domain->lamda2x(x[i],x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- @@ -1432,23 +1408,20 @@ int FixNPTCauchy::modify_param(int narg, char **arg) delete[] id_temp; id_temp = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR,"Fix_modify temperature ID does not compute temperature"); + error->all(FLERR,"Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != 0 && comm->me == 0) error->warning(FLERR,"Temperature for fix modify is not for group all"); // reset id_temp of pressure to new temperature ID if (pstat_flag) { - icompute = modify->find_compute(id_press); - if (icompute < 0) - error->all(FLERR,"Pressure ID for fix modify does not exist"); - modify->compute[icompute]->reset_extra_compute_fix(id_temp); + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for fix modify does not exist", id_press); + pressure->reset_extra_compute_fix(id_temp); } return 2; @@ -1463,12 +1436,11 @@ int FixNPTCauchy::modify_param(int narg, char **arg) delete[] id_press; id_press = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Could not find fix_modify pressure ID {}", id_press); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR,"Fix_modify pressure ID {} does not compute pressure", id_press); return 2; } diff --git a/src/EXTRA-FIX/fix_npt_cauchy.h b/src/EXTRA-FIX/fix_npt_cauchy.h index e7e6630208..43a944acb4 100644 --- a/src/EXTRA-FIX/fix_npt_cauchy.h +++ b/src/EXTRA-FIX/fix_npt_cauchy.h @@ -73,9 +73,8 @@ class FixNPTCauchy : public Fix { double drag, tdrag_factor; // drag factor on particle thermostat double pdrag_factor; // drag factor on barostat int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes int dilate_group_bit; // mask for dilation group - int *rfix; // indices of rigid fixes + std::vector rfix; // indices of rigid fixes char *id_dilate; // group name to dilate class Irregular *irregular; // for migrating atoms after box flips diff --git a/src/QTB/fix_qbmsst.cpp b/src/QTB/fix_qbmsst.cpp index b5fb5ca77c..2450561363 100644 --- a/src/QTB/fix_qbmsst.cpp +++ b/src/QTB/fix_qbmsst.cpp @@ -228,7 +228,6 @@ FixQBMSST::FixQBMSST(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) pressure = nullptr; pe = nullptr; old_velocity = nullptr; - rfix = nullptr; gfactor = nullptr; random = nullptr; omega_H = nullptr; @@ -263,17 +262,16 @@ FixQBMSST::FixQBMSST(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) FixQBMSST::~FixQBMSST() { - delete [] rfix; - delete [] gfactor; + delete[] gfactor; delete random; // delete temperature and pressure if fix created them if (tflag) modify->delete_compute(id_temp); if (pflag) modify->delete_compute(id_press); if (peflag) modify->delete_compute(id_pe); - delete [] id_temp; - delete [] id_press; - delete [] id_pe; + delete[] id_temp; + delete[] id_press; + delete[] id_pe; memory->destroy(old_velocity); memory->destroy(fran); @@ -385,18 +383,10 @@ void FixQBMSST::init() else kspace_flag = 0; // detect if any fix rigid exist so rigid bodies move when box is dilated - // rfix[] = indices to each fix rigid - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (utils::strmatch(modify->fix[i]->style,"^rigid") || - (strcmp(modify->fix[i]->style,"poems") == 0)) nrigid++; - if (nrigid > 0) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (utils::strmatch(modify->fix[i]->style,"^rigid") || - (strcmp(modify->fix[i]->style,"poems") == 0)) rfix[nrigid++] = i; - } + + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } /* ---------------------------------------------------------------------- @@ -787,9 +777,7 @@ void FixQBMSST::remap(int flag) domain->x2lamda(n); - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -810,9 +798,7 @@ void FixQBMSST::remap(int flag) domain->lamda2x(n); - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); for (i = 0; i < n; i++) { v[i][direction] = v[i][direction] * @@ -868,7 +854,7 @@ int FixQBMSST::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); int icompute = modify->find_compute(id_temp); @@ -888,7 +874,7 @@ int FixQBMSST::modify_param(int narg, char **arg) modify->delete_compute(id_press); pflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); int icompute = modify->find_compute(id_press); diff --git a/src/QTB/fix_qbmsst.h b/src/QTB/fix_qbmsst.h index ecfa5abf8e..cccb4e6a17 100644 --- a/src/QTB/fix_qbmsst.h +++ b/src/QTB/fix_qbmsst.h @@ -78,8 +78,7 @@ class FixQBMSST : public Fix { double omega[3]; // Time derivative of the volume. double total_mass; // Mass of the computational cell int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + std::vector rfix; // indices of rigid fixes double p_current[3]; // pressure double velocity_sum; // Sum of the velocities squared. double lagrangian_position; // Lagrangian location of computational cell diff --git a/src/SHOCK/fix_msst.cpp b/src/SHOCK/fix_msst.cpp index a4c9db3fd7..55842250ec 100644 --- a/src/SHOCK/fix_msst.cpp +++ b/src/SHOCK/fix_msst.cpp @@ -41,11 +41,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixMSST::FixMSST(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), old_velocity(nullptr), rfix(nullptr), - id_temp(nullptr), id_press(nullptr), id_pe(nullptr), temperature(nullptr), - pressure(nullptr), pe(nullptr) + Fix(lmp, narg, arg), old_velocity(nullptr), id_temp(nullptr), id_press(nullptr), id_pe(nullptr), + temperature(nullptr), pressure(nullptr), pe(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal fix msst command"); + if (narg < 4) error->all(FLERR, "Illegal fix msst command"); restart_global = 1; time_integrate = 1; @@ -80,95 +79,103 @@ FixMSST::FixMSST(LAMMPS *lmp, int narg, char **arg) : dftb = 0; beta = 0.0; - if (strcmp(arg[3],"x") == 0) { + if (strcmp(arg[3], "x") == 0) { direction = 0; box_change |= BOX_CHANGE_X; - } else if (strcmp(arg[3],"y") == 0) { + } else if (strcmp(arg[3], "y") == 0) { direction = 1; box_change |= BOX_CHANGE_Y; - } else if (strcmp(arg[3],"z") == 0) { + } else if (strcmp(arg[3], "z") == 0) { direction = 2; box_change |= BOX_CHANGE_Z; - } else error->all(FLERR,"Illegal fix msst command"); + } else + error->all(FLERR, "Illegal fix msst command"); - velocity = utils::numeric(FLERR,arg[4],false,lmp); - if (velocity < 0) error->all(FLERR,"Illegal fix msst command"); + velocity = utils::numeric(FLERR, arg[4], false, lmp); + if (velocity < 0) error->all(FLERR, "Illegal fix msst command"); // optional args int iarg = 5; while (iarg < narg) { - if (strcmp(arg[iarg],"q") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - qmass = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (strcmp(arg[iarg], "q") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + qmass = utils::numeric(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"mu") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - mu = utils::numeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "mu") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + mu = utils::numeric(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"p0") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - p0 = utils::numeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "p0") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + p0 = utils::numeric(FLERR, arg[iarg + 1], false, lmp); p0_set = 1; iarg += 2; - } else if (strcmp(arg[iarg],"v0") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - v0 = utils::numeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "v0") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + v0 = utils::numeric(FLERR, arg[iarg + 1], false, lmp); v0_set = 1; iarg += 2; - } else if (strcmp(arg[iarg],"e0") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - e0 = utils::numeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "e0") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + e0 = utils::numeric(FLERR, arg[iarg + 1], false, lmp); e0_set = 1; iarg += 2; - } else if (strcmp(arg[iarg],"tscale") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - tscale = utils::numeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "tscale") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + tscale = utils::numeric(FLERR, arg[iarg + 1], false, lmp); if (tscale < 0.0 || tscale > 1.0) - error->all(FLERR,"Fix msst tscale must satisfy 0 <= tscale < 1"); + error->all(FLERR, "Fix msst tscale must satisfy 0 <= tscale < 1"); iarg += 2; - } else if (strcmp(arg[iarg],"dftb") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - dftb = utils::logical(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "dftb") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + dftb = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"beta") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix msst command"); - beta = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (beta < 0.0 || beta > 1.0) - error->all(FLERR,"Illegal fix msst command"); + } else if (strcmp(arg[iarg], "beta") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix msst command"); + beta = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + if (beta < 0.0 || beta > 1.0) error->all(FLERR, "Illegal fix msst command"); iarg += 2; - } else error->all(FLERR,"Illegal fix msst command"); + } else + error->all(FLERR, "Illegal fix msst command"); } // output MSST info if (comm->me == 0) { std::string mesg = "MSST parameters:\n"; - if (direction == 0) mesg += " Shock in x direction\n"; - else if (direction == 1) mesg += " Shock in y direction\n"; - else if (direction == 2) mesg += " Shock in z direction\n"; + if (direction == 0) + mesg += " Shock in x direction\n"; + else if (direction == 1) + mesg += " Shock in y direction\n"; + else if (direction == 2) + mesg += " Shock in z direction\n"; mesg += fmt::format(" Cell mass-like parameter qmass " - "(units of mass^2/length^4) = {:.8g}\n", qmass); + "(units of mass^2/length^4) = {:.8g}\n", + qmass); mesg += fmt::format(" Shock velocity = {:.8g}\n", velocity); mesg += fmt::format(" Artificial viscosity (units of mass/length/time) = {:.8g}\n", mu); if (p0_set) mesg += fmt::format(" Initial pressure specified to be {:.8g}\n", p0); - else mesg += " Initial pressure calculated on first step\n"; + else + mesg += " Initial pressure calculated on first step\n"; if (v0_set) mesg += fmt::format(" Initial volume specified to be {:.8g}\n", v0); - else mesg += " Initial volume calculated on first step\n"; + else + mesg += " Initial volume calculated on first step\n"; if (e0_set) mesg += fmt::format(" Initial energy specified to be {:.8g}\n", e0); - else mesg += " Initial energy calculated on first step\n"; - utils::logmesg(lmp,mesg); + else + mesg += " Initial energy calculated on first step\n"; + utils::logmesg(lmp, mesg); } // check for periodicity in controlled dimensions - if (domain->nonperiodic) error->all(FLERR,"Fix msst requires a periodic box"); + if (domain->nonperiodic) error->all(FLERR, "Fix msst requires a periodic box"); // create a new temperature compute // id = fix-ID + "MSST_temp" @@ -200,8 +207,6 @@ FixMSST::FixMSST(LAMMPS *lmp, int narg, char **arg) : // initialize the time derivative of the volume omega[0] = omega[1] = omega[2] = 0.0; - nrigid = 0; - rfix = nullptr; maxold = -1; old_velocity = nullptr; @@ -211,17 +216,15 @@ FixMSST::FixMSST(LAMMPS *lmp, int narg, char **arg) : FixMSST::~FixMSST() { - delete [] rfix; - // delete temperature and pressure if fix created them if (tflag) modify->delete_compute(id_temp); if (pflag) modify->delete_compute(id_press); if (peflag) modify->delete_compute(id_pe); - delete [] id_temp; - delete [] id_press; - delete [] id_pe; + delete[] id_temp; + delete[] id_press; + delete[] id_pe; memory->destroy(old_velocity); } @@ -240,22 +243,20 @@ int FixMSST::setmask() void FixMSST::init() { - if (atom->mass == nullptr) - error->all(FLERR,"Cannot use fix msst without per-type mass defined"); + if (atom->mass == nullptr) error->all(FLERR, "Cannot use fix msst without per-type mass defined"); // set compute ptrs int itemp = modify->find_compute(id_temp); int ipress = modify->find_compute(id_press); int ipe = modify->find_compute(id_pe); - if (itemp < 0 || ipress < 0|| ipe < 0) - error->all(FLERR,"Could not find fix msst compute ID"); + if (itemp < 0 || ipress < 0 || ipe < 0) error->all(FLERR, "Could not find fix msst compute ID"); if (modify->compute[itemp]->tempflag == 0) - error->all(FLERR,"Fix msst compute ID does not compute temperature"); + error->all(FLERR, "Fix msst compute ID does not compute temperature"); if (modify->compute[ipress]->pressflag == 0) - error->all(FLERR,"Fix msst compute ID does not compute pressure"); + error->all(FLERR, "Fix msst compute ID does not compute pressure"); if (modify->compute[ipe]->peflag == 0) - error->all(FLERR,"Fix msst compute ID does not compute potential energy"); + error->all(FLERR, "Fix msst compute ID does not compute potential energy"); temperature = modify->compute[itemp]; pressure = modify->compute[ipress]; @@ -271,37 +272,27 @@ void FixMSST::init() double mass = 0.0; for (int i = 0; i < atom->nlocal; i++) mass += atom->mass[atom->type[i]]; - MPI_Allreduce(&mass,&total_mass,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&mass, &total_mass, 1, MPI_DOUBLE, MPI_SUM, world); - if (force->kspace) kspace_flag = 1; - else kspace_flag = 0; + if (force->kspace) + kspace_flag = 1; + else + kspace_flag = 0; // detect if any fix rigid exist so rigid bodies move when box is dilated - // rfix[] = indices to each fix rigid - delete [] rfix; - nrigid = 0; - rfix = nullptr; - - for (int i = 0; i < modify->nfix; i++) - if (utils::strmatch(modify->fix[i]->style,"^rigid") || - utils::strmatch(modify->fix[i]->style,"^poems$")) nrigid++; - if (nrigid) { - rfix = new int[nrigid]; - nrigid = 0; - for (int i = 0; i < modify->nfix; i++) - if (utils::strmatch(modify->fix[i]->style,"^rigid") || - utils::strmatch(modify->fix[i]->style,"^poems$")) rfix[nrigid++] = i; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); // find fix external being used to drive LAMMPS from DFTB+ if (dftb) { for (int i = 0; i < modify->nfix; i++) - if (utils::strmatch(modify->fix[i]->style,"^external$")) + if (utils::strmatch(modify->fix[i]->style, "^external$")) fix_external = dynamic_cast(modify->fix[i]); if (fix_external == nullptr) - error->all(FLERR,"Fix msst dftb cannot be used w/out fix external"); + error->all(FLERR, "Fix msst dftb cannot be used w/out fix external"); } } @@ -321,29 +312,26 @@ void FixMSST::setup(int /*vflag*/) if (v0_set == 0) { v0 = compute_vol(); v0_set = 1; - if (comm->me == 0) - utils::logmesg(lmp,"Fix MSST v0 = {:.8g}\n", v0); + if (comm->me == 0) utils::logmesg(lmp, "Fix MSST v0 = {:.8g}\n", v0); } if (p0_set == 0) { p0 = p_current[direction]; p0_set = 1; - if (comm->me == 0) - utils::logmesg(lmp,"Fix MSST p0 = {:.8g}\n", p0); + if (comm->me == 0) utils::logmesg(lmp, "Fix MSST p0 = {:.8g}\n", p0); } if (e0_set == 0) { e0 = compute_etotal(); e0_set = 1; - if (comm->me == 0) - utils::logmesg(lmp,"Fix MSST e0 = {:.8g}\n", e0); + if (comm->me == 0) utils::logmesg(lmp, "Fix MSST e0 = {:.8g}\n", e0); } temperature->compute_vector(); double *ke_tensor = temperature->vector; - double ke_temp = ke_tensor[0]+ke_tensor[1]+ke_tensor[2]; + double ke_temp = ke_tensor[0] + ke_tensor[1] + ke_tensor[2]; if (ke_temp > 0.0 && tscale > 0.0) { // transfer energy from atom velocities to cell volume motion @@ -351,30 +339,30 @@ void FixMSST::setup(int /*vflag*/) double **v = atom->v; int *mask = atom->mask; - double sqrt_initial_temperature_scaling = sqrt(1.0-tscale); + double sqrt_initial_temperature_scaling = sqrt(1.0 - tscale); - double fac1 = tscale*total_mass/qmass*ke_temp/force->mvv2e; + double fac1 = tscale * total_mass / qmass * ke_temp / force->mvv2e; - omega[direction]=-1*sqrt(fac1); - double fac2 = omega[direction]/v0; + omega[direction] = -1 * sqrt(fac1); + double fac2 = omega[direction] / v0; - if ( comm->me == 0 && tscale != 1.0) - utils::logmesg(lmp,"Fix MSST initial strain rate of {:.8g} " + if (comm->me == 0 && tscale != 1.0) + utils::logmesg(lmp, + "Fix MSST initial strain rate of {:.8g} " "established by reducing temperature by factor " - "of {:.8g}\n",fac2,tscale); + "of {:.8g}\n", + fac2, tscale); for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & groupbit) { - for (int k = 0; k < 3; k++) { - v[i][k]*=sqrt_initial_temperature_scaling; - } + for (int k = 0; k < 3; k++) { v[i][k] *= sqrt_initial_temperature_scaling; } } } } // trigger virial computation on next timestep - pe->addstep(update->ntimestep+1); - pressure->addstep(update->ntimestep+1); + pe->addstep(update->ntimestep + 1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- @@ -383,8 +371,8 @@ void FixMSST::setup(int /*vflag*/) void FixMSST::initial_integrate(int /*vflag*/) { - int i,k; - double p_msst; // MSST driving pressure + int i, k; + double p_msst; // MSST driving pressure double vol; int nlocal = atom->nlocal; @@ -401,7 +389,7 @@ void FixMSST::initial_integrate(int /*vflag*/) if (nlocal > maxold) { memory->destroy(old_velocity); maxold = atom->nmax; - memory->create(old_velocity,maxold,3,"msst:old_velocity"); + memory->create(old_velocity, maxold, 3, "msst:old_velocity"); } // for DFTB, extract TS_dftb from fix external @@ -409,14 +397,14 @@ void FixMSST::initial_integrate(int /*vflag*/) if (dftb) { const double TS_dftb = fix_external->compute_vector(0); - const double TS = force->ftm2v*TS_dftb; + const double TS = force->ftm2v * TS_dftb; // update S_elec terms and compute TS_dot via finite differences S_elec_2 = S_elec_1; S_elec_1 = S_elec; const double Temp = temperature->compute_scalar(); - S_elec = TS/Temp; - TS_dot = Temp*(3.0*S_elec-4.0*S_elec_1+S_elec_2)/(2.0*update->dt); - TS_int += (update->dt*TS_dot); + S_elec = TS / Temp; + TS_dot = Temp * (3.0 * S_elec - 4.0 * S_elec_1 + S_elec_2) / (2.0 * update->dt); + TS_int += (update->dt * TS_dot); if (update->ntimestep == 1) T0S0 = TS; } @@ -434,11 +422,9 @@ void FixMSST::initial_integrate(int /*vflag*/) // propagate the time derivative of // the volume 1/2 step at fixed vol, r, rdot - p_msst = nktv2p * mvv2e * velocity * velocity * total_mass * - ( v0 - vol)/( v0 * v0); - double A = total_mass * ( p_current[sd] - p0 - p_msst ) / - (qmass * nktv2p * mvv2e); - double B = total_mass * mu / ( qmass * vol ); + p_msst = nktv2p * mvv2e * velocity * velocity * total_mass * (v0 - vol) / (v0 * v0); + double A = total_mass * (p_current[sd] - p0 - p_msst) / (qmass * nktv2p * mvv2e); + double B = total_mass * mu / (qmass * vol); // prevent blow-up of the volume @@ -447,11 +433,10 @@ void FixMSST::initial_integrate(int /*vflag*/) // use Taylor expansion to avoid singularity at B = 0 if (B * dthalf > 1.0e-06) { - omega[sd] = ( omega[sd] + A * ( exp(B * dthalf) - 1.0 ) / B ) - * exp(-B * dthalf); + omega[sd] = (omega[sd] + A * (exp(B * dthalf) - 1.0) / B) * exp(-B * dthalf); } else { omega[sd] = omega[sd] + (A - B * omega[sd]) * dthalf + - 0.5 * (B * B * omega[sd] - A * B ) * dthalf * dthalf; + 0.5 * (B * B * omega[sd] - A * B) * dthalf * dthalf; } // propagate velocity sum 1/2 step by @@ -464,20 +449,19 @@ void FixMSST::initial_integrate(int /*vflag*/) if (mask[i] & groupbit) { for (k = 0; k < 3; k++) { const double C = f[i][k] * force->ftm2v / mass[type[i]]; - const double TS_term = TS_dot/(mass[type[i]]*velocity_sum); - const double escale_term = force->ftm2v*beta*(e0-e_scale) / - (mass[type[i]]*velocity_sum); - double D = mu * omega[sd] * omega[sd] / - (velocity_sum * mass[type[i]] * vol ); + const double TS_term = TS_dot / (mass[type[i]] * velocity_sum); + const double escale_term = + force->ftm2v * beta * (e0 - e_scale) / (mass[type[i]] * velocity_sum); + double D = mu * omega[sd] * omega[sd] / (velocity_sum * mass[type[i]] * vol); D += escale_term - TS_term; old_velocity[i][k] = v[i][k]; if (k == direction) D -= 2.0 * omega[sd] / vol; if (fabs(dthalf * D) > 1.0e-06) { const double expd = exp(D * dthalf); - v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; + v[i][k] = expd * (C + D * v[i][k] - C / expd) / D; } else { - v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + - 0.5 * (D * D * v[i][k] + C * D ) * dthalf * dthalf; + v[i][k] = v[i][k] + (C + D * v[i][k]) * dthalf + + 0.5 * (D * D * v[i][k] + C * D) * dthalf * dthalf; } } } @@ -487,18 +471,15 @@ void FixMSST::initial_integrate(int /*vflag*/) if (mask[i] & groupbit) { for (k = 0; k < 3; k++) { const double C = f[i][k] * force->ftm2v / mass[type[i]]; - double D = mu * omega[sd] * omega[sd] / - (velocity_sum * mass[type[i]] * vol ); + double D = mu * omega[sd] * omega[sd] / (velocity_sum * mass[type[i]] * vol); old_velocity[i][k] = v[i][k]; - if (k == direction) { - D -= 2.0 * omega[sd] / vol; - } + if (k == direction) { D -= 2.0 * omega[sd] / vol; } if (fabs(dthalf * D) > 1.0e-06) { const double expd = exp(D * dthalf); - v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; + v[i][k] = expd * (C + D * v[i][k] - C / expd) / D; } else { - v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + - 0.5 * (D * D * v[i][k] + C * D ) * dthalf * dthalf; + v[i][k] = v[i][k] + (C + D * v[i][k]) * dthalf + + 0.5 * (D * D * v[i][k] + C * D) * dthalf * dthalf; } } } @@ -524,19 +505,18 @@ void FixMSST::initial_integrate(int /*vflag*/) if (mask[i] & groupbit) { for (k = 0; k < 3; k++) { const double C = f[i][k] * force->ftm2v / mass[type[i]]; - const double TS_term = TS_dot/(mass[type[i]]*velocity_sum); - const double escale_term = force->ftm2v*beta*(e0-e_scale) / - (mass[type[i]]*velocity_sum); - double D = mu * omega[sd] * omega[sd] / - (velocity_sum * mass[type[i]] * vol ); + const double TS_term = TS_dot / (mass[type[i]] * velocity_sum); + const double escale_term = + force->ftm2v * beta * (e0 - e_scale) / (mass[type[i]] * velocity_sum); + double D = mu * omega[sd] * omega[sd] / (velocity_sum * mass[type[i]] * vol); D += escale_term - TS_term; if (k == direction) D -= 2.0 * omega[sd] / vol; if (fabs(dthalf * D) > 1.0e-06) { const double expd = exp(D * dthalf); - v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; + v[i][k] = expd * (C + D * v[i][k] - C / expd) / D; } else { - v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + - 0.5 * (D * D * v[i][k] + C * D ) * dthalf * dthalf; + v[i][k] = v[i][k] + (C + D * v[i][k]) * dthalf + + 0.5 * (D * D * v[i][k] + C * D) * dthalf * dthalf; } } } @@ -546,17 +526,14 @@ void FixMSST::initial_integrate(int /*vflag*/) if (mask[i] & groupbit) { for (k = 0; k < 3; k++) { const double C = f[i][k] * force->ftm2v / mass[type[i]]; - double D = mu * omega[sd] * omega[sd] / - (velocity_sum * mass[type[i]] * vol ); - if (k == direction) { - D -= 2.0 * omega[sd] / vol; - } + double D = mu * omega[sd] * omega[sd] / (velocity_sum * mass[type[i]] * vol); + if (k == direction) { D -= 2.0 * omega[sd] / vol; } if (fabs(dthalf * D) > 1.0e-06) { const double expd = exp(D * dthalf); - v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; + v[i][k] = expd * (C + D * v[i][k] - C / expd) / D; } else { - v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + - 0.5 * (D * D * v[i][k] + C * D ) * dthalf * dthalf; + v[i][k] = v[i][k] + (C + D * v[i][k]) * dthalf + + 0.5 * (D * D * v[i][k] + C * D) * dthalf * dthalf; } } } @@ -569,7 +546,7 @@ void FixMSST::initial_integrate(int /*vflag*/) // rescale positions and change box size - dilation[sd] = vol1/vol; + dilation[sd] = vol1 / vol; remap(0); // propagate particle positions 1 time step @@ -588,7 +565,7 @@ void FixMSST::initial_integrate(int /*vflag*/) // rescale positions and change box size - dilation[sd] = vol2/vol1; + dilation[sd] = vol2 / vol1; remap(0); if (kspace_flag) force->kspace->setup(); @@ -601,7 +578,7 @@ void FixMSST::initial_integrate(int /*vflag*/) void FixMSST::final_integrate() { int i; - double p_msst; // MSST driving pressure + double p_msst; // MSST driving pressure // v update only for atoms in MSST group @@ -624,14 +601,14 @@ void FixMSST::final_integrate() if (dftb) { const double TS_dftb = fix_external->compute_vector(0); - const double TS = force->ftm2v*TS_dftb; + const double TS = force->ftm2v * TS_dftb; S_elec_2 = S_elec_1; S_elec_1 = S_elec; const double Temp = temperature->compute_scalar(); // update S_elec terms and compute TS_dot via finite differences - S_elec = TS/Temp; - TS_dot = Temp*(3.0*S_elec-4.0*S_elec_1+S_elec_2)/(2.0*update->dt); - TS_int += (update->dt*TS_dot); + S_elec = TS / Temp; + TS_dot = Temp * (3.0 * S_elec - 4.0 * S_elec_1 + S_elec_2) / (2.0 * update->dt); + TS_int += (update->dt * TS_dot); if (update->ntimestep == 1) T0S0 = TS; } @@ -642,19 +619,18 @@ void FixMSST::final_integrate() if (mask[i] & groupbit) { for (int k = 0; k < 3; k++) { const double C = f[i][k] * force->ftm2v / mass[type[i]]; - const double TS_term = TS_dot/(mass[type[i]]*velocity_sum); - const double escale_term = force->ftm2v*beta*(e0-e_scale) / - (mass[type[i]]*velocity_sum); - double D = mu * omega[sd] * omega[sd] / - (velocity_sum * mass[type[i]] * vol ); + const double TS_term = TS_dot / (mass[type[i]] * velocity_sum); + const double escale_term = + force->ftm2v * beta * (e0 - e_scale) / (mass[type[i]] * velocity_sum); + double D = mu * omega[sd] * omega[sd] / (velocity_sum * mass[type[i]] * vol); D += escale_term - TS_term; if (k == direction) D -= 2.0 * omega[sd] / vol; if (fabs(dthalf * D) > 1.0e-06) { const double expd = exp(D * dthalf); - v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; + v[i][k] = expd * (C + D * v[i][k] - C / expd) / D; } else { - v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + - 0.5 * (D * D * v[i][k] + C * D ) * dthalf * dthalf; + v[i][k] = v[i][k] + (C + D * v[i][k]) * dthalf + + 0.5 * (D * D * v[i][k] + C * D) * dthalf * dthalf; } } } @@ -664,17 +640,14 @@ void FixMSST::final_integrate() if (mask[i] & groupbit) { for (int k = 0; k < 3; k++) { const double C = f[i][k] * force->ftm2v / mass[type[i]]; - double D = mu * omega[sd] * omega[sd] / - (velocity_sum * mass[type[i]] * vol ); - if (k == direction) { - D -= 2.0 * omega[sd] / vol; - } + double D = mu * omega[sd] * omega[sd] / (velocity_sum * mass[type[i]] * vol); + if (k == direction) { D -= 2.0 * omega[sd] / vol; } if (fabs(dthalf * D) > 1.0e-06) { const double expd = exp(D * dthalf); - v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; + v[i][k] = expd * (C + D * v[i][k] - C / expd) / D; } else { - v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + - 0.5 * (D * D * v[i][k] + C * D ) * dthalf * dthalf; + v[i][k] = v[i][k] + (C + D * v[i][k]) * dthalf + + 0.5 * (D * D * v[i][k] + C * D) * dthalf * dthalf; } } } @@ -692,11 +665,9 @@ void FixMSST::final_integrate() // propagate the time derivative of the volume 1/2 step at fixed V, r, rdot - p_msst = nktv2p * mvv2e * velocity * velocity * total_mass * - ( v0 - vol )/( v0 * v0 ); - double A = total_mass * ( p_current[sd] - p0 - p_msst ) / - ( qmass * nktv2p * mvv2e ); - const double B = total_mass * mu / ( qmass * vol ); + p_msst = nktv2p * mvv2e * velocity * velocity * total_mass * (v0 - vol) / (v0 * v0); + double A = total_mass * (p_current[sd] - p0 - p_msst) / (qmass * nktv2p * mvv2e); + const double B = total_mass * mu / (qmass * vol); // prevent blow-up of the volume @@ -705,21 +676,20 @@ void FixMSST::final_integrate() // use taylor expansion to avoid singularity at B == 0. if (B * dthalf > 1.0e-06) { - omega[sd] = ( omega[sd] + A * - ( exp(B * dthalf) - 1.0 ) / B ) * exp(-B * dthalf); + omega[sd] = (omega[sd] + A * (exp(B * dthalf) - 1.0) / B) * exp(-B * dthalf); } else { omega[sd] = omega[sd] + (A - B * omega[sd]) * dthalf + - 0.5 * (B * B * omega[sd] - A * B ) * dthalf * dthalf; + 0.5 * (B * B * omega[sd] - A * B) * dthalf * dthalf; } // calculate Lagrangian position of computational cell - lagrangian_position -= velocity*vol/v0*update->dt; + lagrangian_position -= velocity * vol / v0 * update->dt; // trigger energy and virial computation on next timestep - pe->addstep(update->ntimestep+1); - pressure->addstep(update->ntimestep+1); + pe->addstep(update->ntimestep + 1); + pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -741,20 +711,20 @@ void FixMSST::couple() void FixMSST::remap(int flag) { - int i,n; - double oldlo,oldhi,ctr; + int i, n; + double oldlo, oldhi, ctr; double **v = atom->v; - if (flag) n = atom->nlocal + atom->nghost; - else n = atom->nlocal; + if (flag) + n = atom->nlocal + atom->nghost; + else + n = atom->nlocal; // convert pertinent atoms and rigid bodies to lamda coords domain->x2lamda(n); - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -763,8 +733,8 @@ void FixMSST::remap(int flag) oldlo = domain->boxlo[i]; oldhi = domain->boxhi[i]; ctr = 0.5 * (oldlo + oldhi); - domain->boxlo[i] = (oldlo-ctr)*dilation[i] + ctr; - domain->boxhi[i] = (oldhi-ctr)*dilation[i] + ctr; + domain->boxlo[i] = (oldlo - ctr) * dilation[i] + ctr; + domain->boxhi[i] = (oldhi - ctr) * dilation[i] + ctr; } } @@ -775,14 +745,9 @@ void FixMSST::remap(int flag) domain->lamda2x(n); - if (nrigid) - for (i = 0; i < nrigid; i++) - modify->fix[rfix[i]]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); - for (i = 0; i < n; i++) { - v[i][direction] = v[i][direction] * - dilation[direction]; - } + for (i = 0; i < n; i++) v[i][direction] = v[i][direction] * dilation[direction]; } /* ---------------------------------------------------------------------- @@ -800,8 +765,8 @@ void FixMSST::write_restart(FILE *fp) list[n++] = TS_int; if (comm->me == 0) { int size = n * sizeof(double); - fwrite(&size,sizeof(int),1,fp); - fwrite(&list,sizeof(double),n,fp); + fwrite(&size, sizeof(int), 1, fp); + fwrite(&list, sizeof(double), n, fp); } } @@ -818,7 +783,7 @@ void FixMSST::restart(char *buf) v0 = list[n++]; p0 = list[n++]; TS_int = list[n++]; - tscale = 0.0; // set tscale to zero for restart + tscale = 0.0; // set tscale to zero for restart p0_set = 1; v0_set = 1; e0_set = 1; @@ -828,43 +793,43 @@ void FixMSST::restart(char *buf) int FixMSST::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"temp") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (strcmp(arg[0], "temp") == 0) { + if (narg < 2) error->all(FLERR, "Illegal fix_modify command"); if (tflag) { modify->delete_compute(id_temp); tflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); + if (icompute < 0) error->all(FLERR, "Could not find fix_modify temperature ID"); temperature = modify->compute[icompute]; if (temperature->tempflag == 0) - error->all(FLERR,"Fix_modify temperature ID does not " + error->all(FLERR, + "Fix_modify temperature ID does not " "compute temperature"); if (temperature->igroup != 0 && comm->me == 0) - error->warning(FLERR,"Temperature for MSST is not for group all"); + error->warning(FLERR, "Temperature for MSST is not for group all"); return 2; - } else if (strcmp(arg[0],"press") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + } else if (strcmp(arg[0], "press") == 0) { + if (narg < 2) error->all(FLERR, "Illegal fix_modify command"); if (pflag) { modify->delete_compute(id_press); pflag = 0; } - delete [] id_press; + delete[] id_press; id_press = utils::strdup(arg[1]); int icompute = modify->find_compute(id_press); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); + if (icompute < 0) error->all(FLERR, "Could not find fix_modify pressure ID"); pressure = modify->compute[icompute]; if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR, "Fix_modify pressure ID does not compute pressure"); return 2; } return 0; @@ -887,10 +852,9 @@ double FixMSST::compute_scalar() i = direction; energy = qmass * omega[i] * omega[i] / (2.0 * total_mass) * mvv2e; - energy -= 0.5 * total_mass * velocity * velocity * - (1.0 - volume/ v0) * - (1.0 - volume/ v0) * mvv2e; - energy -= p0 * ( v0 - volume ) / nktv2p; + energy -= + 0.5 * total_mass * velocity * velocity * (1.0 - volume / v0) * (1.0 - volume / v0) * mvv2e; + energy -= p0 * (v0 - volume) / nktv2p; // subtract off precomputed TS_int integral value // TS_int = 0 for non DFTB calculations @@ -938,8 +902,7 @@ double FixMSST::compute_hugoniot() v = compute_vol(); - dhugo = (0.5 * (p + p0 ) * ( v0 - v)) / - force->nktv2p + e0 - e; + dhugo = (0.5 * (p + p0) * (v0 - v)) / force->nktv2p + e0 - e; dhugo /= temperature->dof * force->boltz; return dhugo; @@ -964,8 +927,7 @@ double FixMSST::compute_rayleigh() v = compute_vol(); drayleigh = p - p0 - - total_mass * velocity * velocity * force->mvv2e * - (1.0 - v / v0 ) * force->nktv2p / v0; + total_mass * velocity * velocity * force->mvv2e * (1.0 - v / v0) * force->nktv2p / v0; return drayleigh; } @@ -978,7 +940,7 @@ double FixMSST::compute_rayleigh() double FixMSST::compute_lagrangian_speed() { double v = compute_vol(); - return velocity*(1.0-v/v0); + return velocity * (1.0 - v / v0); } /* ---------------------------------------------------------------------- @@ -988,7 +950,7 @@ double FixMSST::compute_lagrangian_speed() double FixMSST::compute_lagrangian_position() { - return lagrangian_position; + return lagrangian_position; } /* ---------------------------------------------------------------------- */ @@ -997,11 +959,11 @@ double FixMSST::compute_etotal() { if (!pe) return 0.0; - double epot,ekin,etot; + double epot, ekin, etot; epot = pe->compute_scalar(); ekin = temperature->compute_scalar(); ekin *= 0.5 * temperature->dof * force->boltz; - etot = epot+ekin; + etot = epot + ekin; return etot; } @@ -1028,12 +990,10 @@ double FixMSST::compute_vsum() double t = 0.0; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - t += (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]) ; - } + if (mask[i] & groupbit) { t += (v[i][0] * v[i][0] + v[i][1] * v[i][1] + v[i][2] * v[i][2]); } } - MPI_Allreduce(&t,&vsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&t, &vsum, 1, MPI_DOUBLE, MPI_SUM, world); return vsum; } @@ -1043,6 +1003,6 @@ double FixMSST::compute_vsum() double FixMSST::memory_usage() { - double bytes = 3*atom->nmax * sizeof(double); + double bytes = 3 * atom->nmax * sizeof(double); return bytes; } diff --git a/src/SHOCK/fix_msst.h b/src/SHOCK/fix_msst.h index 8cd3f79a89..c7d4983dc4 100644 --- a/src/SHOCK/fix_msst.h +++ b/src/SHOCK/fix_msst.h @@ -64,9 +64,8 @@ class FixMSST : public Fix { double **old_velocity; // saved velocities - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - int *rfix; // indices of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + std::vector rfix; // indices of rigid fixes char *id_temp, *id_press; // strings with identifiers of char *id_pe; // created computes diff --git a/src/fix_press_berendsen.cpp b/src/fix_press_berendsen.cpp index 05e523abae..40dcdeeb10 100644 --- a/src/fix_press_berendsen.cpp +++ b/src/fix_press_berendsen.cpp @@ -223,17 +223,12 @@ FixPressBerendsen::FixPressBerendsen(LAMMPS *lmp, int narg, char **arg) : id_press = utils::strdup(std::string(id) + "_press"); modify->add_compute(fmt::format("{} all pressure {}", id_press, id_temp)); pflag = 1; - - nrigid = 0; - rfix = nullptr; } /* ---------------------------------------------------------------------- */ FixPressBerendsen::~FixPressBerendsen() { - delete[] rfix; - // delete temperature and pressure if fix created them if (tflag) modify->delete_compute(id_temp); @@ -291,20 +286,10 @@ void FixPressBerendsen::init() kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete[] rfix; - nrigid = 0; - rfix = nullptr; - - for (const auto &ifix : modify->get_fix_list()) - if (ifix->rigid_flag) nrigid++; - if (nrigid > 0) { - rfix = new Fix *[nrigid]; - nrigid = 0; - for (auto &ifix : modify->get_fix_list()) - if (ifix->rigid_flag) rfix[nrigid++] = ifix; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); } /* ---------------------------------------------------------------------- @@ -409,8 +394,7 @@ void FixPressBerendsen::remap() if (mask[i] & groupbit) domain->x2lamda(x[i], x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) rfix[i]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -436,8 +420,7 @@ void FixPressBerendsen::remap() if (mask[i] & groupbit) domain->lamda2x(x[i], x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) rfix[i]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_press_berendsen.h b/src/fix_press_berendsen.h index 9e83533746..ddbe31e7ed 100644 --- a/src/fix_press_berendsen.h +++ b/src/fix_press_berendsen.h @@ -44,9 +44,8 @@ class FixPressBerendsen : public Fix { double p_period[3], p_target[3]; double p_current[3], dilation[3]; double factor[3]; - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - class Fix **rfix; // indices of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + std::vector rfix; // indices of rigid fixes char *id_temp, *id_press; class Compute *temperature, *pressure; diff --git a/src/fix_press_langevin.cpp b/src/fix_press_langevin.cpp index 2f6e765cd5..752f826dfe 100644 --- a/src/fix_press_langevin.cpp +++ b/src/fix_press_langevin.cpp @@ -376,9 +376,6 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); gjfb[i] = 1. / (1.0 + p_alpha[i] * update->dt / 2.0 / p_mass[i]); } - - nrigid = 0; - rfix = nullptr; } /* ---------------------------------------------------------------------- */ @@ -386,7 +383,6 @@ FixPressLangevin::FixPressLangevin(LAMMPS *lmp, int narg, char **arg) : FixPressLangevin::~FixPressLangevin() { delete random; - delete[] rfix; delete irregular; // delete temperature and pressure if fix created them @@ -437,20 +433,10 @@ void FixPressLangevin::init() kspace_flag = 0; // detect if any rigid fixes exist so rigid bodies move when box is remapped - // rfix[] = indices to each fix rigid - delete[] rfix; - nrigid = 0; - rfix = nullptr; - - for (const auto &ifix : modify->get_fix_list()) - if (ifix->rigid_flag) nrigid++; - if (nrigid > 0) { - rfix = new Fix *[nrigid]; - nrigid = 0; - for (auto &ifix : modify->get_fix_list()) - if (ifix->rigid_flag) rfix[nrigid++] = ifix; - } + rfix.clear(); + for (auto &ifix : modify->get_fix_list()) + if (ifix->rigid_flag) rfix.push_back(ifix); // Nullifies piston derivatives and forces so that it is not integrated at // the start of a second run. @@ -680,8 +666,7 @@ void FixPressLangevin::remap() if (mask[i] & groupbit) domain->x2lamda(x[i], x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) rfix[i]->deform(0); + for (auto &ifix : rfix) ifix->deform(0); // reset global and local box to new size/shape @@ -719,8 +704,7 @@ void FixPressLangevin::remap() if (mask[i] & groupbit) domain->lamda2x(x[i], x[i]); } - if (nrigid) - for (i = 0; i < nrigid; i++) rfix[i]->deform(1); + for (auto &ifix : rfix) ifix->deform(1); } /* ---------------------------------------------------------------------- diff --git a/src/fix_press_langevin.h b/src/fix_press_langevin.h index 868993b1f4..498f9443a7 100644 --- a/src/fix_press_langevin.h +++ b/src/fix_press_langevin.h @@ -51,9 +51,8 @@ class FixPressLangevin : public Fix { double p_deriv[6], dilation[6]; double f_piston[6], f_old_piston[6]; double gjfa[6], gjfb[6], fran[6]; - int kspace_flag; // 1 if KSpace invoked, 0 if not - int nrigid; // number of rigid fixes - class Fix **rfix; // list of rigid fixes + int kspace_flag; // 1 if KSpace invoked, 0 if not + std::vector rfix; // indices of rigid fixes char *id_temp, *id_press; class Compute *temperature, *pressure; From 3390a11312e81f79592d44351b781473937c3e27 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 12 Nov 2023 10:04:04 -0500 Subject: [PATCH 351/417] improve error detection and messages --- src/variable.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 264dcf6258..9c0307341a 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -3397,18 +3397,18 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow) char *id = start+2; int ivar = find(id); if (ivar < 0) - error->all(FLERR,"Invalid variable name in variable formula"); + error->all(FLERR,"Invalid variable name {} in variable formula", id); char *var = retrieve(id); if (var == nullptr) - error->all(FLERR,"Invalid variable evaluation in variable formula"); + error->all(FLERR,"Invalid variable evaluation for variable {} in variable formula", id); index = static_cast (atof(var)); } else index = ATOTAGINT(start); *ptr = ']'; - if (index == 0) + if (index <= 0) error->all(FLERR,"Index between variable brackets must be positive"); return index; } From 443f0666b706602fb97d0544a22effa0fa1e1c95 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 12 Nov 2023 16:03:25 -0500 Subject: [PATCH 352/417] refactor some more temperature/pressure/pe compute lookups --- src/EXTRA-FIX/fix_pafi.cpp | 29 +++++++++---------- src/EXTRA-FIX/fix_temp_csld.cpp | 32 +++++++++------------ src/EXTRA-FIX/fix_temp_csvr.cpp | 29 ++++++++----------- src/PLUMED/fix_plumed.cpp | 16 +++++------ src/QTB/fix_qbmsst.cpp | 48 ++++++++++++++----------------- src/QTB/fix_qtb.cpp | 12 ++++---- src/SHOCK/fix_msst.cpp | 51 ++++++++++++++------------------- src/SHOCK/fix_nphug.cpp | 9 +++--- src/UEF/fix_nh_uef.cpp | 20 ++++++------- 9 files changed, 105 insertions(+), 141 deletions(-) diff --git a/src/EXTRA-FIX/fix_pafi.cpp b/src/EXTRA-FIX/fix_pafi.cpp index 596bfdf667..05ee6b90da 100644 --- a/src/EXTRA-FIX/fix_pafi.cpp +++ b/src/EXTRA-FIX/fix_pafi.cpp @@ -77,14 +77,14 @@ FixPAFI::FixPAFI(LAMMPS *lmp, int narg, char **arg) : computename = utils::strdup(&arg[3][0]); - icompute = modify->find_compute(computename); - if (icompute == -1) - error->all(FLERR,"Compute ID for fix pafi does not exist"); - PathCompute = modify->compute[icompute]; + PathCompute = modify->get_compute_by_id(computename); + if (!PathCompute) + error->all(FLERR,"Compute ID {} for fix pafi does not exist", computename); + if (PathCompute->peratom_flag==0) - error->all(FLERR,"Compute for fix pafi does not calculate a local array"); + error->all(FLERR,"Compute {} for fix pafi does not calculate a local array", computename); if (PathCompute->size_peratom_cols < 9) - error->all(FLERR,"Compute for fix pafi must have 9 fields per atom"); + error->all(FLERR,"Compute {} for fix pafi must have 9 fields per atom", computename); if (comm->me==0) utils::logmesg(lmp,"fix pafi compute name,style: {},{}\n",computename,PathCompute->style); @@ -167,15 +167,14 @@ void FixPAFI::init() dtv = update->dt; dtf = 0.5 * update->dt * force->ftm2v; - icompute = modify->find_compute(computename); - if (icompute == -1) - error->all(FLERR,"Compute ID for fix pafi does not exist"); - PathCompute = modify->compute[icompute]; - if (PathCompute->peratom_flag==0) - error->all(FLERR,"Compute for fix pafi does not calculate a local array"); - if (PathCompute->size_peratom_cols < 9) - error->all(FLERR,"Compute for fix pafi must have 9 fields per atom"); + PathCompute = modify->get_compute_by_id(computename); + if (!PathCompute) + error->all(FLERR,"Compute ID {} for fix pafi does not exist", computename); + if (PathCompute->peratom_flag==0) + error->all(FLERR,"Compute {} for fix pafi does not calculate a local array", computename); + if (PathCompute->size_peratom_cols < 9) + error->all(FLERR,"Compute {} for fix pafi must have 9 fields per atom", computename); if (utils::strmatch(update->integrate_style,"^respa")) { step_respa = (dynamic_cast(update->integrate))->step; // nve @@ -183,7 +182,6 @@ void FixPAFI::init() if (respa_level >= 0) ilevel_respa = MIN(respa_level,nlevels_respa-1); else ilevel_respa = nlevels_respa-1; } - } void FixPAFI::setup(int vflag) @@ -206,7 +204,6 @@ void FixPAFI::min_setup(int vflag) min_post_force(vflag); } - void FixPAFI::post_force(int /*vflag*/) { double **x = atom->x; diff --git a/src/EXTRA-FIX/fix_temp_csld.cpp b/src/EXTRA-FIX/fix_temp_csld.cpp index cbcd2ca7df..13ead5b393 100644 --- a/src/EXTRA-FIX/fix_temp_csld.cpp +++ b/src/EXTRA-FIX/fix_temp_csld.cpp @@ -40,6 +40,7 @@ using namespace FixConst; enum{NOBIAS,BIAS}; enum{CONSTANT,EQUAL}; +static constexpr int PRNGSIZE = 98+2+3; /* ---------------------------------------------------------------------- */ FixTempCSLD::FixTempCSLD(LAMMPS *lmp, int narg, char **arg) : @@ -95,12 +96,12 @@ FixTempCSLD::FixTempCSLD(LAMMPS *lmp, int narg, char **arg) : FixTempCSLD::~FixTempCSLD() { - delete [] tstr; + delete[] tstr; // delete temperature if fix created it if (tflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; delete random; memory->destroy(vhold); @@ -137,15 +138,14 @@ void FixTempCSLD::init() if (tstr) { tvar = input->variable->find(tstr); if (tvar < 0) - error->all(FLERR,"Variable name for fix temp/csld does not exist"); + error->all(FLERR,"Variable name {} for fix temp/csld does not exist", tstr); if (input->variable->equalstyle(tvar)) tstyle = EQUAL; - else error->all(FLERR,"Variable for fix temp/csld is invalid style"); + else error->all(FLERR,"Variable {} for fix temp/csld is invalid style", tstr); } - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature ID for fix temp/csld does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR,"Temperature ID {} for fix temp/csld does not exist", id_temp); if (modify->check_rigid_group_overlap(groupbit)) error->warning(FLERR,"Cannot thermostat atoms in rigid bodies"); @@ -158,7 +158,6 @@ void FixTempCSLD::init() void FixTempCSLD::end_of_step() { - // set current t_target // if variable temp, evaluate variable, wrap with clear/add @@ -171,8 +170,7 @@ void FixTempCSLD::end_of_step() modify->clearstep_compute(); t_target = input->variable->compute_equal(tvar); if (t_target < 0.0) - error->one(FLERR, - "Fix temp/csld variable returned negative temperature"); + error->one(FLERR, "Fix temp/csld variable returned negative temperature"); modify->addstep_compute(update->ntimestep + nevery); } @@ -259,17 +257,14 @@ int FixTempCSLD::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR, - "Fix_modify temperature ID does not compute temperature"); + error->all(FLERR, "Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != igroup && comm->me == 0) error->warning(FLERR,"Group for fix_modify temp != fix group"); return 2; @@ -297,7 +292,6 @@ double FixTempCSLD::compute_scalar() void FixTempCSLD::write_restart(FILE *fp) { - const int PRNGSIZE = 98+2+3; int nsize = PRNGSIZE*comm->nprocs+2; // pRNG state per proc + nprocs + energy double *list = nullptr; if (comm->me == 0) { diff --git a/src/EXTRA-FIX/fix_temp_csvr.cpp b/src/EXTRA-FIX/fix_temp_csvr.cpp index b908d1a4ed..6b46629a99 100644 --- a/src/EXTRA-FIX/fix_temp_csvr.cpp +++ b/src/EXTRA-FIX/fix_temp_csvr.cpp @@ -95,12 +95,12 @@ FixTempCSVR::FixTempCSVR(LAMMPS *lmp, int narg, char **arg) : FixTempCSVR::~FixTempCSVR() { - delete [] tstr; + delete[] tstr; // delete temperature if fix created it if (tflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; delete random; nmax = -1; @@ -124,15 +124,14 @@ void FixTempCSVR::init() if (tstr) { tvar = input->variable->find(tstr); if (tvar < 0) - error->all(FLERR,"Variable name for fix temp/csvr does not exist"); + error->all(FLERR,"Variable name {} for fix temp/csvr does not exist", tstr); if (input->variable->equalstyle(tvar)) tstyle = EQUAL; - else error->all(FLERR,"Variable for fix temp/csvr is invalid style"); + else error->all(FLERR,"Variable {} for fix temp/csvr is invalid style", tstr); } - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Temperature ID for fix temp/csvr does not exist"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR,"Temperature ID {} for fix temp/csvr does not exist", id_temp); if (temperature->tempbias) which = BIAS; else which = NOBIAS; @@ -154,8 +153,7 @@ void FixTempCSVR::end_of_step() modify->clearstep_compute(); t_target = input->variable->compute_equal(tvar); if (t_target < 0.0) - error->one(FLERR, - "Fix temp/csvr variable returned negative temperature"); + error->one(FLERR, "Fix temp/csvr variable returned negative temperature"); modify->addstep_compute(update->ntimestep + nevery); } @@ -215,17 +213,14 @@ int FixTempCSVR::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); - int icompute = modify->find_compute(id_temp); - if (icompute < 0) - error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) error->all(FLERR,"Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR, - "Fix_modify temperature ID does not compute temperature"); + error->all(FLERR, "Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != igroup && comm->me == 0) error->warning(FLERR,"Group for fix_modify temp != fix group"); return 2; diff --git a/src/PLUMED/fix_plumed.cpp b/src/PLUMED/fix_plumed.cpp index f06d5474f6..ad7f4f3995 100644 --- a/src/PLUMED/fix_plumed.cpp +++ b/src/PLUMED/fix_plumed.cpp @@ -522,14 +522,13 @@ int FixPlumed::modify_param(int narg, char **arg) delete[] id_pe; id_pe = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify potential energy ID"); - c_pe = modify->compute[icompute]; + c_pe = modify->get_compute_by_id(id_pe); + if (!c_pe) error->all(FLERR,"Could not find fix_modify potential energy ID {}", id_pe); if (c_pe->peflag == 0) - error->all(FLERR,"Fix_modify plmd_pe ID does not compute potential energy"); + error->all(FLERR,"Fix_modify compute pe ID {} does not compute potential energy", id_pe); if (c_pe->igroup != 0 && comm->me == 0) - error->warning(FLERR,"Potential for fix PLUMED is not for group all"); + error->warning(FLERR,"Potential energy compute {} for fix PLUMED is not for group all", id_pe); return 2; @@ -539,12 +538,11 @@ int FixPlumed::modify_param(int narg, char **arg) delete[] id_press; id_press = utils::strdup(arg[1]); - int icompute = modify->find_compute(arg[1]); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - c_press = modify->compute[icompute]; + c_press = modify->get_compute_by_id(id_press); + if (!c_press) error->all(FLERR,"Could not find fix_modify compute pressure ID {}", id_press); if (c_press->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR,"Fix_modify compute pressure ID {} does not compute pressure", id_press); if (c_press->igroup != 0 && comm->me == 0) error->warning(FLERR,"Virial for fix PLUMED is not for group all"); diff --git a/src/QTB/fix_qbmsst.cpp b/src/QTB/fix_qbmsst.cpp index 2450561363..4cd2d05760 100644 --- a/src/QTB/fix_qbmsst.cpp +++ b/src/QTB/fix_qbmsst.cpp @@ -313,20 +313,20 @@ void FixQBMSST::init() error->all(FLERR,"Cannot use fix qbmsst without per-type mass defined"); // set compute ptrs - int itemp = modify->find_compute(id_temp); - int ipress = modify->find_compute(id_press); - int ipe = modify->find_compute(id_pe); - if (itemp < 0 || ipress < 0|| ipe < 0) - error->all(FLERR,"Could not find fix qbmsst compute ID"); - if (modify->compute[itemp]->tempflag == 0) - error->all(FLERR,"Fix qbmsst compute ID does not compute temperature"); - if (modify->compute[ipress]->pressflag == 0) - error->all(FLERR,"Fix qbmsst compute ID does not compute pressure"); - if (modify->compute[ipe]->peflag == 0) - error->all(FLERR,"Fix qbmsst compute ID does not compute potential energy"); - temperature = modify->compute[itemp]; - pressure = modify->compute[ipress]; - pe = modify->compute[ipe]; + + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix qbmsst temperature compute ID {}", id_temp); + if (temperature->tempflag == 0) + error->all(FLERR, "Fix qbmsst compute ID {} does not compute temperature", id_temp); + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR, "Could not find fix qbmsst pressure compute ID {}", id_press); + if (pressure->pressflag == 0) + error->all(FLERR, "Fix qbmsst compute ID {} does not compute pressure", id_press); + pe = modify->get_compute_by_id(id_pe); + if (!pe) error->all(FLERR, "Could not find fix qbmsst pe compute ID {}", id_pe); + if (pe->peflag == 0) + error->all(FLERR, "Fix qbmsst compute ID {} does not compute potential energy", id_pe); // initiate the counter l and \mu counter_l=0; @@ -856,16 +856,13 @@ int FixQBMSST::modify_param(int narg, char **arg) } delete[] id_temp; id_temp = utils::strdup(arg[1]); - - int icompute = modify->find_compute(id_temp); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; - + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR,"Fix_modify temperature ID does not compute temperature"); + error->all(FLERR,"Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != 0 && comm->me == 0) - error->warning(FLERR,"Temperature for QBMSST is not for group all"); - + error->warning(FLERR, "Temperature for fix qbmsst is not for group all"); return 2; } else if (strcmp(arg[0],"press") == 0) { @@ -877,12 +874,11 @@ int FixQBMSST::modify_param(int narg, char **arg) delete[] id_press; id_press = utils::strdup(arg[1]); - int icompute = modify->find_compute(id_press); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Could not find fix_modify compute pressure ID {}", id_press); if (pressure->pressflag == 0) - error->all(FLERR,"Fix_modify pressure ID does not compute pressure"); + error->all(FLERR,"Fix_modify compute pressure ID {} does not compute pressure", id_press); return 2; } return 0; diff --git a/src/QTB/fix_qtb.cpp b/src/QTB/fix_qtb.cpp index 2f7ce4130a..8f73a04927 100644 --- a/src/QTB/fix_qtb.cpp +++ b/src/QTB/fix_qtb.cpp @@ -345,15 +345,13 @@ int FixQTB::modify_param(int narg, char **arg) { if (strcmp(arg[0],"temp") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); - - int icompute = modify->find_compute(id_temp); - if (icompute < 0) error->all(FLERR,"Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; - + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR,"Fix_modify temperature ID does not compute temperature"); + error->all(FLERR,"Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != igroup && comm->me == 0) error->warning(FLERR,"Group for fix_modify temp != fix group"); return 2; diff --git a/src/SHOCK/fix_msst.cpp b/src/SHOCK/fix_msst.cpp index 55842250ec..b3a55ff663 100644 --- a/src/SHOCK/fix_msst.cpp +++ b/src/SHOCK/fix_msst.cpp @@ -247,20 +247,19 @@ void FixMSST::init() // set compute ptrs - int itemp = modify->find_compute(id_temp); - int ipress = modify->find_compute(id_press); - int ipe = modify->find_compute(id_pe); - if (itemp < 0 || ipress < 0 || ipe < 0) error->all(FLERR, "Could not find fix msst compute ID"); - if (modify->compute[itemp]->tempflag == 0) - error->all(FLERR, "Fix msst compute ID does not compute temperature"); - if (modify->compute[ipress]->pressflag == 0) - error->all(FLERR, "Fix msst compute ID does not compute pressure"); - if (modify->compute[ipe]->peflag == 0) - error->all(FLERR, "Fix msst compute ID does not compute potential energy"); - - temperature = modify->compute[itemp]; - pressure = modify->compute[ipress]; - pe = modify->compute[ipe]; + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix msst temperature compute ID {}", id_temp); + if (temperature->tempflag == 0) + error->all(FLERR, "Fix msst compute ID {} does not compute temperature", id_temp); + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR, "Could not find fix msst pressure compute ID {}", id_press); + if (pressure->pressflag == 0) + error->all(FLERR, "Fix msst compute ID {} does not compute pressure", id_press); + pe = modify->get_compute_by_id(id_pe); + if (!pe) error->all(FLERR, "Could not find fix msst pe compute ID {}", id_pe); + if (pe->peflag == 0) + error->all(FLERR, "Fix msst compute ID {} does not compute potential energy", id_pe); dtv = update->dt; dtf = 0.5 * update->dt * force->ftm2v; @@ -801,18 +800,13 @@ int FixMSST::modify_param(int narg, char **arg) } delete[] id_temp; id_temp = utils::strdup(arg[1]); - - int icompute = modify->find_compute(id_temp); - if (icompute < 0) error->all(FLERR, "Could not find fix_modify temperature ID"); - temperature = modify->compute[icompute]; - + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix_modify temperature ID {}", id_temp); if (temperature->tempflag == 0) - error->all(FLERR, - "Fix_modify temperature ID does not " - "compute temperature"); + error->all(FLERR,"Fix_modify temperature ID {} does not compute temperature", id_temp); if (temperature->igroup != 0 && comm->me == 0) - error->warning(FLERR, "Temperature for MSST is not for group all"); - + error->warning(FLERR, "Temperature for fix msst is not for group all"); return 2; } else if (strcmp(arg[0], "press") == 0) { @@ -823,13 +817,10 @@ int FixMSST::modify_param(int narg, char **arg) } delete[] id_press; id_press = utils::strdup(arg[1]); - - int icompute = modify->find_compute(id_press); - if (icompute < 0) error->all(FLERR, "Could not find fix_modify pressure ID"); - pressure = modify->compute[icompute]; - + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR, "Could not find fix_modify pressure ID {}", id_press); if (pressure->pressflag == 0) - error->all(FLERR, "Fix_modify pressure ID does not compute pressure"); + error->all(FLERR, "Fix_modify pressure ID {} does not compute pressure", id_press); return 2; } return 0; diff --git a/src/SHOCK/fix_nphug.cpp b/src/SHOCK/fix_nphug.cpp index 0f9bb3ba93..3cad719c35 100644 --- a/src/SHOCK/fix_nphug.cpp +++ b/src/SHOCK/fix_nphug.cpp @@ -148,7 +148,7 @@ FixNPHug::~FixNPHug() // delete pe compute if (peflag) modify->delete_compute(id_pe); - delete [] id_pe; + delete[] id_pe; } /* ---------------------------------------------------------------------- */ @@ -161,10 +161,9 @@ void FixNPHug::init() // set pe ptr - int icompute = modify->find_compute(id_pe); - if (icompute < 0) - error->all(FLERR,"Potential energy ID for fix nvt/nph/npt does not exist"); - pe = modify->compute[icompute]; + pe = modify->get_compute_by_id(id_pe); + if (pe) + error->all(FLERR, "Potential energy compute ID {} for fix {} does not exist", id_pe, style); } diff --git a/src/UEF/fix_nh_uef.cpp b/src/UEF/fix_nh_uef.cpp index b8b1fd07d6..a824966d34 100644 --- a/src/UEF/fix_nh_uef.cpp +++ b/src/UEF/fix_nh_uef.cpp @@ -228,28 +228,24 @@ void FixNHUef::init() // find conflict with fix/deform or other box chaging fixes - for (int i=0; i < modify->nfix; i++) - { - if (strcmp(modify->fix[i]->id,id) != 0) - if ((modify->fix[i]->box_change & BOX_CHANGE_SHAPE) != 0) - error->all(FLERR,"Can't use another fix which changes box shape with fix/nvt/npt/uef"); + for (auto &ifix : modify->get_fix_list()) { + if (strcmp(ifix->id, id) != 0) + if ((ifix->box_change & BOX_CHANGE_SHAPE) != 0) + error->all(FLERR,"Can't use another fix which changes box shape with fix {}", style); } // this will make the pressure compute for nvt if (!pstat_flag) if (pcomputeflag) { - int icomp = modify->find_compute(id_press); - if (icomp<0) - error->all(FLERR,"Pressure ID for fix/nvt/uef doesn't exist"); - pressure = modify->compute[icomp]; - + pressure = modify->get_compute_by_id(id_press); + if (!pressure) error->all(FLERR,"Pressure ID {} for {} doesn't exist", id_press, style); if (strcmp(pressure->style,"pressure/uef") != 0) - error->all(FLERR,"Using fix nvt/npt/uef without a compute pressure/uef"); + error->all(FLERR,"Using fix {} without a compute pressure/uef", style); } if (strcmp(temperature->style,"temp/uef") != 0) - error->all(FLERR,"Using fix nvt/npt/uef without a compute temp/uef"); + error->all(FLERR,"Using fix {} without a compute temp/uef", style); } /* ---------------------------------------------------------------------- From bc6031cd24b76fc28ef150f894177003185c7eff Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 13 Nov 2023 14:53:45 -0700 Subject: [PATCH 353/417] Fix bug in Kokkos minimize + fix deform --- src/KOKKOS/npair_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 45ec83e90e..44e9e355b9 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -113,7 +113,7 @@ void NPairKokkos::copy_stencil_info() NPair::copy_stencil_info(); nstencil = ns->nstencil; - if (ns->last_stencil != last_stencil_old) { + if (ns->last_stencil != last_stencil_old || ns->last_stencil == update->ntimestep) { // copy stencil to device as it may have changed last_stencil_old = ns->last_stencil; From d88ffeea3fb64bc770f8ac63ee0283ec0e7f8f3a Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 13 Nov 2023 14:58:48 -0700 Subject: [PATCH 354/417] Need force_clear for atom_vec_spin_kokkos --- src/KOKKOS/atom_vec_spin_kokkos.cpp | 32 +++++++++++++++++++++++++++++ src/KOKKOS/atom_vec_spin_kokkos.h | 1 + src/KOKKOS/min_kokkos.cpp | 18 ++++++++++------ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/atom_vec_spin_kokkos.cpp b/src/KOKKOS/atom_vec_spin_kokkos.cpp index f5b8697352..9de02c3b28 100644 --- a/src/KOKKOS/atom_vec_spin_kokkos.cpp +++ b/src/KOKKOS/atom_vec_spin_kokkos.cpp @@ -586,6 +586,38 @@ int AtomVecSpinKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int n } } +/* ---------------------------------------------------------------------- + clear extra forces starting at atom N + nbytes = # of bytes to clear for a per-atom vector + include f b/c this is invoked from within SPIN pair styles +------------------------------------------------------------------------- */ + +void AtomVecSpinKokkos::force_clear(int n, size_t nbytes) +{ + int nzero = nbytes/sizeof(double); + + if (nzero) { + atomKK->k_fm.clear_sync_state(); // will be cleared below + atomKK->k_fm_long.clear_sync_state(); // will be cleared below + + // local variables for lambda capture + + auto l_fm = atomKK->k_fm.d_view; + auto l_fm_long = atomKK->k_fm_long.d_view; + + Kokkos::parallel_for(nzero, LAMMPS_LAMBDA(int i) { + l_fm(i,0) = 0.0; + l_fm(i,1) = 0.0; + l_fm(i,2) = 0.0; + l_fm_long(i,0) = 0.0; + l_fm_long(i,1) = 0.0; + l_fm_long(i,2) = 0.0; + }); + + atomKK->modified(Device,FM_MASK|FML_MASK); + } +} + /* ---------------------------------------------------------------------- */ void AtomVecSpinKokkos::sync(ExecutionSpace space, unsigned int mask) diff --git a/src/KOKKOS/atom_vec_spin_kokkos.h b/src/KOKKOS/atom_vec_spin_kokkos.h index d14d01fb62..f0145e4db7 100644 --- a/src/KOKKOS/atom_vec_spin_kokkos.h +++ b/src/KOKKOS/atom_vec_spin_kokkos.h @@ -34,6 +34,7 @@ class AtomVecSpinKokkos : public AtomVecKokkos, public AtomVecSpin { AtomVecSpinKokkos(class LAMMPS *); void grow(int) override; void grow_pointers() override; + void force_clear(int, size_t) override; void sort_kokkos(Kokkos::BinSort &Sorter) override; int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, diff --git a/src/KOKKOS/min_kokkos.cpp b/src/KOKKOS/min_kokkos.cpp index bbb9a0bd6e..c01a53c7b3 100644 --- a/src/KOKKOS/min_kokkos.cpp +++ b/src/KOKKOS/min_kokkos.cpp @@ -72,8 +72,7 @@ void MinKokkos::init() void MinKokkos::setup(int flag) { if (comm->me == 0 && screen) { - fmt::print(screen,"Setting up {} style minimization ...\n", - update->minimize_style); + fmt::print(screen,"Setting up {} style minimization ...\n", update->minimize_style); if (flag) { fmt::print(screen," Unit style : {}\n", update->unit_style); fmt::print(screen," Current step : {}\n", update->ntimestep); @@ -92,14 +91,13 @@ void MinKokkos::setup(int flag) fextra = new double[nextra_global]; if (comm->me == 0) error->warning(FLERR, "Energy due to {} extra global DOFs will" - " be included in minimizer energies\n", nextra_global); + " be included in minimizer energies\n",nextra_global); } // compute for potential energy - int id = modify->find_compute("thermo_pe"); - if (id < 0) error->all(FLERR,"Minimization could not find thermo_pe compute"); - pe_compute = modify->compute[id]; + pe_compute = modify->get_compute_by_id("thermo_pe"); + if (!pe_compute) error->all(FLERR,"Minimization could not find thermo_pe compute"); // style-specific setup does two tasks // setup extra global dof vectors @@ -537,6 +535,7 @@ double MinKokkos::energy_force(int resetflag) if (resetflag) fix_minimize_kk->reset_coords(); reset_vectors(); } + return energy; } @@ -575,7 +574,14 @@ void MinKokkos::force_clear() l_torque(i,2) = 0.0; } }); + + if (extraflag) { + size_t nbytes = sizeof(double) * atom->nlocal; + if (force->newton) nbytes += sizeof(double) * atom->nghost; + atom->avec->force_clear(0,nbytes); + } } + atomKK->modified(Device,F_MASK|TORQUE_MASK); } From e6485002adf4209f5a217736c2707f4be8eaeef8 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 13 Nov 2023 15:08:49 -0700 Subject: [PATCH 355/417] Avoid integer division --- src/KOKKOS/atom_vec_spin_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/atom_vec_spin_kokkos.cpp b/src/KOKKOS/atom_vec_spin_kokkos.cpp index 9de02c3b28..d2dd3a05ab 100644 --- a/src/KOKKOS/atom_vec_spin_kokkos.cpp +++ b/src/KOKKOS/atom_vec_spin_kokkos.cpp @@ -594,7 +594,7 @@ int AtomVecSpinKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int n void AtomVecSpinKokkos::force_clear(int n, size_t nbytes) { - int nzero = nbytes/sizeof(double); + int nzero = (double)nbytes/sizeof(double); if (nzero) { atomKK->k_fm.clear_sync_state(); // will be cleared below From bcfbea99038232a16632ee613ae041a60c970aed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Nov 2023 08:03:15 -0500 Subject: [PATCH 356/417] throw error for illegal replication values --- src/replicate.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index 01cc1faabb..6a4c8bfd74 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -52,8 +52,11 @@ void Replicate::command(int narg, char **arg) int nx = utils::inumeric(FLERR,arg[0],false,lmp); int ny = utils::inumeric(FLERR,arg[1],false,lmp); int nz = utils::inumeric(FLERR,arg[2],false,lmp); - int nrep = nx*ny*nz; + if ((nx <= 0) || (ny <= 0) || (nz <= 0)) + error->all(FLERR, "Illegal replication grid {}x{}x{}. All replications must be > 0", + nx, ny, nz); + int nrep = nx*ny*nz; if (me == 0) utils::logmesg(lmp, "Replication is creating a {}x{}x{} = {} times larger system...\n", nx, ny, nz, nrep); From aec22660646b767550ba8a2803cdac3d7b5de4c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Nov 2023 09:43:02 -0500 Subject: [PATCH 357/417] fix typo --- src/SHOCK/fix_nphug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SHOCK/fix_nphug.cpp b/src/SHOCK/fix_nphug.cpp index 3cad719c35..b4b4a866b6 100644 --- a/src/SHOCK/fix_nphug.cpp +++ b/src/SHOCK/fix_nphug.cpp @@ -162,7 +162,7 @@ void FixNPHug::init() // set pe ptr pe = modify->get_compute_by_id(id_pe); - if (pe) + if (!pe) error->all(FLERR, "Potential energy compute ID {} for fix {} does not exist", id_pe, style); } From b3265729169f0d24c94b6c8a571b671627b872ae Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 15 Nov 2023 09:49:58 -0500 Subject: [PATCH 358/417] flag input errors --- src/REPLICA/fix_pimd_langevin.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index cffaf327e4..fd19e804e7 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -455,7 +455,12 @@ void FixPIMDLangevin::init() langevin_init(); c_pe = modify->get_compute_by_id(id_pe); + if (!c_pe) + error->universe_all(FLERR, fmt::format("Could not find fix {} potential energy compute ID {}", style, id_pe)); + c_press = modify->get_compute_by_id(id_press); + if (!c_press) + error->universe_all(FLERR, fmt::format("Could not find fix {} pressure compute ID {}", style, id_press)); t_prim = t_vir = t_cv = p_prim = p_vir = p_cv = p_md = 0.0; } From 1f509d900e7428970c2e2a140383ab45050203e6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 16 Nov 2023 11:57:33 -0500 Subject: [PATCH 359/417] make output more consistent with other LAMMPS code --- src/REPLICA/fix_pimd_langevin.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/REPLICA/fix_pimd_langevin.cpp b/src/REPLICA/fix_pimd_langevin.cpp index d328420ce9..2974359c33 100644 --- a/src/REPLICA/fix_pimd_langevin.cpp +++ b/src/REPLICA/fix_pimd_langevin.cpp @@ -419,10 +419,10 @@ int FixPIMDLangevin::setmask() void FixPIMDLangevin::init() { if (atom->map_style == Atom::MAP_NONE) - error->all(FLERR, "fix pimd/langevin requires an atom map, see atom_modify"); + error->all(FLERR, "Fix pimd/langevin requires an atom map, see atom_modify"); if (universe->me == 0 && universe->uscreen) - fprintf(universe->uscreen, "fix pimd/langevin initializing Path-Integral ...\n"); + fprintf(universe->uscreen, "Fix pimd/langevin: initializing Path-Integral ...\n"); // prepare the constants @@ -446,7 +446,7 @@ void FixPIMDLangevin::init() if ((universe->me == 0) && (universe->uscreen)) fprintf(universe->uscreen, - "fix pimd/langevin -P/(beta^2 * hbar^2) = %20.7lE (kcal/mol/A^2)\n\n", fbond); + "Fix pimd/langevin: -P/(beta^2 * hbar^2) = %20.7lE (kcal/mol/A^2)\n\n", fbond); if (integrator == OBABO) { dtf = 0.5 * update->dt * force->ftm2v; @@ -899,8 +899,8 @@ void FixPIMDLangevin::baro_init() } Vcoeff = 1.0; std::string out = fmt::format("\nInitializing PIMD {:s} barostat...\n", Barostats[barostat]); - out += fmt::format("The barostat mass is W = {:.16e}\n", W); - utils::logmesg(lmp, out); + out += fmt::format(" The barostat mass is W = {:.16e}\n", W); + if (universe->me == 0) utils::logmesg(lmp, out); } /* ---------------------------------------------------------------------- */ @@ -1017,8 +1017,8 @@ void FixPIMDLangevin::langevin_init() c2 = sqrt(1.0 - c1 * c1); // note that c1 and c2 here only works for the centroid mode. if (thermostat == PILE_L) { - std::string out = "\nInitializing PI Langevin equation thermostat...\n"; - out += "Bead ID | omega | tau | c1 | c2\n"; + std::string out = "Initializing PI Langevin equation thermostat...\n"; + out += " Bead ID | omega | tau | c1 | c2\n"; if (method == NMPIMD) { tau_k = new double[np]; c1_k = new double[np]; @@ -1039,18 +1039,18 @@ void FixPIMDLangevin::langevin_init() c2_k[i] = sqrt(1.0 - c1_k[i] * c1_k[i]); } for (int i = 0; i < np; i++) { - out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_k[i], tau_k[i], - c1_k[i], c2_k[i]); + out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, + _omega_k[i], tau_k[i], c1_k[i], c2_k[i]); } } else if (method == PIMD) { for (int i = 0; i < np; i++) { - out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, _omega_np / sqrt(fmass), - tau, c1, c2); + out += fmt::format(" {:d} {:.8e} {:.8e} {:.8e} {:.8e}\n", i, + _omega_np / sqrt(fmass), tau, c1, c2); } } - if (thermostat == PILE_L) out += "PILE_L thermostat successfully initialized!\n"; + if (thermostat == PILE_L) out += " PILE_L thermostat successfully initialized!\n"; out += "\n"; - utils::logmesg(lmp, out); + if (universe->me == 0) utils::logmesg(lmp, out); } } From 7f2a6b1a8585323d7eb1419f2bd46ef7074359b0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 16 Nov 2023 12:00:29 -0500 Subject: [PATCH 360/417] update h2 fix pimd/langevin example --- .../langevin_metal_units/in.langevin.metal | 28 +++++ .../{in.lmp => in.pimd-langevin.metal} | 2 +- ...tal.g++ => log.16Nov23.langevin.metal.g++} | 2 +- ...g++.0 => log.16Nov23.langevin.metal.g++.0} | 60 +++++----- ...g++.1 => log.16Nov23.langevin.metal.g++.1} | 59 ++++------ ...g++.2 => log.16Nov23.langevin.metal.g++.2} | 59 ++++------ ...g++.3 => log.16Nov23.langevin.metal.g++.3} | 57 ++++------ .../log.16Nov23.pimd-langevin.metal.g++ | 2 + .../log.16Nov23.pimd-langevin.metal.g++.0 | 103 ++++++++++++++++++ .../log.16Nov23.pimd-langevin.metal.g++.1 | 95 ++++++++++++++++ .../log.16Nov23.pimd-langevin.metal.g++.2 | 95 ++++++++++++++++ .../log.16Nov23.pimd-langevin.metal.g++.3 | 95 ++++++++++++++++ .../PACKAGES/pimd/langevin_metal_units/run.sh | 4 +- 13 files changed, 524 insertions(+), 137 deletions(-) create mode 100644 examples/PACKAGES/pimd/langevin_metal_units/in.langevin.metal rename examples/PACKAGES/pimd/langevin_metal_units/{in.lmp => in.pimd-langevin.metal} (80%) rename examples/PACKAGES/pimd/langevin_metal_units/{log.14Jun23.langevin.metal.g++ => log.16Nov23.langevin.metal.g++} (64%) rename examples/PACKAGES/pimd/langevin_metal_units/{log.14Jun23.langevin.metal.g++.0 => log.16Nov23.langevin.metal.g++.0} (70%) rename examples/PACKAGES/pimd/langevin_metal_units/{log.14Jun23.langevin.metal.g++.1 => log.16Nov23.langevin.metal.g++.1} (70%) rename examples/PACKAGES/pimd/langevin_metal_units/{log.14Jun23.langevin.metal.g++.2 => log.16Nov23.langevin.metal.g++.2} (70%) rename examples/PACKAGES/pimd/langevin_metal_units/{log.14Jun23.langevin.metal.g++.3 => log.16Nov23.langevin.metal.g++.3} (70%) create mode 100644 examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++ create mode 100644 examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.0 create mode 100644 examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.1 create mode 100644 examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.2 create mode 100644 examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.3 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/in.langevin.metal b/examples/PACKAGES/pimd/langevin_metal_units/in.langevin.metal new file mode 100644 index 0000000000..071b4ad722 --- /dev/null +++ b/examples/PACKAGES/pimd/langevin_metal_units/in.langevin.metal @@ -0,0 +1,28 @@ +variable ibead uloop 99 pad + +units metal +atom_style atomic +atom_modify map yes +boundary p p p +pair_style lj/cut 9.5251 +read_data data.metalnpt${ibead} + +pair_coeff * * 0.00965188 3.4 +pair_modify shift yes + +mass 1 39.948 + +timestep 0.001 + +velocity all create 0.0 ${ibead} + +fix 1 all pimd/langevin method nmpimd ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no + +thermo_style custom step temp f_1[*] vol press +thermo 100 +thermo_modify norm no + +# dump dcd all custom 100 ${ibead}.dcd id type xu yu zu vx vy vz ix iy iz fx fy fz +# dump_modify dcd sort id format line "%d %d %.16f %.16f %.16f %.16f %.16f %.16f %d %d %d %.16f %.16f %.16f" + +run 1000 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/in.lmp b/examples/PACKAGES/pimd/langevin_metal_units/in.pimd-langevin.metal similarity index 80% rename from examples/PACKAGES/pimd/langevin_metal_units/in.lmp rename to examples/PACKAGES/pimd/langevin_metal_units/in.pimd-langevin.metal index 124063df99..4d1416063c 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/in.lmp +++ b/examples/PACKAGES/pimd/langevin_metal_units/in.pimd-langevin.metal @@ -16,7 +16,7 @@ timestep 0.001 velocity all create 0.0 ${ibead} -fix 1 all pimd/langevin ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no +fix 1 all pimd/langevin method pimd ensemble nvt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 taup 1.0 fixcom no thermo_style custom step temp f_1[*] vol press thermo 100 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++ similarity index 64% rename from examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++ rename to examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++ index fa22106766..a05d2d9aa8 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++ +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++ @@ -1,2 +1,2 @@ -LAMMPS (28 Mar 2023) +LAMMPS (3 Aug 2023) Running on 4 partitions of processors diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.0 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.0 similarity index 70% rename from examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.0 rename to examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.0 index 00787df8ba..c34bf8e7dd 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.0 +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.0 @@ -1,5 +1,6 @@ -LAMMPS (28 Mar 2023) +LAMMPS (3 Aug 2023) Processor partition = 0 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task variable ibead uloop 99 pad @@ -29,10 +30,10 @@ timestep 0.001 velocity all create 0.0 ${ibead} velocity all create 0.0 01 -fix 1 all pimd/langevin ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no +fix 1 all pimd/langevin method nmpimd ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no Initializing PIMD BZP barostat... -The barostat mass is W = 2.3401256650800001e+01 + The barostat mass is W = 2.3401256650800001e+01 thermo_style custom step temp f_1[*] vol press thermo 100 @@ -43,14 +44,13 @@ thermo_modify norm no run 1000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule - Initializing PI Langevin equation thermostat... -Bead ID | omega | tau | c1 | c2 - 0 0.00000000e+00 1.00000000e+00 9.99500125e-01 3.16148726e-02 - 1 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 - 2 1.18509233e+02 4.21908054e-03 8.88243614e-01 4.59372705e-01 - 3 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 -PILE_L thermostat successfully initialized! + Bead ID | omega | tau | c1 | c2 + 0 0.00000000e+00 1.00000000e+00 9.99500125e-01 3.16148726e-02 + 1 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 + 2 1.18509233e+02 4.21908054e-03 8.88243614e-01 4.59372705e-01 + 3 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 + PILE_L thermostat successfully initialized! Neighbor list info ... update: every = 1 steps, delay = 0 steps, check = yes @@ -66,31 +66,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] f_1[11] f_1[12] f_1[13] f_1[14] f_1[15] Volume Press - 0 0 0 0 -7.3046601 4.3005229 -21.877018 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -164.47373 - 100 149.95804 3.8573359 0 -7.7921375 42.886648 -23.396327 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 -101.30374 - 200 245.00113 6.3021074 0 -8.2639651 41.690123 -22.521598 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 112.22426 - 300 300.57486 7.7316177 0 -8.2986331 43.180131 -21.755813 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 814.45889 - 400 368.08438 9.4681493 0 -8.4800193 49.109699 -24.824142 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1202.0398 - 500 419.32066 10.786088 0 -8.640773 45.427771 -22.825143 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 952.59748 - 600 385.4127 9.9138817 0 -8.4356035 47.783726 -22.456104 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 676.62913 - 700 360.14242 9.2638601 0 -8.2900275 42.626187 -20.571698 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 456.91446 - 800 346.92167 8.923786 0 -8.0694169 45.160336 -21.885719 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 454.60123 - 900 364.39442 9.3732334 0 -8.0415668 45.604542 -21.816625 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 499.75868 - 1000 390.77042 10.051697 0 -8.1948009 45.264242 -22.833545 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 572.98799 -Loop time of 0.248186 on 1 procs for 1000 steps with 200 atoms + 0 0 0 0 -7.3046601 4.3005229 3.3062167 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -164.47373 + 100 149.95804 3.8573359 0 -7.7921375 42.886648 2.9263894 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 -101.30374 + 200 245.00113 6.3021074 0 -8.2639651 41.690123 3.1450717 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 112.22426 + 300 300.57486 7.7316177 0 -8.2986331 43.180131 3.336518 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 814.45889 + 400 368.08438 9.4681493 0 -8.4800193 49.109699 2.5694358 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1202.0398 + 500 419.32066 10.786088 0 -8.640773 45.427771 3.0691855 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 952.59748 + 600 385.4127 9.9138817 0 -8.4356035 47.783726 3.1614452 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 676.62913 + 700 360.14242 9.2638601 0 -8.2900275 42.626187 3.6325468 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 456.91446 + 800 346.92167 8.923786 0 -8.0694169 45.160336 3.3040415 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 454.60123 + 900 364.39442 9.3732334 0 -8.0415668 45.604542 3.321315 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 499.75868 + 1000 390.77042 10.051697 0 -8.1948009 45.264242 3.0670849 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 572.98799 +Loop time of 0.218442 on 1 procs for 1000 steps with 200 atoms -Performance: 348.126 ns/day, 0.069 hours/ns, 4029.238 timesteps/s, 805.848 katom-step/s -99.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 395.527 ns/day, 0.061 hours/ns, 4577.865 timesteps/s, 915.573 katom-step/s +98.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.14541 | 0.14541 | 0.14541 | 0.0 | 58.59 -Neigh | 0.00099082 | 0.00099082 | 0.00099082 | 0.0 | 0.40 -Comm | 0.0039966 | 0.0039966 | 0.0039966 | 0.0 | 1.61 -Output | 0.00016346 | 0.00016346 | 0.00016346 | 0.0 | 0.07 -Modify | 0.096205 | 0.096205 | 0.096205 | 0.0 | 38.76 -Other | | 0.001425 | | | 0.57 +Pair | 0.11918 | 0.11918 | 0.11918 | 0.0 | 54.56 +Neigh | 0.0010314 | 0.0010314 | 0.0010314 | 0.0 | 0.47 +Comm | 0.0046197 | 0.0046197 | 0.0046197 | 0.0 | 2.11 +Output | 0.0001329 | 0.0001329 | 0.0001329 | 0.0 | 0.06 +Modify | 0.092616 | 0.092616 | 0.092616 | 0.0 | 42.40 +Other | | 0.0008616 | | | 0.39 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.1 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.1 similarity index 70% rename from examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.1 rename to examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.1 index 83821cafb7..58f4695d46 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.1 +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.1 @@ -1,5 +1,6 @@ -LAMMPS (28 Mar 2023) +LAMMPS (3 Aug 2023) Processor partition = 1 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task variable ibead uloop 99 pad @@ -17,7 +18,7 @@ Reading data file ... 200 atoms reading velocities ... 200 velocities - read_data CPU = 0.001 seconds + read_data CPU = 0.002 seconds pair_coeff * * 0.00965188 3.4 pair_modify shift yes @@ -29,10 +30,7 @@ timestep 0.001 velocity all create 0.0 ${ibead} velocity all create 0.0 02 -fix 1 all pimd/langevin ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no - -Initializing PIMD BZP barostat... -The barostat mass is W = 2.3401256650800001e+01 +fix 1 all pimd/langevin method nmpimd ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no thermo_style custom step temp f_1[*] vol press thermo 100 @@ -43,15 +41,6 @@ thermo_modify norm no run 1000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule - -Initializing PI Langevin equation thermostat... -Bead ID | omega | tau | c1 | c2 - 0 0.00000000e+00 1.00000000e+00 9.99500125e-01 3.16148726e-02 - 1 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 - 2 1.18509233e+02 4.21908054e-03 8.88243614e-01 4.59372705e-01 - 3 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 -PILE_L thermostat successfully initialized! - Neighbor list info ... update: every = 1 steps, delay = 0 steps, check = yes max neighbors/atom: 2000, page size: 100000 @@ -66,31 +55,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] f_1[11] f_1[12] f_1[13] f_1[14] f_1[15] Volume Press - 0 0 0 11.920908 -7.3063682 4.3005229 -21.877018 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -167.65544 - 100 483.61933 12.440028 11.405863 -7.7749671 42.886648 -23.396327 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 606.14668 - 200 452.03836 11.627678 11.47094 -8.2534927 41.690123 -22.521598 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 583.5476 - 300 470.25997 12.096389 11.739306 -8.3750153 43.180131 -21.755813 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 1152.6851 - 400 459.46597 11.818737 12.502421 -8.5240576 49.109699 -24.824142 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1381.0251 - 500 442.73121 11.388273 11.19396 -8.6488583 45.427771 -22.825143 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 1000.6119 - 600 493.47034 12.693424 11.91335 -8.4625706 47.783726 -22.456104 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 904.52944 - 700 470.04548 12.090871 10.348757 -8.278182 42.626187 -20.571698 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 715.22796 - 800 458.04928 11.782296 11.152029 -8.0926613 45.160336 -21.885719 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 678.21261 - 900 468.60547 12.05383 10.937315 -8.0319335 45.604542 -21.816625 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 735.24377 - 1000 427.44192 10.99499 11.916587 -8.2229199 45.264242 -22.833545 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 637.98311 -Loop time of 0.248186 on 1 procs for 1000 steps with 200 atoms + 0 0 0 11.920908 -7.3063682 4.3005229 3.3062167 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -167.65544 + 100 483.61933 12.440028 11.405863 -7.7749671 42.886648 2.9263894 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 606.14668 + 200 452.03836 11.627678 11.47094 -8.2534927 41.690123 3.1450717 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 583.5476 + 300 470.25997 12.096389 11.739306 -8.3750153 43.180131 3.336518 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 1152.6851 + 400 459.46597 11.818737 12.502421 -8.5240576 49.109699 2.5694358 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1381.0251 + 500 442.73121 11.388273 11.19396 -8.6488583 45.427771 3.0691855 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 1000.6119 + 600 493.47034 12.693424 11.91335 -8.4625706 47.783726 3.1614452 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 904.52944 + 700 470.04548 12.090871 10.348757 -8.278182 42.626187 3.6325468 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 715.22796 + 800 458.04928 11.782296 11.152029 -8.0926613 45.160336 3.3040415 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 678.21261 + 900 468.60547 12.05383 10.937315 -8.0319335 45.604542 3.321315 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 735.24377 + 1000 427.44192 10.99499 11.916587 -8.2229199 45.264242 3.0670849 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 637.98311 +Loop time of 0.218435 on 1 procs for 1000 steps with 200 atoms -Performance: 348.126 ns/day, 0.069 hours/ns, 4029.238 timesteps/s, 805.848 katom-step/s -99.5% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 395.541 ns/day, 0.061 hours/ns, 4578.021 timesteps/s, 915.604 katom-step/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.14654 | 0.14654 | 0.14654 | 0.0 | 59.04 -Neigh | 0.00099986 | 0.00099986 | 0.00099986 | 0.0 | 0.40 -Comm | 0.0041628 | 0.0041628 | 0.0041628 | 0.0 | 1.68 -Output | 0.00018019 | 0.00018019 | 0.00018019 | 0.0 | 0.07 -Modify | 0.094878 | 0.094878 | 0.094878 | 0.0 | 38.23 -Other | | 0.001424 | | | 0.57 +Pair | 0.11791 | 0.11791 | 0.11791 | 0.0 | 53.98 +Neigh | 0.0010247 | 0.0010247 | 0.0010247 | 0.0 | 0.47 +Comm | 0.0035577 | 0.0035577 | 0.0035577 | 0.0 | 1.63 +Output | 0.00011003 | 0.00011003 | 0.00011003 | 0.0 | 0.05 +Modify | 0.09496 | 0.09496 | 0.09496 | 0.0 | 43.47 +Other | | 0.0008711 | | | 0.40 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.2 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.2 similarity index 70% rename from examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.2 rename to examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.2 index fd8dd409ae..0b76ce5bbc 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.2 +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.2 @@ -1,5 +1,6 @@ -LAMMPS (28 Mar 2023) +LAMMPS (3 Aug 2023) Processor partition = 2 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task variable ibead uloop 99 pad @@ -17,7 +18,7 @@ Reading data file ... 200 atoms reading velocities ... 200 velocities - read_data CPU = 0.001 seconds + read_data CPU = 0.002 seconds pair_coeff * * 0.00965188 3.4 pair_modify shift yes @@ -29,10 +30,7 @@ timestep 0.001 velocity all create 0.0 ${ibead} velocity all create 0.0 03 -fix 1 all pimd/langevin ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no - -Initializing PIMD BZP barostat... -The barostat mass is W = 2.3401256650800001e+01 +fix 1 all pimd/langevin method nmpimd ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no thermo_style custom step temp f_1[*] vol press thermo 100 @@ -43,15 +41,6 @@ thermo_modify norm no run 1000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule - -Initializing PI Langevin equation thermostat... -Bead ID | omega | tau | c1 | c2 - 0 0.00000000e+00 1.00000000e+00 9.99500125e-01 3.16148726e-02 - 1 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 - 2 1.18509233e+02 4.21908054e-03 8.88243614e-01 4.59372705e-01 - 3 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 -PILE_L thermostat successfully initialized! - Neighbor list info ... update: every = 1 steps, delay = 0 steps, check = yes max neighbors/atom: 2000, page size: 100000 @@ -66,31 +55,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] f_1[11] f_1[12] f_1[13] f_1[14] f_1[15] Volume Press - 0 0 0 10.862314 -7.320388 4.3005229 -21.877018 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -175.34503 - 100 455.18121 11.708521 11.48472 -7.8033686 42.886648 -23.396327 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 526.41632 - 200 460.81997 11.853566 10.817157 -8.2276485 41.690123 -22.521598 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 615.80924 - 300 481.48652 12.385166 10.035423 -8.3866916 43.180131 -21.755813 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 1169.2917 - 400 487.3584 12.536208 11.766522 -8.3643382 49.109699 -24.824142 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1574.1427 - 500 446.36019 11.48162 12.144202 -8.680266 45.427771 -22.825143 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 979.68395 - 600 500.3783 12.871115 11.075008 -8.47833 47.783726 -22.456104 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 912.39361 - 700 435.40634 11.199857 10.923558 -8.3090105 42.626187 -20.571698 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 617.20857 - 800 446.82793 11.493652 11.599712 -8.0900498 45.160336 -21.885719 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 652.13243 - 900 448.28506 11.531133 12.130739 -8.0810557 45.604542 -21.816625 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 674.68073 - 1000 440.94913 11.342433 10.765654 -8.1419484 45.264242 -22.833545 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 730.67128 -Loop time of 0.248185 on 1 procs for 1000 steps with 200 atoms + 0 0 0 10.862314 -7.320388 4.3005229 3.3062167 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -175.34503 + 100 455.18121 11.708521 11.48472 -7.8033686 42.886648 2.9263894 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 526.41632 + 200 460.81997 11.853566 10.817157 -8.2276485 41.690123 3.1450717 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 615.80924 + 300 481.48652 12.385166 10.035423 -8.3866916 43.180131 3.336518 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 1169.2917 + 400 487.3584 12.536208 11.766522 -8.3643382 49.109699 2.5694358 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1574.1427 + 500 446.36019 11.48162 12.144202 -8.680266 45.427771 3.0691855 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 979.68395 + 600 500.3783 12.871115 11.075008 -8.47833 47.783726 3.1614452 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 912.39361 + 700 435.40634 11.199857 10.923558 -8.3090105 42.626187 3.6325468 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 617.20857 + 800 446.82793 11.493652 11.599712 -8.0900498 45.160336 3.3040415 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 652.13243 + 900 448.28506 11.531133 12.130739 -8.0810557 45.604542 3.321315 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 674.68073 + 1000 440.94913 11.342433 10.765654 -8.1419484 45.264242 3.0670849 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 730.67128 +Loop time of 0.218435 on 1 procs for 1000 steps with 200 atoms -Performance: 348.128 ns/day, 0.069 hours/ns, 4029.259 timesteps/s, 805.852 katom-step/s -97.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 395.541 ns/day, 0.061 hours/ns, 4578.019 timesteps/s, 915.604 katom-step/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.14702 | 0.14702 | 0.14702 | 0.0 | 59.24 -Neigh | 0.0010003 | 0.0010003 | 0.0010003 | 0.0 | 0.40 -Comm | 0.0039821 | 0.0039821 | 0.0039821 | 0.0 | 1.60 -Output | 0.00023527 | 0.00023527 | 0.00023527 | 0.0 | 0.09 -Modify | 0.094519 | 0.094519 | 0.094519 | 0.0 | 38.08 -Other | | 0.001427 | | | 0.58 +Pair | 0.12079 | 0.12079 | 0.12079 | 0.0 | 55.30 +Neigh | 0.0010224 | 0.0010224 | 0.0010224 | 0.0 | 0.47 +Comm | 0.0035478 | 0.0035478 | 0.0035478 | 0.0 | 1.62 +Output | 0.00010889 | 0.00010889 | 0.00010889 | 0.0 | 0.05 +Modify | 0.092098 | 0.092098 | 0.092098 | 0.0 | 42.16 +Other | | 0.0008684 | | | 0.40 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.3 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.3 similarity index 70% rename from examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.3 rename to examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.3 index 423ebb7d63..25578a068c 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/log.14Jun23.langevin.metal.g++.3 +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.langevin.metal.g++.3 @@ -1,5 +1,6 @@ -LAMMPS (28 Mar 2023) +LAMMPS (3 Aug 2023) Processor partition = 3 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task variable ibead uloop 99 pad @@ -29,10 +30,7 @@ timestep 0.001 velocity all create 0.0 ${ibead} velocity all create 0.0 04 -fix 1 all pimd/langevin ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no - -Initializing PIMD BZP barostat... -The barostat mass is W = 2.3401256650800001e+01 +fix 1 all pimd/langevin method nmpimd ensemble npt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 iso 1.0 barostat BZP taup 1.0 fixcom no thermo_style custom step temp f_1[*] vol press thermo 100 @@ -43,15 +41,6 @@ thermo_modify norm no run 1000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule - -Initializing PI Langevin equation thermostat... -Bead ID | omega | tau | c1 | c2 - 0 0.00000000e+00 1.00000000e+00 9.99500125e-01 3.16148726e-02 - 1 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 - 2 1.18509233e+02 4.21908054e-03 8.88243614e-01 4.59372705e-01 - 3 8.37986825e+01 5.96668092e-03 9.19616372e-01 3.92817678e-01 -PILE_L thermostat successfully initialized! - Neighbor list info ... update: every = 1 steps, delay = 0 steps, check = yes max neighbors/atom: 2000, page size: 100000 @@ -66,31 +55,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] f_1[11] f_1[12] f_1[13] f_1[14] f_1[15] Volume Press - 0 0 0 10.794425 -7.3457072 4.3005229 -21.877018 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -191.02389 - 100 426.01705 10.958338 12.206372 -7.8040582 42.886648 -23.396327 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 464.39271 - 200 414.52703 10.662783 11.934129 -8.2331312 41.690123 -22.521598 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 502.87052 - 300 424.85622 10.928478 11.681713 -8.357621 43.180131 -21.755813 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 1058.1162 - 400 485.80103 12.496148 12.255827 -8.3658975 49.109699 -24.824142 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1570.2486 - 500 462.99006 11.909386 11.187609 -8.6934698 45.427771 -22.825143 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 1014.2134 - 600 465.24407 11.967366 11.168375 -8.4422887 47.783726 -22.456104 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 864.12413 - 700 426.16111 10.962044 11.000011 -8.2855512 42.626187 -20.571698 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 614.76939 - 800 454.53159 11.691811 10.834606 -8.0654281 45.160336 -21.885719 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 684.85907 - 900 441.72064 11.362278 10.4492 -8.0786302 45.604542 -21.816625 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 659.68525 - 1000 429.90929 11.058457 11.851933 -8.1578394 45.264242 -22.833545 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 698.73278 -Loop time of 0.248175 on 1 procs for 1000 steps with 200 atoms + 0 0 0 10.794425 -7.3457072 4.3005229 3.3062167 -8.7249482 2.9571502 -1743.5332 -698.49808 -172.07477 0 0 0.033460054 -0.37064378 4.216227 13402.228 -191.02389 + 100 426.01705 10.958338 12.206372 -7.8040582 42.886648 2.9263894 -1.980193 2.954003 -1888.0547 -1648.7118 -332.0298 -0.099139345 0.11500091 0.033044702 -0.3701566 42.83112 13235.861 464.39271 + 200 414.52703 10.662783 11.934129 -8.2331312 41.690123 3.1450717 -4.273021 2.9600599 -1906.2904 -1609.02 -265.94404 -0.20527926 0.49305948 0.031504957 -0.36829556 41.729191 12619.125 502.87052 + 300 424.85622 10.928478 11.681713 -8.357621 43.180131 3.336518 -7.7032433 2.9714114 -1968.7685 290.49656 251.72564 -0.21935745 0.56300721 0.029467915 -0.36568855 43.236828 11803.2 1058.1162 + 400 485.80103 12.496148 12.255827 -8.3658975 49.109699 2.5694358 2.9744597 2.9794185 -2335.993 1368.7398 570.03286 -0.028366234 0.0094148316 0.028338146 -0.36416383 49.028096 11350.678 1570.2486 + 500 462.99006 11.909386 11.187609 -8.6934698 45.427771 3.0691855 16.22356 2.9684828 -2113.91 -272.84753 185.53392 0.091614289 0.098205455 0.028793585 -0.36478567 45.368325 11533.101 1014.2134 + 600 465.24407 11.967366 11.168375 -8.4422887 47.783726 3.1614452 6.837575 2.967236 -2023.8117 -918.27943 -2.4106994 0.093360761 0.10198539 0.029589188 -0.36584873 47.725157 11851.775 864.12413 + 700 426.16111 10.962044 11.000011 -8.2855512 42.626187 3.6325468 -5.7252564 2.9560528 -1806.9448 -1418.2247 -148.41657 0.075011202 0.065835696 0.030359455 -0.36685105 42.558523 12160.301 614.76939 + 800 454.53159 11.691811 10.834606 -8.0654281 45.160336 3.3040415 -6.7745694 2.9575472 -1894.3641 -1329.3179 -136.42193 0.011114896 0.0014455064 0.030808183 -0.3674233 45.076543 12340.037 684.85907 + 900 441.72064 11.362278 10.4492 -8.0786302 45.604542 3.321315 5.586068 2.9578604 -1890.4653 -1271.1107 -111.89061 -0.020285587 0.0048148677 0.030774258 -0.36738033 45.521594 12326.448 659.68525 + 1000 429.90929 11.058457 11.851933 -8.1578394 45.264242 3.0670849 6.9260573 2.960122 -2007.6188 -1179.7125 -70.907567 -0.062733519 0.046047757 0.030329191 -0.36681215 45.191633 12148.179 698.73278 +Loop time of 0.218441 on 1 procs for 1000 steps with 200 atoms -Performance: 348.141 ns/day, 0.069 hours/ns, 4029.409 timesteps/s, 805.882 katom-step/s -98.1% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 395.530 ns/day, 0.061 hours/ns, 4577.899 timesteps/s, 915.580 katom-step/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.14919 | 0.14919 | 0.14919 | 0.0 | 60.12 -Neigh | 0.00099112 | 0.00099112 | 0.00099112 | 0.0 | 0.40 -Comm | 0.0040992 | 0.0040992 | 0.0040992 | 0.0 | 1.65 -Output | 0.0001723 | 0.0001723 | 0.0001723 | 0.0 | 0.07 -Modify | 0.092299 | 0.092299 | 0.092299 | 0.0 | 37.19 -Other | | 0.00142 | | | 0.57 +Pair | 0.11655 | 0.11655 | 0.11655 | 0.0 | 53.35 +Neigh | 0.0010236 | 0.0010236 | 0.0010236 | 0.0 | 0.47 +Comm | 0.0035622 | 0.0035622 | 0.0035622 | 0.0 | 1.63 +Output | 0.0001071 | 0.0001071 | 0.0001071 | 0.0 | 0.05 +Modify | 0.096348 | 0.096348 | 0.096348 | 0.0 | 44.11 +Other | | 0.0008537 | | | 0.39 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++ new file mode 100644 index 0000000000..a05d2d9aa8 --- /dev/null +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++ @@ -0,0 +1,2 @@ +LAMMPS (3 Aug 2023) +Running on 4 partitions of processors diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.0 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.0 new file mode 100644 index 0000000000..2d9d049a49 --- /dev/null +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.0 @@ -0,0 +1,103 @@ +LAMMPS (3 Aug 2023) +Processor partition = 0 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +variable ibead uloop 99 pad + +units metal +atom_style atomic +atom_modify map yes +boundary p p p +pair_style lj/cut 9.5251 +read_data data.metalnpt${ibead} +read_data data.metalnpt01 +Reading data file ... + orthogonal box = (-11.876697 -11.876697 -11.876697) to (11.876697 11.876697 11.876697) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 200 atoms + reading velocities ... + 200 velocities + read_data CPU = 0.001 seconds + +pair_coeff * * 0.00965188 3.4 +pair_modify shift yes + +mass 1 39.948 + +timestep 0.001 + +velocity all create 0.0 ${ibead} +velocity all create 0.0 01 + +fix 1 all pimd/langevin method pimd ensemble nvt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 taup 1.0 fixcom no + +thermo_style custom step temp f_1[*] vol press +thermo 100 +thermo_modify norm no + +# dump dcd all custom 100 ${ibead}.dcd id type xu yu zu vx vy vz ix iy iz fx fy fz +# dump_modify dcd sort id format line "%d %d %.16f %.16f %.16f %.16f %.16f %.16f %d %d %d %.16f %.16f %.16f" + +run 1000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Initializing PI Langevin equation thermostat... + Bead ID | omega | tau | c1 | c2 + 0 5.92546167e+01 1.00000000e+00 9.99500125e-01 3.16148726e-02 + 1 5.92546167e+01 1.00000000e+00 9.99500125e-01 3.16148726e-02 + 2 5.92546167e+01 1.00000000e+00 9.99500125e-01 3.16148726e-02 + 3 5.92546167e+01 1.00000000e+00 9.99500125e-01 3.16148726e-02 + PILE_L thermostat successfully initialized! + +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 11.5251 + ghost atom cutoff = 11.5251 + binsize = 5.76255, bins = 5 5 5 + 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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes + Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] Volume Press + 0 0 0 8.8893303 -7.3046601 4.3005229 3.3062167 0 0 -1743.5332 0 0 13402.228 -164.47373 + 100 248.24141 6.3854564 4.1458616 -7.7546467 9.6829291 3.3062167 0 0 -1743.5332 0.00061164884 127.22547 13402.228 26.894568 + 200 346.2569 8.9066861 2.6427185 -7.8943744 14.016847 3.3062167 0 0 -1743.5332 0.00088274242 177.45909 13402.228 91.225638 + 300 217.65314 5.5986414 7.0223362 -7.788449 18.162833 3.3062167 0 0 -1743.5332 0.00054181173 111.54876 13402.228 -125.00786 + 400 266.83825 6.8638187 6.2507813 -7.7241546 21.628032 3.3062167 0 0 -1743.5332 0.0007209203 136.75648 13402.228 21.104834 + 500 342.40379 8.8075736 5.1959052 -7.7020799 25.668758 3.3062167 0 0 -1743.5332 0.00087137898 175.48435 13402.228 208.60351 + 600 280.37754 7.2120867 8.0025846 -7.5954127 28.570788 3.3062167 0 0 -1743.5332 0.00072432598 143.69546 13402.228 162.09838 + 700 377.11625 9.700474 6.0049074 -7.5861377 30.034627 3.3062167 0 0 -1743.5332 0.00092377441 193.27472 13402.228 389.35575 + 800 378.36221 9.7325237 6.1704761 -7.6170017 31.447502 3.3062167 0 0 -1743.5332 0.00097254954 193.91329 13402.228 387.71781 + 900 271.99864 6.9965581 9.037081 -7.4781664 32.906719 3.3062167 0 0 -1743.5332 0.00074024142 139.40121 13402.228 266.3664 + 1000 362.4753 9.3238683 8.0266514 -7.4835536 34.914285 3.3062167 0 0 -1743.5332 0.00088800624 185.77114 13402.228 433.67079 +Loop time of 0.166656 on 1 procs for 1000 steps with 200 atoms + +Performance: 518.435 ns/day, 0.046 hours/ns, 6000.401 timesteps/s, 1.200 Matom-step/s +99.5% 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.10478 | 0.10478 | 0.10478 | 0.0 | 62.87 +Neigh | 0.00096007 | 0.00096007 | 0.00096007 | 0.0 | 0.58 +Comm | 0.0035065 | 0.0035065 | 0.0035065 | 0.0 | 2.10 +Output | 0.0001037 | 0.0001037 | 0.0001037 | 0.0 | 0.06 +Modify | 0.056454 | 0.056454 | 0.056454 | 0.0 | 33.87 +Other | | 0.0008515 | | | 0.51 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1360 ave 1360 max 1360 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 9544 ave 9544 max 9544 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9544 +Ave neighs/atom = 47.72 +Neighbor list builds = 4 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.1 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.1 new file mode 100644 index 0000000000..9be069b960 --- /dev/null +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.1 @@ -0,0 +1,95 @@ +LAMMPS (3 Aug 2023) +Processor partition = 1 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +variable ibead uloop 99 pad + +units metal +atom_style atomic +atom_modify map yes +boundary p p p +pair_style lj/cut 9.5251 +read_data data.metalnpt${ibead} +read_data data.metalnpt02 +Reading data file ... + orthogonal box = (-11.876697 -11.876697 -11.876697) to (11.876697 11.876697 11.876697) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 200 atoms + reading velocities ... + 200 velocities + read_data CPU = 0.001 seconds + +pair_coeff * * 0.00965188 3.4 +pair_modify shift yes + +mass 1 39.948 + +timestep 0.001 + +velocity all create 0.0 ${ibead} +velocity all create 0.0 02 + +fix 1 all pimd/langevin method pimd ensemble nvt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 taup 1.0 fixcom no + +thermo_style custom step temp f_1[*] vol press +thermo 100 +thermo_modify norm no + +# dump dcd all custom 100 ${ibead}.dcd id type xu yu zu vx vy vz ix iy iz fx fy fz +# dump_modify dcd sort id format line "%d %d %.16f %.16f %.16f %.16f %.16f %.16f %d %d %d %.16f %.16f %.16f" + +run 1000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 11.5251 + ghost atom cutoff = 11.5251 + binsize = 5.76255, bins = 5 5 5 + 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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes + Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] Volume Press + 0 0 0 8.4854554 -7.3063682 4.3005229 3.3062167 0 0 -1743.5332 0 0 13402.228 -167.65544 + 100 231.55472 5.9562285 3.9188988 -7.7552569 9.6829291 3.3062167 0 0 -1743.5332 0.00061164884 127.22547 13402.228 -9.7693407 + 200 366.33366 9.423116 2.3606144 -7.8893287 14.016847 3.3062167 0 0 -1743.5332 0.00088274242 177.45909 13402.228 131.05061 + 300 213.74457 5.4981021 6.4391043 -7.7947526 18.162833 3.3062167 0 0 -1743.5332 0.00054181173 111.54876 13402.228 -136.92734 + 400 273.60832 7.0379636 5.6777233 -7.7709858 21.628032 3.3062167 0 0 -1743.5332 0.0007209203 136.75648 13402.228 -0.14681392 + 500 338.99655 8.7199299 5.4335645 -7.7194465 25.668758 3.3062167 0 0 -1743.5332 0.00087137898 175.48435 13402.228 190.1705 + 600 298.58126 7.6803369 7.2512164 -7.5741948 28.570788 3.3062167 0 0 -1743.5332 0.00072432598 143.69546 13402.228 226.78095 + 700 352.53291 9.0681226 5.4845895 -7.5875298 30.034627 3.3062167 0 0 -1743.5332 0.00092377441 193.27472 13402.228 335.39327 + 800 389.70585 10.024313 5.143907 -7.6218106 31.447502 3.3062167 0 0 -1743.5332 0.00097254954 193.91329 13402.228 409.36108 + 900 285.3019 7.3387547 7.6228894 -7.5140003 32.906719 3.3062167 0 0 -1743.5332 0.00074024142 139.40121 13402.228 266.93105 + 1000 345.35667 8.8835299 6.9652602 -7.5180013 34.914285 3.3062167 0 0 -1743.5332 0.00088800624 185.77114 13402.228 368.83819 +Loop time of 0.16666 on 1 procs for 1000 steps with 200 atoms + +Performance: 518.420 ns/day, 0.046 hours/ns, 6000.230 timesteps/s, 1.200 Matom-step/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.10798 | 0.10798 | 0.10798 | 0.0 | 64.79 +Neigh | 0.00097784 | 0.00097784 | 0.00097784 | 0.0 | 0.59 +Comm | 0.0035304 | 0.0035304 | 0.0035304 | 0.0 | 2.12 +Output | 8.5625e-05 | 8.5625e-05 | 8.5625e-05 | 0.0 | 0.05 +Modify | 0.05322 | 0.05322 | 0.05322 | 0.0 | 31.93 +Other | | 0.0008694 | | | 0.52 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1360 ave 1360 max 1360 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 9552 ave 9552 max 9552 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9552 +Ave neighs/atom = 47.76 +Neighbor list builds = 4 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.2 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.2 new file mode 100644 index 0000000000..f5869bcb03 --- /dev/null +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.2 @@ -0,0 +1,95 @@ +LAMMPS (3 Aug 2023) +Processor partition = 2 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +variable ibead uloop 99 pad + +units metal +atom_style atomic +atom_modify map yes +boundary p p p +pair_style lj/cut 9.5251 +read_data data.metalnpt${ibead} +read_data data.metalnpt03 +Reading data file ... + orthogonal box = (-11.876697 -11.876697 -11.876697) to (11.876697 11.876697 11.876697) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 200 atoms + reading velocities ... + 200 velocities + read_data CPU = 0.001 seconds + +pair_coeff * * 0.00965188 3.4 +pair_modify shift yes + +mass 1 39.948 + +timestep 0.001 + +velocity all create 0.0 ${ibead} +velocity all create 0.0 03 + +fix 1 all pimd/langevin method pimd ensemble nvt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 taup 1.0 fixcom no + +thermo_style custom step temp f_1[*] vol press +thermo 100 +thermo_modify norm no + +# dump dcd all custom 100 ${ibead}.dcd id type xu yu zu vx vy vz ix iy iz fx fy fz +# dump_modify dcd sort id format line "%d %d %.16f %.16f %.16f %.16f %.16f %.16f %d %d %d %.16f %.16f %.16f" + +run 1000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 11.5251 + ghost atom cutoff = 11.5251 + binsize = 5.76255, bins = 5 5 5 + 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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes + Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] Volume Press + 0 0 0 8.4016332 -7.320388 4.3005229 3.3062167 0 0 -1743.5332 0 0 13402.228 -175.34503 + 100 235.06814 6.0466034 4.1185166 -7.7660023 9.6829291 3.3062167 0 0 -1743.5332 0.00061164884 127.22547 13402.228 -7.6578222 + 200 341.9927 8.7969992 2.7767151 -7.9109058 14.016847 3.3062167 0 0 -1743.5332 0.00088274242 177.45909 13402.228 69.587081 + 300 206.29873 5.3065745 7.3388955 -7.7440046 18.162833 3.3062167 0 0 -1743.5332 0.00054181173 111.54876 13402.228 -118.3143 + 400 305.56268 7.8599181 5.7681208 -7.7110516 21.628032 3.3062167 0 0 -1743.5332 0.0007209203 136.75648 13402.228 107.63706 + 500 313.47536 8.0634543 5.5086382 -7.7030371 25.668758 3.3062167 0 0 -1743.5332 0.00087137898 175.48435 13402.228 145.14899 + 600 258.53638 6.6502715 8.1299001 -7.6530176 28.570788 3.3062167 0 0 -1743.5332 0.00072432598 143.69546 13402.228 92.36234 + 700 357.63679 9.1994085 6.539048 -7.6186515 30.034627 3.3062167 0 0 -1743.5332 0.00092377441 193.27472 13402.228 329.17147 + 800 391.32883 10.066061 5.7809035 -7.6148923 31.447502 3.3062167 0 0 -1743.5332 0.00097254954 193.91329 13402.228 415.13205 + 900 308.61185 7.9383512 8.9544585 -7.4803275 32.906719 3.3062167 0 0 -1743.5332 0.00074024142 139.40121 13402.228 341.46691 + 1000 317.70376 8.1722204 7.3013798 -7.4667312 34.914285 3.3062167 0 0 -1743.5332 0.00088800624 185.77114 13402.228 352.92253 +Loop time of 0.16666 on 1 procs for 1000 steps with 200 atoms + +Performance: 518.420 ns/day, 0.046 hours/ns, 6000.235 timesteps/s, 1.200 Matom-step/s +98.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.10509 | 0.10509 | 0.10509 | 0.0 | 63.06 +Neigh | 0.00096379 | 0.00096379 | 0.00096379 | 0.0 | 0.58 +Comm | 0.0035557 | 0.0035557 | 0.0035557 | 0.0 | 2.13 +Output | 7.8072e-05 | 7.8072e-05 | 7.8072e-05 | 0.0 | 0.05 +Modify | 0.05611 | 0.05611 | 0.05611 | 0.0 | 33.67 +Other | | 0.0008601 | | | 0.52 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1364 ave 1364 max 1364 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 9545 ave 9545 max 9545 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9545 +Ave neighs/atom = 47.725 +Neighbor list builds = 4 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.3 b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.3 new file mode 100644 index 0000000000..da0767fe0d --- /dev/null +++ b/examples/PACKAGES/pimd/langevin_metal_units/log.16Nov23.pimd-langevin.metal.g++.3 @@ -0,0 +1,95 @@ +LAMMPS (3 Aug 2023) +Processor partition = 3 +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +variable ibead uloop 99 pad + +units metal +atom_style atomic +atom_modify map yes +boundary p p p +pair_style lj/cut 9.5251 +read_data data.metalnpt${ibead} +read_data data.metalnpt04 +Reading data file ... + orthogonal box = (-11.876697 -11.876697 -11.876697) to (11.876697 11.876697 11.876697) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 200 atoms + reading velocities ... + 200 velocities + read_data CPU = 0.001 seconds + +pair_coeff * * 0.00965188 3.4 +pair_modify shift yes + +mass 1 39.948 + +timestep 0.001 + +velocity all create 0.0 ${ibead} +velocity all create 0.0 04 + +fix 1 all pimd/langevin method pimd ensemble nvt integrator obabo thermostat PILE_L 1234 tau 1.0 temp 113.15 taup 1.0 fixcom no + +thermo_style custom step temp f_1[*] vol press +thermo 100 +thermo_modify norm no + +# dump dcd all custom 100 ${ibead}.dcd id type xu yu zu vx vy vz ix iy iz fx fy fz +# dump_modify dcd sort id format line "%d %d %.16f %.16f %.16f %.16f %.16f %.16f %d %d %d %.16f %.16f %.16f" + +run 1000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 11.5251 + ghost atom cutoff = 11.5251 + binsize = 5.76255, bins = 5 5 5 + 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 + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.121 | 3.121 | 3.121 Mbytes + Step Temp f_1[1] f_1[2] f_1[3] f_1[4] f_1[5] f_1[6] f_1[7] f_1[8] f_1[9] f_1[10] Volume Press + 0 0 0 7.8012276 -7.3457072 4.3005229 3.3062167 0 0 -1743.5332 0 0 13402.228 -191.02389 + 100 241.19035 6.2040835 3.9473764 -7.7641902 9.6829291 3.3062167 0 0 -1743.5332 0.00061164884 127.22547 13402.228 3.5720518 + 200 325.21166 8.3653443 2.3529831 -7.9137212 14.016847 3.3062167 0 0 -1743.5332 0.00088274242 177.45909 13402.228 33.184125 + 300 209.19735 5.381135 6.7063061 -7.801056 18.162833 3.3062167 0 0 -1743.5332 0.00054181173 111.54876 13402.228 -154.10632 + 400 280.84513 7.2241142 5.8838331 -7.7320495 21.628032 3.3062167 0 0 -1743.5332 0.0007209203 136.75648 13402.228 45.624285 + 500 367.15726 9.4443014 5.2842629 -7.6643085 25.668758 3.3062167 0 0 -1743.5332 0.00087137898 175.48435 13402.228 283.59979 + 600 294.68254 7.5800508 6.5104311 -7.6234652 28.570788 3.3062167 0 0 -1743.5332 0.00072432598 143.69546 13402.228 183.09906 + 700 356.64514 9.1739005 5.2769462 -7.6204507 30.034627 3.3062167 0 0 -1743.5332 0.00092377441 193.27472 13402.228 334.31754 + 800 360.77353 9.2800941 5.7976264 -7.6946985 31.447502 3.3062167 0 0 -1743.5332 0.00097254954 193.91329 13402.228 299.62001 + 900 291.14241 7.4889889 7.5124196 -7.5102882 32.906719 3.3062167 0 0 -1743.5332 0.00074024142 139.40121 13402.228 277.94834 + 1000 362.48694 9.3241677 6.8711151 -7.4856221 34.914285 3.3062167 0 0 -1743.5332 0.00088800624 185.77114 13402.228 428.98682 +Loop time of 0.166662 on 1 procs for 1000 steps with 200 atoms + +Performance: 518.414 ns/day, 0.046 hours/ns, 6000.167 timesteps/s, 1.200 Matom-step/s +98.5% 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.10817 | 0.10817 | 0.10817 | 0.0 | 64.90 +Neigh | 0.00096402 | 0.00096402 | 0.00096402 | 0.0 | 0.58 +Comm | 0.0044991 | 0.0044991 | 0.0044991 | 0.0 | 2.70 +Output | 8.5449e-05 | 8.5449e-05 | 8.5449e-05 | 0.0 | 0.05 +Modify | 0.052066 | 0.052066 | 0.052066 | 0.0 | 31.24 +Other | | 0.00088 | | | 0.53 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1368 ave 1368 max 1368 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 9541 ave 9541 max 9541 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9541 +Ave neighs/atom = 47.705 +Neighbor list builds = 4 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/pimd/langevin_metal_units/run.sh b/examples/PACKAGES/pimd/langevin_metal_units/run.sh index 2580ef1a41..8bac9231a3 100644 --- a/examples/PACKAGES/pimd/langevin_metal_units/run.sh +++ b/examples/PACKAGES/pimd/langevin_metal_units/run.sh @@ -1 +1,3 @@ -mpirun -np 4 $LMP -in in.lmp -p 4x1 -log log -screen screen +mpirun -np 4 $LMP -in in.langevin.metal -p 4x1 -log log.langevin.metal -screen screen +mpirun -np 4 $LMP -in in.pimd-langevin.metal -p 4x1 -log log.pimd-langevin.metal -screen screen + From 44b126a87d9800b1ff97a9d4b2a0ec59a93847aa Mon Sep 17 00:00:00 2001 From: jbcouli Date: Thu, 16 Nov 2023 10:35:02 -0700 Subject: [PATCH 361/417] correct typo and link in body particles doc --- doc/src/Howto_body.rst | 6 +++--- doc/src/pair_body_rounded_polyhedron.rst | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/Howto_body.rst b/doc/src/Howto_body.rst index 88fa2d9c97..115b7797c8 100644 --- a/doc/src/Howto_body.rst +++ b/doc/src/Howto_body.rst @@ -170,9 +170,9 @@ with this body style to compute body/body and body/non-body interactions. The *rounded/polygon* body style represents body particles as a 2d polygon with a variable number of N vertices. This style can only be used for 2d models; see the :doc:`boundary ` command. See the -"pair_style body/rounded/polygon" page for a diagram of two -squares with rounded circles at the vertices. Special cases for N = 1 -(circle) and N = 2 (rod with rounded ends) can also be specified. +:doc:`pair_style body/rounded/polygon ` page for +a diagram of two squares with rounded circles at the vertices. Special cases +for N = 1 (circle) and N = 2 (rod with rounded ends) can also be specified. One use of this body style is for 2d discrete element models, as described in :ref:`Fraige `. diff --git a/doc/src/pair_body_rounded_polyhedron.rst b/doc/src/pair_body_rounded_polyhedron.rst index f2f7c1676a..b3eaf72321 100644 --- a/doc/src/pair_body_rounded_polyhedron.rst +++ b/doc/src/pair_body_rounded_polyhedron.rst @@ -40,7 +40,7 @@ rounded/polyhedron particles. This pairwise interaction between the rounded polyhedra is described in :ref:`Wang `, where a polyhedron does not have sharp corners and edges, but is rounded at its vertices and edges by spheres -centered on each vertex with a specified diameter. The edges if the +centered on each vertex with a specified diameter. The edges of the polyhedron are defined between pairs of adjacent vertices. Its faces are defined by a loop of edges. The sphere diameter for each polygon is specified in the data file read by the :doc:`read data ` From ac5f28719b7cf4170edbdfad11417eb9c46c226b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 16 Nov 2023 15:52:45 -0500 Subject: [PATCH 362/417] explicitly include `if constexpr` only when C++17 or later is selected --- src/fmt/compile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmt/compile.h b/src/fmt/compile.h index a4c7e49563..ef8d5c0256 100644 --- a/src/fmt/compile.h +++ b/src/fmt/compile.h @@ -61,7 +61,7 @@ const T& first(const T& value, const Tail&...) { return value; } -#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) +#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) && FMT_CPLUSPLUS >= 201703L template struct type_list {}; // Returns a reference to the argument at index N from [first, rest...]. From ddd5cc1a737281f52f7acbda545623b7c3e8435c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 16 Nov 2023 15:53:23 -0500 Subject: [PATCH 363/417] avoid segfault on command errors in force style unit tests and print error mesage instead --- unittest/force-styles/test_angle_style.cpp | 19 ++++++++++++++-- unittest/force-styles/test_bond_style.cpp | 19 ++++++++++++++-- unittest/force-styles/test_dihedral_style.cpp | 19 ++++++++++++++-- unittest/force-styles/test_improper_style.cpp | 19 ++++++++++++++-- unittest/force-styles/test_pair_style.cpp | 22 ++++++++++++++++--- 5 files changed, 87 insertions(+), 11 deletions(-) diff --git a/unittest/force-styles/test_angle_style.cpp b/unittest/force-styles/test_angle_style.cpp index bd0e3d8859..3476ae8dde 100644 --- a/unittest/force-styles/test_angle_style.cpp +++ b/unittest/force-styles/test_angle_style.cpp @@ -26,6 +26,7 @@ #include "angle.h" #include "atom.h" #include "compute.h" +#include "exceptions.h" #include "fmt/format.h" #include "force.h" #include "info.h" @@ -59,7 +60,7 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv &args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; @@ -90,7 +91,21 @@ LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newto // utility lambdas to improve readability auto command = [&](const std::string &line) { - lmp->input->one(line); + try { + lmp->input->one(line); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } }; auto parse_input_script = [&](const std::string &filename) { lmp->input->file(filename.c_str()); diff --git a/unittest/force-styles/test_bond_style.cpp b/unittest/force-styles/test_bond_style.cpp index aa99f41f8d..f7ecd835b0 100644 --- a/unittest/force-styles/test_bond_style.cpp +++ b/unittest/force-styles/test_bond_style.cpp @@ -26,6 +26,7 @@ #include "atom.h" #include "bond.h" #include "compute.h" +#include "exceptions.h" #include "fmt/format.h" #include "force.h" #include "info.h" @@ -59,7 +60,7 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv &args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; @@ -90,7 +91,21 @@ LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newto // utility lambdas to improve readability auto command = [&](const std::string &line) { - lmp->input->one(line); + try { + lmp->input->one(line); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } }; auto parse_input_script = [&](const std::string &filename) { lmp->input->file(filename.c_str()); diff --git a/unittest/force-styles/test_dihedral_style.cpp b/unittest/force-styles/test_dihedral_style.cpp index 25690fc33d..662d63909d 100644 --- a/unittest/force-styles/test_dihedral_style.cpp +++ b/unittest/force-styles/test_dihedral_style.cpp @@ -26,6 +26,7 @@ #include "atom.h" #include "compute.h" #include "dihedral.h" +#include "exceptions.h" #include "fmt/format.h" #include "force.h" #include "info.h" @@ -59,7 +60,7 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv &args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp = new LAMMPS(args, MPI_COMM_WORLD); @@ -88,7 +89,21 @@ LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newto // utility lambdas to improve readability auto command = [&](const std::string &line) { - lmp->input->one(line); + try { + lmp->input->one(line); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } }; auto parse_input_script = [&](const std::string &filename) { lmp->input->file(filename.c_str()); diff --git a/unittest/force-styles/test_improper_style.cpp b/unittest/force-styles/test_improper_style.cpp index b4096df868..dc1b846b5a 100644 --- a/unittest/force-styles/test_improper_style.cpp +++ b/unittest/force-styles/test_improper_style.cpp @@ -25,6 +25,7 @@ #include "atom.h" #include "compute.h" +#include "exceptions.h" #include "fmt/format.h" #include "force.h" #include "improper.h" @@ -59,7 +60,7 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv &args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; @@ -90,7 +91,21 @@ LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newto // utility lambdas to improve readability auto command = [&](const std::string &line) { - lmp->input->one(line); + try { + lmp->input->one(line); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } }; auto parse_input_script = [&](const std::string &filename) { lmp->input->file(filename.c_str()); diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index 8ad2ce9aaa..9db9c7ac8b 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -26,6 +26,7 @@ #include "atom.h" #include "compute.h" #include "domain.h" +#include "exceptions.h" #include "force.h" #include "info.h" #include "input.h" @@ -61,7 +62,7 @@ void cleanup_lammps(LAMMPS *lmp, const TestConfig &cfg) delete lmp; } -LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newton = true) +LAMMPS *init_lammps(LAMMPS::argv &args, const TestConfig &cfg, const bool newton = true) { LAMMPS *lmp; @@ -92,8 +93,23 @@ LAMMPS *init_lammps(LAMMPS::argv & args, const TestConfig &cfg, const bool newto // utility lambdas to improve readability auto command = [&](const std::string &line) { - lmp->input->one(line); + try { + lmp->input->one(line); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } }; + auto parse_input_script = [&](const std::string &filename) { lmp->input->file(filename.c_str()); }; @@ -760,7 +776,7 @@ TEST(PairStyle, gpu) "screen", "-nocite", "-sf", "gpu"}; LAMMPS::argv args_noneigh = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", "gpu", "-pk", "gpu", "0", "neigh", "no"}; - LAMMPS::argv args = args_neigh; + LAMMPS::argv args = args_neigh; // cannot use GPU neighbor list with hybrid pair style (yet) if (test_config.pair_style.substr(0, 6) == "hybrid") { From 718cfc4562150ad87dc1def13003f0060ce8de39 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 16 Nov 2023 14:31:50 -0700 Subject: [PATCH 364/417] Fix indexing bug --- src/npair_trim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/npair_trim.cpp b/src/npair_trim.cpp index a4b6c1c6a1..f026466f92 100644 --- a/src/npair_trim.cpp +++ b/src/npair_trim.cpp @@ -63,7 +63,7 @@ void NPairTrim::build(NeighList *list) neighptr = ipage->vget(); const int i = ilist_copy[ii]; - ilist[i] = i; + ilist[ii] = i; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; From 6f366b8c74a4eb2aa3ddd7718f6ffa4666e2dd62 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 16 Nov 2023 16:21:59 -0700 Subject: [PATCH 365/417] Fix issues with sorting neigh list by cutoff distance --- src/neighbor.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 8d12edeef2..20d6306572 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -1123,15 +1123,14 @@ int Neighbor::init_pair() } /* ---------------------------------------------------------------------- - sort NeighRequests by cutoff distance - to find smallest list for trimming + sort NeighRequests by cutoff distance for trimming ------------------------------------------------------------------------- */ void Neighbor::sort_requests() { - NeighRequest *jrq; + NeighRequest *irq,*jrq; int i,j,jmin; - double jcut; + double icut,jcut; delete[] j_sorted; j_sorted = new int[nrequest]; @@ -1139,20 +1138,24 @@ void Neighbor::sort_requests() for (i = 0; i < nrequest; i++) j_sorted[i] = i; - for (i = 0; i < nrequest; i++) { - double cutoff_min = cutneighmax; + for (i = 0; i < nrequest-1; i++) { + irq = requests[j_sorted[i]]; + if (irq->cut) icut = irq->cutoff; + else icut = cutneighmax; + double cutoff_min = icut; jmin = i; - for (j = i; j < nrequest-1; j++) { + for (j = i+1; j < nrequest; j++) { jrq = requests[j_sorted[j]]; if (jrq->cut) jcut = jrq->cutoff; else jcut = cutneighmax; - if (jcut <= cutoff_min) { + if (jcut < cutoff_min) { cutoff_min = jcut; jmin = j; } } + int tmp = j_sorted[i]; j_sorted[i] = j_sorted[jmin]; j_sorted[jmin] = tmp; From 4608444ada642a4d31a32a2d54454f57cabb6949 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 16 Nov 2023 16:23:09 -0700 Subject: [PATCH 366/417] Add trim option to skip neighbor list build styles --- src/KOKKOS/npair_skip_kokkos.cpp | 44 +++-- src/KOKKOS/npair_skip_kokkos.h | 42 ++++- src/neighbor.cpp | 56 +++--- src/npair_skip_respa_trim.cpp | 193 ++++++++++++++++++++ src/npair_skip_respa_trim.h | 40 ++++ src/npair_skip_size_off2on_oneside_trim.cpp | 185 +++++++++++++++++++ src/npair_skip_size_off2on_oneside_trim.h | 40 ++++ src/npair_skip_size_off2on_trim.cpp | 112 ++++++++++++ src/npair_skip_size_off2on_trim.h | 40 ++++ src/npair_skip_size_trim.cpp | 102 +++++++++++ src/npair_skip_size_trim.h | 39 ++++ src/npair_skip_trim.cpp | 118 ++++++++++++ src/npair_skip_trim.h | 46 +++++ 13 files changed, 1019 insertions(+), 38 deletions(-) create mode 100644 src/npair_skip_respa_trim.cpp create mode 100644 src/npair_skip_respa_trim.h create mode 100644 src/npair_skip_size_off2on_oneside_trim.cpp create mode 100644 src/npair_skip_size_off2on_oneside_trim.h create mode 100644 src/npair_skip_size_off2on_trim.cpp create mode 100644 src/npair_skip_size_off2on_trim.h create mode 100644 src/npair_skip_size_trim.cpp create mode 100644 src/npair_skip_size_trim.h create mode 100644 src/npair_skip_trim.cpp create mode 100644 src/npair_skip_trim.h diff --git a/src/KOKKOS/npair_skip_kokkos.cpp b/src/KOKKOS/npair_skip_kokkos.cpp index 4492a3794a..15c0487010 100644 --- a/src/KOKKOS/npair_skip_kokkos.cpp +++ b/src/KOKKOS/npair_skip_kokkos.cpp @@ -23,8 +23,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -template -NPairSkipKokkos::NPairSkipKokkos(LAMMPS *lmp) : NPair(lmp) { +template +NPairSkipKokkos::NPairSkipKokkos(LAMMPS *lmp) : NPair(lmp) { atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; d_inum = typename AT::t_int_scalar("npair_skip:inum"); @@ -38,13 +38,18 @@ NPairSkipKokkos::NPairSkipKokkos(LAMMPS *lmp) : NPair(lmp) { if ghost, also store neighbors of ghost atoms & set inum,gnum correctly ------------------------------------------------------------------------- */ -template -void NPairSkipKokkos::build(NeighList *list) +template +void NPairSkipKokkos::build(NeighList *list) { atomKK->sync(execution_space,TYPE_MASK); type = atomKK->k_type.view(); nlocal = atom->nlocal; + if (TRIM) { + x = atomKK->k_x.view(); + atomKK->sync(execution_space,X_MASK); + cutsq_custom = cutoff_custom*cutoff_custom; + } NeighListKokkos* k_list_skip = static_cast*>(list->listskip); d_ilist_skip = k_list_skip->d_ilist; @@ -100,13 +105,20 @@ void NPairSkipKokkos::build(NeighList *list) copymode = 0; } -template +template KOKKOS_INLINE_FUNCTION -void NPairSkipKokkos::operator()(TagNPairSkipCompute, const int &ii, int &inum, const bool &final) const { +void NPairSkipKokkos::operator()(TagNPairSkipCompute, const int &ii, int &inum, const bool &final) const { const int i = d_ilist_skip(ii); const int itype = type(i); + F_FLOAT xtmp,ytmp,ztmp; + if (TRIM) { + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + } + if (!d_iskip(itype)) { if (final) { @@ -123,6 +135,15 @@ void NPairSkipKokkos::operator()(TagNPairSkipCompute, const int &ii, const int joriginal = d_neighbors_skip(i,jj); int j = joriginal & NEIGHMASK; if (d_ijskip(itype,type(j))) continue; + + if (TRIM) { + const double delx = xtmp - x(j,0); + const double dely = ytmp - x(j,1); + const double delz = ztmp - x(j,2); + const double rsq = delx*delx + dely*dely + delz*delz; + if (rsq > cutsq_custom) continue; + } + neighbors_i(n++) = joriginal; } @@ -139,16 +160,17 @@ void NPairSkipKokkos::operator()(TagNPairSkipCompute, const int &ii, } } -template +template KOKKOS_INLINE_FUNCTION -void NPairSkipKokkos::operator()(TagNPairSkipCountLocal, const int &i, int &num) const { +void NPairSkipKokkos::operator()(TagNPairSkipCountLocal, const int &i, int &num) const { if (d_ilist[i] < nlocal) num++; } - namespace LAMMPS_NS { -template class NPairSkipKokkos; +template class NPairSkipKokkos; +template class NPairSkipKokkos; #ifdef LMP_KOKKOS_GPU -template class NPairSkipKokkos; +template class NPairSkipKokkos; +template class NPairSkipKokkos; #endif } diff --git a/src/KOKKOS/npair_skip_kokkos.h b/src/KOKKOS/npair_skip_kokkos.h index fd1217bef4..7672a2c36c 100644 --- a/src/KOKKOS/npair_skip_kokkos.h +++ b/src/KOKKOS/npair_skip_kokkos.h @@ -13,33 +13,62 @@ #ifdef NPAIR_CLASS // clang-format off -typedef NPairSkipKokkos NPairKokkosSkipDevice; +typedef NPairSkipKokkos NPairKokkosSkipDevice; NPairStyle(skip/kk/device, NPairKokkosSkipDevice, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE); -typedef NPairSkipKokkos NPairKokkosSkipGhostDevice; +typedef NPairSkipKokkos NPairKokkosSkipGhostDevice; NPairStyle(skip/ghost/kk/device, NPairKokkosSkipGhostDevice, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE); -typedef NPairSkipKokkos NPairKokkosSkipHost; +typedef NPairSkipKokkos NPairKokkosSkipHost; NPairStyle(skip/kk/host, NPairKokkosSkipHost, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_KOKKOS_HOST); -typedef NPairSkipKokkos NPairKokkosSkipGhostHost; +typedef NPairSkipKokkos NPairKokkosSkipGhostHost; NPairStyle(skip/ghost/kk/host, NPairKokkosSkipGhostHost, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); + +typedef NPairSkipKokkos NPairKokkosSkipTrimDevice; +NPairStyle(skip/kk/device, + NPairKokkosSkipTrimDevice, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM |NP_KOKKOS_DEVICE); + +typedef NPairSkipKokkos NPairKokkosSkipTrimGhostDevice; +NPairStyle(skip/ghost/kk/device, + NPairKokkosSkipTrimGhostDevice, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_GHOST | NP_KOKKOS_DEVICE); + +typedef NPairSkipKokkos NPairKokkosSkipTrimHost; +NPairStyle(skip/kk/host, + NPairKokkosSkipTrimHost, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_HOST); + +typedef NPairSkipKokkos NPairKokkosSkipTrimGhostHost; +NPairStyle(skip/ghost/kk/host, + NPairKokkosSkipTrimGhostHost, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_GHOST | NP_KOKKOS_HOST); + // clang-format on #else @@ -55,7 +84,7 @@ namespace LAMMPS_NS { struct TagNPairSkipCompute{}; struct TagNPairSkipCountLocal{}; -template +template class NPairSkipKokkos : public NPair { public: typedef DeviceType device_type; @@ -72,8 +101,9 @@ class NPairSkipKokkos : public NPair { void operator()(TagNPairSkipCountLocal, const int&, int&) const; private: - int nlocal,num_skip; + int nlocal,num_skip,cutsq_custom; + typename AT::t_x_array_randomread x; typename AT::t_int_1d_randomread type; typename AT::t_int_scalar d_inum; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 20d6306572..b6f3363b0c 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -852,6 +852,7 @@ int Neighbor::init_pair() // morph requests in various ways // purpose is to avoid duplicate or inefficient builds + // also sort requests by cutoff distance for trimming // may add new requests if a needed request to derive from does not exist // methods: // (1) unique = create unique lists if cutoff is explicitly set @@ -868,15 +869,9 @@ int Neighbor::init_pair() int nrequest_original = nrequest; morph_unique(); + sort_requests(); morph_skip(); morph_granular(); // this method can change flags set by requestor - - // sort requests by cutoff distance for trimming, used by - // morph_halffull and morph_copy_trim. Must come after - // morph_skip() which change the number of requests - - sort_requests(); - morph_halffull(); morph_copy_trim(); @@ -1210,11 +1205,15 @@ void Neighbor::morph_unique() void Neighbor::morph_skip() { - int i,j,inewton,jnewton; + int i,j,jj,inewton,jnewton,icut,jcut; NeighRequest *irq,*jrq,*nrq; - for (i = 0; i < nrequest; i++) { - irq = requests[i]; + // loop over irq from largest to smallest cutoff + // to prevent adding unecessary neighbor lists + + for (i = nrequest-1; i >= 0; i--) { + irq = requests[j_sorted[i]]; + int trim_flag = irq->trim; // only processing skip lists @@ -1229,7 +1228,9 @@ void Neighbor::morph_skip() // check all other lists - for (j = 0; j < nrequest; j++) { + for (jj = 0; jj < nrequest; jj++) { + j = j_sorted[jj]; + if (i == j) continue; jrq = requests[j]; @@ -1252,10 +1253,20 @@ void Neighbor::morph_skip() if (jnewton == 0) jnewton = force->newton_pair ? 1 : 2; if (inewton != jnewton) continue; + // trim a list with longer cutoff + + if (irq->cut) icut = irq->cutoff; + else icut = cutneighmax; + + if (jrq->cut) jcut = jrq->cutoff; + else jcut = cutneighmax; + + if (icut > jcut) continue; + else if (icut != jcut) trim_flag = 1; + // these flags must be same, // else 2 lists do not store same pairs // or their data structures are different - // this includes custom cutoff set by requestor // NOTE: need check for 2 Kokkos flags? if (irq->ghost != jrq->ghost) continue; @@ -1267,8 +1278,6 @@ void Neighbor::morph_skip() if (irq->kokkos_host != jrq->kokkos_host) continue; if (irq->kokkos_device != jrq->kokkos_device) continue; if (irq->ssa != jrq->ssa) continue; - if (irq->cut != jrq->cut) continue; - if (irq->cutoff != jrq->cutoff) continue; // 2 lists are a match @@ -1282,8 +1291,10 @@ void Neighbor::morph_skip() // note: parents of skip lists do not have associated history // b/c child skip lists have the associated history - if (j < nrequest) irq->skiplist = j; - else { + if (jj < nrequest) { + irq->skiplist = j; + irq->trim = trim_flag; + } else { int newrequest = request(this,-1); irq->skiplist = newrequest; @@ -1293,6 +1304,8 @@ void Neighbor::morph_skip() nrq->neigh = 1; nrq->skip = 0; if (irq->unique) nrq->unique = 1; + + sort_requests(); } } } @@ -1394,8 +1407,7 @@ void Neighbor::morph_halffull() // check all other lists for (jj = 0; jj < nrequest; jj++) { - if (irq->cut) j = j_sorted[jj]; - else j = jj; + j = j_sorted[jj]; jrq = requests[j]; @@ -1473,8 +1485,7 @@ void Neighbor::morph_copy_trim() // check all other lists for (jj = 0; jj < nrequest; jj++) { - if (irq->cut) j = j_sorted[jj]; - else j = jj; + j = j_sorted[jj]; if (i == j) continue; jrq = requests[j]; @@ -1786,7 +1797,10 @@ void Neighbor::print_pairwise_info() else out += fmt::format(", half/full from ({})",rq->halffulllist+1); else if (rq->skip) - out += fmt::format(", skip from ({})",rq->skiplist+1); + if (rq->trim) + out += fmt::format(", skip trim from ({})",rq->skiplist+1); + else + out += fmt::format(", skip from ({})",rq->skiplist+1); out += "\n"; // list of neigh list attributes diff --git a/src/npair_skip_respa_trim.cpp b/src/npair_skip_respa_trim.cpp new file mode 100644 index 0000000000..64b1c4d716 --- /dev/null +++ b/src/npair_skip_respa_trim.cpp @@ -0,0 +1,193 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "npair_skip_respa_trim.h" + +#include "atom.h" +#include "error.h" +#include "my_page.h" +#include "neigh_list.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairSkipRespaTrim::NPairSkipRespaTrim(LAMMPS *lmp) : NPair(lmp) {} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + iskip and ijskip flag which atom types and type pairs to skip + this is for respa lists, copy the inner/middle values from parent +------------------------------------------------------------------------- */ + +void NPairSkipRespaTrim::build(NeighList *list) +{ + int i,j,ii,jj,n,itype,jnum,joriginal,n_inner,n_middle; + int *neighptr,*jlist,*neighptr_inner,*neighptr_middle; + + int *type = atom->type; + + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + MyPage *ipage = list->ipage; + + int *ilist_skip = list->listskip->ilist; + int *numneigh_skip = list->listskip->numneigh; + int **firstneigh_skip = list->listskip->firstneigh; + int inum_skip = list->listskip->inum; + + int *iskip = list->iskip; + int **ijskip = list->ijskip; + + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; + int *numneigh_inner_skip = list->listskip->numneigh_inner; + int **firstneigh_inner_skip = list->listskip->firstneigh_inner; + + int *ilist_middle,*numneigh_middle,**firstneigh_middle; + MyPage *ipage_middle; + int *numneigh_middle_skip,**firstneigh_middle_skip; + int respamiddle = list->respamiddle; + if (respamiddle) { + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; + numneigh_middle_skip = list->listskip->numneigh_middle; + firstneigh_middle_skip = list->listskip->firstneigh_middle; + } + + int inum = 0; + ipage->reset(); + ipage_inner->reset(); + if (respamiddle) ipage_middle->reset(); + + double **x = atom->x; + double xtmp, ytmp, ztmp; + double delx, dely, delz, rsq; + double cutsq_custom = cutoff_custom * cutoff_custom; + + // loop over atoms in other list + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + for (ii = 0; ii < inum_skip; ii++) { + i = ilist_skip[ii]; + itype = type[i]; + if (iskip[itype]) continue; + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + n = n_inner = 0; + neighptr = ipage->vget(); + neighptr_inner = ipage_inner->vget(); + if (respamiddle) { + n_middle = 0; + neighptr_middle = ipage_middle->vget(); + } + + // loop over parent outer rRESPA list + + jlist = firstneigh_skip[i]; + jnum = numneigh_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + neighptr[n++] = joriginal; + } + + // loop over parent inner rRESPA list + + jlist = firstneigh_inner_skip[i]; + jnum = numneigh_inner_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + neighptr_inner[n_inner++] = joriginal; + } + + // loop over parent middle rRESPA list + + if (respamiddle) { + jlist = firstneigh_middle_skip[i]; + jnum = numneigh_middle_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + neighptr_middle[n_middle++] = joriginal; + } + } + + ilist[inum] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + ipage->vgot(n); + if (ipage->status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + + ilist_inner[inum] = i; + firstneigh_inner[i] = neighptr_inner; + numneigh_inner[i] = n_inner; + ipage_inner->vgot(n); + if (ipage_inner->status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + + if (respamiddle) { + ilist_middle[inum] = i; + firstneigh_middle[i] = neighptr_middle; + numneigh_middle[i] = n_middle; + ipage_middle->vgot(n); + if (ipage_middle->status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + } + + inum++; + } + + list->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; +} diff --git a/src/npair_skip_respa_trim.h b/src/npair_skip_respa_trim.h new file mode 100644 index 0000000000..f10b726cbe --- /dev/null +++ b/src/npair_skip_respa_trim.h @@ -0,0 +1,40 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 NPAIR_CLASS +// clang-format off +NPairStyle(skip/half/respa/trim, + NPairSkipRespaTrim, + NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); +// clang-format on +#else + +#ifndef LMP_NPAIR_SKIP_RESPA_TRIM_H +#define LMP_NPAIR_SKIP_RESPA_TRIM_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairSkipRespaTrim : public NPair { + public: + NPairSkipRespaTrim(class LAMMPS *); + void build(class NeighList *) override; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/npair_skip_size_off2on_oneside_trim.cpp b/src/npair_skip_size_off2on_oneside_trim.cpp new file mode 100644 index 0000000000..91940d3135 --- /dev/null +++ b/src/npair_skip_size_off2on_oneside_trim.cpp @@ -0,0 +1,185 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "npair_skip_size_off2on_oneside_trim.h" + +#include "atom.h" +#include "domain.h" +#include "error.h" +#include "my_page.h" +#include "neigh_list.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairSkipSizeOff2onOnesideTrim::NPairSkipSizeOff2onOnesideTrim(LAMMPS *lmp) : + NPair(lmp) {} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + iskip and ijskip flag which atom types and type pairs to skip + parent non-skip list used newton off and was not onesided, + this skip list is newton on and onesided +------------------------------------------------------------------------- */ + +void NPairSkipSizeOff2onOnesideTrim::build(NeighList *list) +{ + int i,j,ii,jj,itype,jnum,joriginal,flip,tmp; + int *surf,*jlist; + + int *type = atom->type; + int nlocal = atom->nlocal; + + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + MyPage *ipage = list->ipage; + + int *ilist_skip = list->listskip->ilist; + int *numneigh_skip = list->listskip->numneigh; + int **firstneigh_skip = list->listskip->firstneigh; + int inum_skip = list->listskip->inum; + + int *iskip = list->iskip; + int **ijskip = list->ijskip; + + if (domain->dimension == 2) surf = atom->line; + else surf = atom->tri; + + int inum = 0; + ipage->reset(); + + double **x = atom->x; + double xtmp, ytmp, ztmp; + double delx, dely, delz, rsq; + double cutsq_custom = cutoff_custom * cutoff_custom; + + // two loops over parent list required, one to count, one to store + // because onesided constraint means pair I,J may be stored with I or J + // so don't know in advance how much space to alloc for each atom's neighs + + // first loop over atoms in other list to count neighbors + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + for (i = 0; i < nlocal; i++) numneigh[i] = 0; + + for (ii = 0; ii < inum_skip; ii++) { + i = ilist_skip[ii]; + itype = type[i]; + if (iskip[itype]) continue; + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // loop over parent non-skip size list + + jlist = firstneigh_skip[i]; + jnum = numneigh_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + // flip I,J if necessary to satisfy onesided constraint + // do not keep if I is now ghost + + if (surf[i] >= 0) { + if (j >= nlocal) continue; + tmp = i; + i = j; + j = tmp; + flip = 1; + } else flip = 0; + + numneigh[i]++; + if (flip) i = j; + } + } + + // allocate all per-atom neigh list chunks + + for (i = 0; i < nlocal; i++) { + if (numneigh[i] == 0) continue; + firstneigh[i] = ipage->get(numneigh[i]); + if (ipage->status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + } + + // second loop over atoms in other list to store neighbors + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + for (i = 0; i < nlocal; i++) numneigh[i] = 0; + + for (ii = 0; ii < inum_skip; ii++) { + i = ilist_skip[ii]; + itype = type[i]; + if (iskip[itype]) continue; + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // loop over parent non-skip size list and optionally its history info + + jlist = firstneigh_skip[i]; + jnum = numneigh_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + // flip I,J if necessary to satisfy onesided constraint + // do not keep if I is now ghost + + if (surf[i] >= 0) { + if (j >= nlocal) continue; + tmp = i; + i = j; + j = tmp; + flip = 1; + } else flip = 0; + + // store j in neigh list, not joriginal, like other neigh methods + // OK, b/c there is no special list flagging for surfs + + firstneigh[i][numneigh[i]] = j; + numneigh[i]++; + if (flip) i = j; + } + + // only add atom I to ilist if it has neighbors + + if (numneigh[i]) ilist[inum++] = i; + } + + list->inum = inum; +} diff --git a/src/npair_skip_size_off2on_oneside_trim.h b/src/npair_skip_size_off2on_oneside_trim.h new file mode 100644 index 0000000000..236b886fe4 --- /dev/null +++ b/src/npair_skip_size_off2on_oneside_trim.h @@ -0,0 +1,40 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 NPAIR_CLASS +// clang-format off +NPairStyle(skip/size/off2on/oneside/trim, + NPairSkipSizeOff2onOnesideTrim, + NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | + NP_ORTHO | NP_TRI | NP_TRIM); +// clang-format on +#else + +#ifndef LMP_NPAIR_SKIP_SIZE_OFF2ON_ONESIDE_TRIM_H +#define LMP_NPAIR_SKIP_SIZE_OFF2ON_ONESIDE_TRIM_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairSkipSizeOff2onOnesideTrim : public NPair { + public: + NPairSkipSizeOff2onOnesideTrim(class LAMMPS *); + void build(class NeighList *) override; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/npair_skip_size_off2on_trim.cpp b/src/npair_skip_size_off2on_trim.cpp new file mode 100644 index 0000000000..9591bbc4eb --- /dev/null +++ b/src/npair_skip_size_off2on_trim.cpp @@ -0,0 +1,112 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "npair_skip_size_off2on_trim.h" + +#include "atom.h" +#include "error.h" +#include "my_page.h" +#include "neigh_list.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairSkipSizeOff2onTrim::NPairSkipSizeOff2onTrim(LAMMPS *lmp) : NPair(lmp) {} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + iskip and ijskip flag which atom types and type pairs to skip + parent non-skip list used newton off, this skip list is newton on +------------------------------------------------------------------------- */ + +void NPairSkipSizeOff2onTrim::build(NeighList *list) +{ + int i, j, ii, jj, n, itype, jnum, joriginal; + tagint itag, jtag; + int *neighptr, *jlist; + + tagint *tag = atom->tag; + int *type = atom->type; + int nlocal = atom->nlocal; + + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + MyPage *ipage = list->ipage; + + int *ilist_skip = list->listskip->ilist; + int *numneigh_skip = list->listskip->numneigh; + int **firstneigh_skip = list->listskip->firstneigh; + int inum_skip = list->listskip->inum; + + int *iskip = list->iskip; + int **ijskip = list->ijskip; + + int inum = 0; + ipage->reset(); + + double **x = atom->x; + double xtmp, ytmp, ztmp; + double delx, dely, delz, rsq; + double cutsq_custom = cutoff_custom * cutoff_custom; + + // loop over atoms in other list + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + for (ii = 0; ii < inum_skip; ii++) { + i = ilist_skip[ii]; + itype = type[i]; + if (iskip[itype]) continue; + itag = tag[i]; + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + n = 0; + neighptr = ipage->vget(); + + // loop over parent non-skip size list and optionally its history info + + jlist = firstneigh_skip[i]; + jnum = numneigh_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + // only keep I,J when J = ghost if Itag < Jtag + + jtag = tag[j]; + if (j >= nlocal && jtag < itag) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + neighptr[n++] = joriginal; + } + + ilist[inum++] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + ipage->vgot(n); + if (ipage->status()) error->one(FLERR, "Neighbor list overflow, boost neigh_modify one"); + } + list->inum = inum; +} diff --git a/src/npair_skip_size_off2on_trim.h b/src/npair_skip_size_off2on_trim.h new file mode 100644 index 0000000000..e471ddd2cc --- /dev/null +++ b/src/npair_skip_size_off2on_trim.h @@ -0,0 +1,40 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 NPAIR_CLASS +// clang-format off +NPairStyle(skip/size/off2on/trim, + NPairSkipSizeOff2onTrim, + NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); +// clang-format on +#else + +#ifndef LMP_NPAIR_SKIP_SIZE_OFF2ON_TRIM_H +#define LMP_NPAIR_SKIP_SIZE_OFF2ON_TRIM_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairSkipSizeOff2onTrim : public NPair { + public: + NPairSkipSizeOff2onTrim(class LAMMPS *); + void build(class NeighList *) override; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/npair_skip_size_trim.cpp b/src/npair_skip_size_trim.cpp new file mode 100644 index 0000000000..3fd8f912f9 --- /dev/null +++ b/src/npair_skip_size_trim.cpp @@ -0,0 +1,102 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "npair_skip_size_trim.h" + +#include "atom.h" +#include "error.h" +#include "my_page.h" +#include "neigh_list.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairSkipSizeTrim::NPairSkipSizeTrim(LAMMPS *lmp) : NPair(lmp) {} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + iskip and ijskip flag which atom types and type pairs to skip +------------------------------------------------------------------------- */ + +void NPairSkipSizeTrim::build(NeighList *list) +{ + int i, j, ii, jj, n, itype, jnum, joriginal; + int *neighptr, *jlist; + + int *type = atom->type; + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + MyPage *ipage = list->ipage; + + int *ilist_skip = list->listskip->ilist; + int *numneigh_skip = list->listskip->numneigh; + int **firstneigh_skip = list->listskip->firstneigh; + int inum_skip = list->listskip->inum; + + int *iskip = list->iskip; + int **ijskip = list->ijskip; + + int inum = 0; + ipage->reset(); + + double **x = atom->x; + double xtmp, ytmp, ztmp; + double delx, dely, delz, rsq; + double cutsq_custom = cutoff_custom * cutoff_custom; + + // loop over atoms in other list + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + for (ii = 0; ii < inum_skip; ii++) { + i = ilist_skip[ii]; + itype = type[i]; + if (iskip[itype]) continue; + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + n = 0; + neighptr = ipage->vget(); + + // loop over parent non-skip size list + + jlist = firstneigh_skip[i]; + jnum = numneigh_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + neighptr[n++] = joriginal; + } + + ilist[inum++] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + ipage->vgot(n); + if (ipage->status()) error->one(FLERR, "Neighbor list overflow, boost neigh_modify one"); + } + + list->inum = inum; +} diff --git a/src/npair_skip_size_trim.h b/src/npair_skip_size_trim.h new file mode 100644 index 0000000000..e94b2f5f29 --- /dev/null +++ b/src/npair_skip_size_trim.h @@ -0,0 +1,39 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 NPAIR_CLASS +// clang-format off +NPairStyle(skip/half/size/trim, + NPairSkipSizeTrim, + NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); +// clang-format on +#else + +#ifndef LMP_NPAIR_SKIP_SIZE_TRIM_H +#define LMP_NPAIR_SKIP_SIZE_TRIM_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairSkipSizeTrim : public NPair { + public: + NPairSkipSizeTrim(class LAMMPS *); + void build(class NeighList *) override; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/npair_skip_trim.cpp b/src/npair_skip_trim.cpp new file mode 100644 index 0000000000..a286a7e19e --- /dev/null +++ b/src/npair_skip_trim.cpp @@ -0,0 +1,118 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "npair_skip_trim.h" + +#include "atom.h" +#include "error.h" +#include "my_page.h" +#include "neigh_list.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairSkipTrim::NPairSkipTrim(LAMMPS *lmp) : NPair(lmp) {} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + works for half and full lists + works for owned (non-ghost) list, also for ghost list + iskip and ijskip flag which atom types and type pairs to skip + if ghost, also store neighbors of ghost atoms & set inum,gnum correctly +------------------------------------------------------------------------- */ + +void NPairSkipTrim::build(NeighList *list) +{ + int i, j, ii, jj, n, itype, jnum, joriginal; + int *neighptr, *jlist; + + int *type = atom->type; + int nlocal = atom->nlocal; + + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + MyPage *ipage = list->ipage; + + int *ilist_skip = list->listskip->ilist; + int *numneigh_skip = list->listskip->numneigh; + int **firstneigh_skip = list->listskip->firstneigh; + int num_skip = list->listskip->inum; + if (list->ghost) num_skip += list->listskip->gnum; + + int *iskip = list->iskip; + int **ijskip = list->ijskip; + + int inum = 0; + ipage->reset(); + + double **x = atom->x; + double xtmp, ytmp, ztmp; + double delx, dely, delz, rsq; + double cutsq_custom = cutoff_custom * cutoff_custom; + + // loop over atoms in other list + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + for (ii = 0; ii < num_skip; ii++) { + i = ilist_skip[ii]; + itype = type[i]; + if (iskip[itype]) continue; + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + n = 0; + neighptr = ipage->vget(); + + // loop over parent non-skip list + + jlist = firstneigh_skip[i]; + jnum = numneigh_skip[i]; + + for (jj = 0; jj < jnum; jj++) { + joriginal = jlist[jj]; + j = joriginal & NEIGHMASK; + if (ijskip[itype][type[j]]) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) continue; + + neighptr[n++] = joriginal; + } + + ilist[inum++] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + ipage->vgot(n); + if (ipage->status()) error->one(FLERR, "Neighbor list overflow, boost neigh_modify one"); + } + + list->inum = inum; + if (list->ghost) { + int num = 0; + for (i = 0; i < inum; i++) + if (ilist[i] < nlocal) + num++; + else + break; + list->inum = num; + list->gnum = inum - num; + } +} diff --git a/src/npair_skip_trim.h b/src/npair_skip_trim.h new file mode 100644 index 0000000000..f2a26d654e --- /dev/null +++ b/src/npair_skip_trim.h @@ -0,0 +1,46 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 NPAIR_CLASS +// clang-format off +NPairStyle(skip/trim, + NPairSkipTrim, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); + +NPairStyle(skip/ghost/trim, + NPairSkipTrim, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM); +// clang-format on +#else + +#ifndef LMP_NPAIR_SKIP_TRIM_H +#define LMP_NPAIR_SKIP_TRIM_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairSkipTrim : public NPair { + public: + NPairSkipTrim(class LAMMPS *); + void build(class NeighList *) override; +}; + +} // namespace LAMMPS_NS + +#endif +#endif From d739faf971cb16c040c0ebd85aa9567b6c1e4864 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 16 Nov 2023 21:14:55 -0500 Subject: [PATCH 367/417] disable `if constexpr` for all Intel compilers --- src/fmt/compile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmt/compile.h b/src/fmt/compile.h index ef8d5c0256..a1fb7d2935 100644 --- a/src/fmt/compile.h +++ b/src/fmt/compile.h @@ -61,7 +61,7 @@ const T& first(const T& value, const Tail&...) { return value; } -#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) && FMT_CPLUSPLUS >= 201703L +#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) && (FMT_CPLUSPLUS >= 201703L) && !FMT_ICC_VERSION template struct type_list {}; // Returns a reference to the argument at index N from [first, rest...]. From ea8234a87595bbc9af6dfc39bbbce0faad25d11b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 16 Nov 2023 22:08:00 -0500 Subject: [PATCH 368/417] treat immediate variables like equal style also for evaluating references to computes and fixes --- src/variable.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 9c0307341a..3bb49218fb 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1499,9 +1499,9 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } } - // equal-style variable is being evaluated + // equal-style or immediate variable is being evaluated - if (style[ivar] == EQUAL) { + if ((style[ivar] == EQUAL) || (ivar < 0)) { // c_ID = scalar from global scalar @@ -1767,9 +1767,9 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) } } - // equal-style variable is being evaluated + // equal-style or immediate variable is being evaluated - if (style[ivar] == EQUAL) { + if ((style[ivar] == EQUAL) || (ivar < 0)) { // f_ID = scalar from global scalar From e59a66594331af6ed18a1ab0658f5cc505922bce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 17 Nov 2023 02:06:06 -0500 Subject: [PATCH 369/417] add tests for immediate variables --- unittest/commands/test_variables.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index 90a8d013a3..bae23e4594 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -282,6 +282,13 @@ TEST_F(VariableTest, AtomicSystem) ASSERT_DOUBLE_EQ(variable->compute_equal("v_rgsum"), 3.75); ASSERT_DOUBLE_EQ(variable->compute_equal("v_sum[1]"), 1.25); + // check handling of immediate variables + ASSERT_DOUBLE_EQ(variable->compute_equal("f_press[1]"), 0.0); + ASSERT_DOUBLE_EQ(variable->compute_equal("c_press"), 0.0); + ASSERT_DOUBLE_EQ(variable->compute_equal("c_press[2]"), 0.0); + ASSERT_DOUBLE_EQ(variable->compute_equal("1.5+3.25"), 4.75); + ASSERT_DOUBLE_EQ(variable->compute_equal("-2.5*1.5"), -3.75); + TEST_FAILURE(".*ERROR: Cannot redefine variable as a different style.*", command("variable one atom x");); TEST_FAILURE(".*ERROR: Cannot redefine variable as a different style.*", @@ -294,6 +301,8 @@ TEST_F(VariableTest, AtomicSystem) variable->compute_equal("v_self");); TEST_FAILURE(".*ERROR: Variable sum2: Inconsistent lengths in vector-style variable.*", variable->compute_equal("max(v_sum2)");); + TEST_FAILURE("ERROR: Mismatched fix in variable formula.*", + variable->compute_equal("f_press");); } TEST_F(VariableTest, Expressions) From a4da55942a0970c20287739e0cee29ed0df98ac1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 17 Nov 2023 03:16:27 -0500 Subject: [PATCH 370/417] check if creating unix domain socket failed --- src/MISC/fix_ipi.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/MISC/fix_ipi.cpp b/src/MISC/fix_ipi.cpp index 69e0f2a7f3..30a6fe893d 100644 --- a/src/MISC/fix_ipi.cpp +++ b/src/MISC/fix_ipi.cpp @@ -98,7 +98,7 @@ static void open_socket(int &sockfd, int inet, int port, char *host, Error *erro // creates socket sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); - if (sockfd < 0) error->one(FLERR, "Error opening socket"); + if (sockfd < 0) error->one(FLERR, "Error creating socket for fix ipi"); // makes connection if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) @@ -116,6 +116,7 @@ static void open_socket(int &sockfd, int inet, int port, char *host, Error *erro // creates the socket sockfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (sockfd < 0) error->one(FLERR, "Error creating socket for fix ipi"); // connects if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) From 2c670e8d4438a0a3e0aecf452c7ff367b0b3d9b9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 17 Nov 2023 08:25:44 -0500 Subject: [PATCH 371/417] update version strings to 17 Nov 2023 --- doc/lammps.1 | 4 ++-- doc/src/Commands_removed.rst | 4 ++-- doc/src/compute_composition_atom.rst | 2 +- doc/src/compute_property_grid.rst | 2 +- doc/src/compute_reduce.rst | 2 +- doc/src/compute_voronoi_atom.rst | 2 +- doc/src/dump.rst | 2 +- doc/src/dump_image.rst | 2 +- doc/src/fix_deposit.rst | 2 +- doc/src/fix_pimd.rst | 2 +- src/library.cpp | 8 ++++---- src/version.h | 3 +-- 12 files changed, 17 insertions(+), 18 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index 79964d1680..766522d4aa 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,7 +1,7 @@ -.TH LAMMPS "1" "2 August 2023" "2023-08-2" +.TH LAMMPS "1" "17 November 2023" "2023-11-17" .SH NAME .B LAMMPS -\- Molecular Dynamics Simulator. Version 2 August 2023 +\- Molecular Dynamics Simulator. Version 17 November 2023 .SH SYNOPSIS .B lmp diff --git a/doc/src/Commands_removed.rst b/doc/src/Commands_removed.rst index 84cc534304..d0e723aabe 100644 --- a/doc/src/Commands_removed.rst +++ b/doc/src/Commands_removed.rst @@ -88,7 +88,7 @@ The same functionality is available through MPIIO package ------------- -.. deprecated:: TBD +.. deprecated:: 17Nov2023 The MPIIO package has been removed from LAMMPS since it was unmaintained for many years and thus not updated to incorporate required changes that @@ -107,7 +107,7 @@ see :doc:`restart `, :doc:`read_restart `, MSCG package ------------ -.. deprecated:: TBD +.. deprecated:: 17Nov2023 The MSCG package has been removed from LAMMPS since it was unmaintained for many years and instead superseded by the `OpenMSCG software diff --git a/doc/src/compute_composition_atom.rst b/doc/src/compute_composition_atom.rst index b7890fff8b..e65a3e9c95 100644 --- a/doc/src/compute_composition_atom.rst +++ b/doc/src/compute_composition_atom.rst @@ -36,7 +36,7 @@ Examples Description """"""""""" -.. versionadded:: TBD +.. versionadded:: 17Nov2023 Define a computation that calculates a local composition vector for each atom. For a central atom with :math:`M` neighbors within the neighbor cutoff sphere, diff --git a/doc/src/compute_property_grid.rst b/doc/src/compute_property_grid.rst index 20a4f19605..a0b9aba7dc 100644 --- a/doc/src/compute_property_grid.rst +++ b/doc/src/compute_property_grid.rst @@ -61,7 +61,7 @@ varying fastest, then Y, then Z slowest. For 2d grids (in 2d simulations), the grid IDs range from 1 to Nx*Ny, with X varying fastest and Y slowest. -.. versionadded:: TBD +.. versionadded:: 17Nov2023 The *proc* attribute is the ID of the processor which owns the grid cell. Processor IDs range from 0 to Nprocs - 1, where Nprocs is the diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 6820d2ee04..ba60b52563 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -201,7 +201,7 @@ information in this context, the *replace* keywords will extract the atom IDs for the two atoms in the bond of maximum stretch. These atom IDs and the bond stretch will be printed with thermodynamic output. -.. versionadded:: TBD +.. versionadded:: 17Nov2023 The *inputs* keyword allows selection of whether all the inputs are per-atom or local quantities. As noted above, all the inputs must be diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 9607401ccd..5f00a2abab 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -190,7 +190,7 @@ Voro++ software in the src/VORONOI/README file. Output info """"""""""" -.. deprecated:: TBD +.. deprecated:: 17Nov2023 The *peratom* keyword was removed as it is no longer required. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index e5885dc25d..bdaefb769e 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -613,7 +613,7 @@ when running on large numbers of processors. Note that using the "\*" and "%" characters together can produce a large number of small dump files! -.. deprecated:: TBD +.. deprecated:: 17Nov2023 The MPIIO package and the the corresponding "/mpiio" dump styles, except for the unrelated "netcdf/mpiio" style were removed from LAMMPS. diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 4e227d2f72..43f182b889 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -599,7 +599,7 @@ image will appear. The *sfactor* value must be a value 0.0 <= *sfactor* <= 1.0, where *sfactor* = 1 is a highly reflective surface and *sfactor* = 0 is a rough non-shiny surface. -.. versionadded:: TBD +.. versionadded:: 17Nov2023 The *fsaa* keyword can be used with the dump image command to improve the image quality by enabling full scene anti-aliasing. Internally the diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index 4c256f524f..ff5afc2241 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -220,7 +220,7 @@ rotated configuration of the molecule. existing particle. LAMMPS will issue a warning if R is smaller than this value, based on the radii of existing and inserted particles. -.. versionadded:: TBD +.. versionadded:: 17Nov2023 The *var* and *set* keywords can be used together to provide a criterion for accepting or rejecting the addition of an individual atom, based on its diff --git a/doc/src/fix_pimd.rst b/doc/src/fix_pimd.rst index 91c5e58add..7468ffea13 100644 --- a/doc/src/fix_pimd.rst +++ b/doc/src/fix_pimd.rst @@ -149,7 +149,7 @@ normal-mode PIMD. A value of *cmd* is for centroid molecular dynamics only the k > 0 modes are thermostatted, not the centroid degrees of freedom. -.. versionadded:: TBD +.. versionadded:: 17Nov2023 Mode *pimd* added to fix pimd/langevin. diff --git a/src/library.cpp b/src/library.cpp index 9d542f86ae..7fc79333ad 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -617,7 +617,7 @@ combined by removing the '&' and the following newline character. After this processing the string is handed to LAMMPS for parsing and executing. -.. versionadded:: TBD +.. versionadded:: 17Nov2023 The command is now able to process long strings with triple quotes and loops using :doc:`jump SELF \ `. @@ -2484,7 +2484,7 @@ int lammps_set_variable(void *handle, char *name, char *str) * \verbatim embed:rst -.. versionadded:: TBD +.. versionadded:: 17Nov2023 This function copies a string with human readable information about a defined variable: name, style, current value(s) into the provided @@ -5581,7 +5581,7 @@ int lammps_config_has_ffmpeg_support() { * \verbatim embed:rst -.. deprecated:: TBD +.. deprecated:: 17Nov2023 LAMMPS has now exceptions always enabled, so this function will now always return 1 and can be removed from applications @@ -6658,7 +6658,7 @@ the failing MPI ranks to send messages. instance, but instead would check the global error buffer of the library interface. - .. versionchanged: TBD + .. versionchanged: 17Nov2023 The *buffer* pointer may be ``NULL``. This will clear any error status without copying the error message. diff --git a/src/version.h b/src/version.h index 35780aa785..a5844f0973 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1 @@ -#define LAMMPS_VERSION "3 Aug 2023" -#define LAMMPS_UPDATE "Development" +#define LAMMPS_VERSION "17 Nov 2023" From 0083cc9e26d2ad3dcb6f19d069502ce4c630d5b7 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 17 Nov 2023 09:12:43 -0700 Subject: [PATCH 372/417] Port changes to OPENMP and INTEL packages --- src/INTEL/npair_skip_trim_intel.cpp | 271 ++++++++++++++++++++++++++++ src/INTEL/npair_skip_trim_intel.h | 62 +++++++ src/INTEL/npair_trim_intel.cpp | 5 +- src/OPENMP/npair_skip_omp.h | 12 +- src/neigh_request.h | 1 + 5 files changed, 341 insertions(+), 10 deletions(-) create mode 100644 src/INTEL/npair_skip_trim_intel.cpp create mode 100644 src/INTEL/npair_skip_trim_intel.h diff --git a/src/INTEL/npair_skip_trim_intel.cpp b/src/INTEL/npair_skip_trim_intel.cpp new file mode 100644 index 0000000000..e16e1bc413 --- /dev/null +++ b/src/INTEL/npair_skip_trim_intel.cpp @@ -0,0 +1,271 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 "npair_skip_trim_intel.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "modify.h" +#include "my_page.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "neighbor.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairSkipTrimIntel::NPairSkipTrimIntel(LAMMPS *lmp) : NPair(lmp) { + _fix = static_cast(modify->get_fix_by_id("package_intel")); + if (!_fix) error->all(FLERR, "The 'package intel' command is required for /intel styles"); + _inum_starts = new int[comm->nthreads]; + _inum_counts = new int[comm->nthreads]; + _full_props = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +NPairSkipTrimIntel::~NPairSkipTrimIntel() { + delete []_inum_starts; + delete []_inum_counts; + delete[] _full_props; +} + +/* ---------------------------------------------------------------------- */ + +void NPairSkipTrimIntel::copy_neighbor_info() +{ + NPair::copy_neighbor_info(); + // Only need to set _full_props once; npair object deleted for changes + if (_full_props) return; + _full_props = new int[neighbor->nrequest]; + for (int i = 0; i < neighbor->nrequest; i++) + _full_props[i] = neighbor->requests[i]->full; +} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + works for half and full lists + works for owned (non-ghost) list, also for ghost list + iskip and ijskip flag which atom types and type pairs to skip + if ghost, also store neighbors of ghost atoms & set inum,gnum correctly +------------------------------------------------------------------------- */ + +template +void NPairSkipTrimIntel::build_t(NeighList *list, int *numhalf, int *cnumneigh, + int *numhalf_skip, IntelBuffers *buffers) +{ + const int nlocal = atom->nlocal; + const int e_nall = nlocal + atom->nghost; + const ATOM_T * _noalias const x = buffers->get_x(); + const int * _noalias const type = atom->type; + int * _noalias const ilist = list->ilist; + int * _noalias const numneigh = list->numneigh; + int ** _noalias const firstneigh = (int ** const)list->firstneigh; // NOLINT + const int * _noalias const ilist_skip = list->listskip->ilist; + const int * _noalias const numneigh_skip = list->listskip->numneigh; + const int ** _noalias const firstneigh_skip = (const int ** const)list->listskip->firstneigh; // NOLINT + const int * _noalias const iskip = list->iskip; + const int ** _noalias const ijskip = (const int ** const)list->ijskip; // NOLINT + + const flt_t cutsq_custom = cutoff_custom * cutoff_custom; + int num_skip = list->listskip->inum; + if (list->ghost) num_skip += list->listskip->gnum; + + int packthreads; + if (comm->nthreads > INTEL_HTHREADS && THREE==0) + packthreads = comm->nthreads; + else + packthreads = 1; + + #if defined(_OPENMP) + #pragma omp parallel if (packthreads > 1) + #endif + { + int tid, ifrom, ito; + IP_PRE_omp_range_id(ifrom, ito, tid, num_skip, packthreads); + + // each thread has its own page allocator + MyPage &ipage = list->ipage[tid]; + ipage.reset(); + + int my_inum = ifrom; + _inum_starts[tid] = ifrom; + + // loop over parent full list + for (int ii = ifrom; ii < ito; ii++) { + const int i = ilist_skip[ii]; + const int itype = type[i]; + if (iskip[itype]) continue; + + const flt_t xtmp = x[i].x; + const flt_t ytmp = x[i].y; + const flt_t ztmp = x[i].z; + + int n = 0; + int *neighptr = ipage.vget(); + + // loop over parent non-skip list + + const int * _noalias const jlist = firstneigh_skip[i]; + const int jnum = numneigh_skip[i]; + + if (THREE) { + const int jnumhalf = numhalf_skip[ii]; + for (int jj = 0; jj < jnumhalf; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + + int addme = 1; + if (ijskip[itype][type[j]]) addme = 0; + + // trim to shorter cutoff + + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) addme = 0; + + if (addme) + neighptr[n++] = joriginal; + } + numhalf[my_inum] = n; + + for (int jj = jnumhalf; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + + int addme = 1; + if (ijskip[itype][type[j]]) addme = 0; + + // trim to shorter cutoff + + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) addme = 0; + + if (addme) + neighptr[n++] = joriginal; + } + } else { + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = jlist[jj]; + const int j = joriginal & NEIGHMASK; + + int addme = 1; + if (ijskip[itype][type[j]]) addme = 0; + + // trim to shorter cutoff + + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq_custom) addme = 0; + + if (addme) + neighptr[n++] = joriginal; + } + } + + ilist[my_inum++] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + + int pad_end = n; + IP_PRE_neighbor_pad(pad_end, 0); + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma loop_count min=1, max=INTEL_COMPILE_WIDTH-1, \ + avg=INTEL_COMPILE_WIDTH/2 + #endif + for ( ; n < pad_end; n++) + neighptr[n] = e_nall; + + ipage.vgot(n); + if (ipage.status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + } + + int last_inum = 0, loop_end; + _inum_counts[tid] = my_inum; + } + int inum = _inum_counts[0]; + for (int tid = 1; tid < packthreads; tid++) { + for (int i = _inum_starts[tid]; i < _inum_counts[tid]; i++) { + if (THREE) numhalf[inum] = numhalf[i]; + ilist[inum++] = ilist[i]; + } + } + list->inum = inum; + + if (THREE && num_skip > 0) { + int * const list_start = firstneigh[ilist[0]]; + for (int ii = 0; ii < inum; ii++) { + int i = ilist[ii]; + cnumneigh[ii] = static_cast(firstneigh[i] - list_start); + } + } + if (list->ghost) { + int num = 0; + int my_inum = list->inum; + for (int i = 0; i < my_inum; i++) + if (ilist[i] < nlocal) num++; + else break; + list->inum = num; + list->gnum = my_inum - num; + } +} + +/* ---------------------------------------------------------------------- */ + +void NPairSkipTrimIntel::build(NeighList *list) +{ + if (_fix->three_body_neighbor()==0 || + _full_props[list->listskip->index] == 0) { + if (_fix->precision() == FixIntel::PREC_MODE_MIXED) + build_t(list, nullptr, nullptr, nullptr, _fix->get_mixed_buffers()); + else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) + build_t(list, nullptr, nullptr, nullptr, _fix->get_double_buffers()); + else + build_t(list, nullptr, nullptr, nullptr, _fix->get_single_buffers()); + } else { + int *nhalf, *cnumneigh, *nhalf_skip, *u; + if (_fix->precision() == FixIntel::PREC_MODE_MIXED) { + _fix->get_mixed_buffers()->get_list_data3(list->listskip,nhalf_skip,u); + _fix->get_mixed_buffers()->grow_data3(list, nhalf, cnumneigh); + build_t(list, nhalf, cnumneigh, nhalf_skip, _fix->get_mixed_buffers()); + } else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) { + _fix->get_double_buffers()->get_list_data3(list->listskip,nhalf_skip,u); + _fix->get_double_buffers()->grow_data3(list, nhalf, cnumneigh); + build_t(list, nhalf, cnumneigh, nhalf_skip, _fix->get_double_buffers()); + } else { + _fix->get_single_buffers()->get_list_data3(list->listskip,nhalf_skip,u); + _fix->get_single_buffers()->grow_data3(list,nhalf,cnumneigh); + build_t(list, nhalf, cnumneigh, nhalf_skip, _fix->get_single_buffers()); + } + } +} diff --git a/src/INTEL/npair_skip_trim_intel.h b/src/INTEL/npair_skip_trim_intel.h new file mode 100644 index 0000000000..f0018e5df4 --- /dev/null +++ b/src/INTEL/npair_skip_trim_intel.h @@ -0,0 +1,62 @@ +// clang-format off +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 NPAIR_CLASS +// clang-format off +NPairStyle(skip/trim/intel, + NPairSkipTrimIntel, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_INTEL); + +NPairStyle(skip/trim/ghost/intel, + NPairSkipTrimIntel, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_GHOST | NP_INTEL); +// clang-format on +#else + +#ifndef LMP_NPAIR_SKIP_TRIM_INTEL_H +#define LMP_NPAIR_SKIP_TRIM_INTEL_H + +#include "fix_intel.h" +#include "npair.h" + +#if defined(_OPENMP) +#include +#endif + +namespace LAMMPS_NS { + +class NPairSkipTrimIntel : public NPair { + public: + NPairSkipTrimIntel(class LAMMPS *); + ~NPairSkipTrimIntel() override; + void copy_neighbor_info() override; + void build(class NeighList *) override; + + protected: + FixIntel *_fix; + int *_inum_starts, *_inum_counts, *_full_props; + + template + void build_t(NeighList *, int *numhalf, int *cnumneigh, int *numhalf_skip, + IntelBuffers *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/INTEL/npair_trim_intel.cpp b/src/INTEL/npair_trim_intel.cpp index d377419f1b..dcf10a3c87 100644 --- a/src/INTEL/npair_trim_intel.cpp +++ b/src/INTEL/npair_trim_intel.cpp @@ -88,7 +88,6 @@ void NPairTrimIntel::build_t(NeighList *list, for (int jj = 0; jj < jnum; jj++) { const int joriginal = jlist[jj]; const int j = joriginal & NEIGHMASK; - int addme = 1; // trim to shorter cutoff @@ -97,9 +96,7 @@ void NPairTrimIntel::build_t(NeighList *list, const flt_t delz = ztmp - x[j].z; const flt_t rsq = delx * delx + dely * dely + delz * delz; - if (rsq > cutsq_custom) addme = 0; - - if (addme) + if (rsq <= cutsq_custom) neighptr[n++] = joriginal; } diff --git a/src/OPENMP/npair_skip_omp.h b/src/OPENMP/npair_skip_omp.h index ce61968c17..a733308ccb 100644 --- a/src/OPENMP/npair_skip_omp.h +++ b/src/OPENMP/npair_skip_omp.h @@ -20,36 +20,36 @@ NPairStyle(skip/omp, NPairSkip, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); NPairStyle(skip/half/respa/omp, NPairSkipRespa, NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); NPairStyle(skip/half/size/omp, NPairSkipSize, NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); NPairStyle(skip/size/off2on/omp, NPairSkipSizeOff2on, NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); NPairStyle(skip/size/off2on/oneside/omp, NPairSkipSizeOff2onOneside, NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | - NP_ORTHO | NP_TRI | NP_OMP); + NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); NPairStyle(skip/ghost/omp, NPairSkip, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP | NP_GHOST); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP | NP_GHOST); // clang-format off #endif diff --git a/src/neigh_request.h b/src/neigh_request.h index a3114dff82..fa57922c93 100644 --- a/src/neigh_request.h +++ b/src/neigh_request.h @@ -26,6 +26,7 @@ class NeighRequest : protected Pointers { friend class NStencil; friend class NeighborKokkos; friend class NPairSkipIntel; + friend class NPairSkipTrimIntel; friend class FixIntel; protected: From 06b962fc339312ef471f6e6fe12b038cb2c9ff9e Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 17 Nov 2023 09:50:03 -0700 Subject: [PATCH 373/417] Bugfix: port missed changes from #3846 --- src/OPENMP/npair_halffull_newton_trim_omp.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/OPENMP/npair_halffull_newton_trim_omp.cpp b/src/OPENMP/npair_halffull_newton_trim_omp.cpp index 1446175013..9fdd4957af 100644 --- a/src/OPENMP/npair_halffull_newton_trim_omp.cpp +++ b/src/OPENMP/npair_halffull_newton_trim_omp.cpp @@ -38,6 +38,8 @@ NPairHalffullNewtonTrimOmp::NPairHalffullNewtonTrimOmp(LAMMPS *lmp) : NPair(lmp) void NPairHalffullNewtonTrimOmp::build(NeighList *list) { const int inum_full = list->listfull->inum; + const double delta = 0.01 * force->angstrom; + const int triclinic = domain->triclinic; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -86,8 +88,17 @@ void NPairHalffullNewtonTrimOmp::build(NeighList *list) for (jj = 0; jj < jnum; jj++) { joriginal = jlist[jj]; j = joriginal & NEIGHMASK; + if (j < nlocal) { if (i > j) continue; + } else if (triclinic) { + if (fabs(x[j][2]-ztmp) > delta) { + if (x[j][2] < ztmp) continue; + } else if (fabs(x[j][1]-ytmp) > delta) { + if (x[j][1] < ytmp) continue; + } else { + if (x[j][0] < xtmp) continue; + } } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp) { From 6fc7f5689b06362181677ea7fb7394fa3f726742 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 17 Nov 2023 10:04:11 -0700 Subject: [PATCH 374/417] Port changes to OPENMP package --- src/OPENMP/npair_skip_omp.h | 12 +++---- src/OPENMP/npair_skip_trim_omp.h | 55 ++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 src/OPENMP/npair_skip_trim_omp.h diff --git a/src/OPENMP/npair_skip_omp.h b/src/OPENMP/npair_skip_omp.h index a733308ccb..ce61968c17 100644 --- a/src/OPENMP/npair_skip_omp.h +++ b/src/OPENMP/npair_skip_omp.h @@ -20,36 +20,36 @@ NPairStyle(skip/omp, NPairSkip, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); NPairStyle(skip/half/respa/omp, NPairSkipRespa, NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); NPairStyle(skip/half/size/omp, NPairSkipSize, NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); NPairStyle(skip/size/off2on/omp, NPairSkipSizeOff2on, NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP); NPairStyle(skip/size/off2on/oneside/omp, NPairSkipSizeOff2onOneside, NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | - NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + NP_ORTHO | NP_TRI | NP_OMP); NPairStyle(skip/ghost/omp, NPairSkip, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP | NP_GHOST); + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_OMP | NP_GHOST); // clang-format off #endif diff --git a/src/OPENMP/npair_skip_trim_omp.h b/src/OPENMP/npair_skip_trim_omp.h new file mode 100644 index 0000000000..aba6f50e17 --- /dev/null +++ b/src/OPENMP/npair_skip_trim_omp.h @@ -0,0 +1,55 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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. +------------------------------------------------------------------------- */ + +// There is no benefit from multi-threading for skip lists, so we +// just forward the requests to the corresponding non-omp versions. + +#ifdef NPAIR_CLASS +// clang-format off +NPairStyle(skip/trim/omp, + NPairSkipTrim, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + +NPairStyle(skip/trim/half/respa/omp, + NPairSkipTrimRespa, + NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + +NPairStyle(skip/trim/half/size/omp, + NPairSkipTrimSize, + NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + +NPairStyle(skip/trim/size/off2on/omp, + NPairSkipTrimSizeOff2on, + NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + +NPairStyle(skip/trim/size/off2on/oneside/omp, + NPairSkipTrimSizeOff2onOneside, + NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | + NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); + +NPairStyle(skip/trim/ghost/omp, + NPairSkipTrim, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP | NP_GHOST); +// clang-format off +#endif + From be19b5c210c08988da430db330bb72a2b7c73703 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 17 Nov 2023 12:46:45 -0700 Subject: [PATCH 375/417] Make naming consistent --- ....h => npair_halffull_trim_newtoff_intel.h} | 22 +++++++------- ...p => npair_halffull_trim_newton_intel.cpp} | 10 +++---- ...l.h => npair_halffull_trim_newton_intel.h} | 16 +++++----- src/KOKKOS/npair_skip_kokkos.h | 8 ++--- ...pp => npair_halffull_trim_newtoff_omp.cpp} | 6 ++-- ...mp.h => npair_halffull_trim_newtoff_omp.h} | 18 +++++------ ...cpp => npair_halffull_trim_newton_omp.cpp} | 8 +++-- ...omp.h => npair_halffull_trim_newton_omp.h} | 16 +++++----- ...im.cpp => npair_halffull_trim_newtoff.cpp} | 6 ++-- ...f_trim.h => npair_halffull_trim_newtoff.h} | 30 +++++++++---------- ...rim.cpp => npair_halffull_trim_newton.cpp} | 6 ++-- ...on_trim.h => npair_halffull_trim_newton.h} | 18 +++++------ ...spa_trim.cpp => npair_skip_trim_respa.cpp} | 6 ++-- ...p_respa_trim.h => npair_skip_trim_respa.h} | 12 ++++---- ...size_trim.cpp => npair_skip_trim_size.cpp} | 6 ++-- ...kip_size_trim.h => npair_skip_trim_size.h} | 12 ++++---- ...im.cpp => npair_skip_trim_size_off2on.cpp} | 6 ++-- ...n_trim.h => npair_skip_trim_size_off2on.h} | 12 ++++---- ...> npair_skip_trim_size_off2on_oneside.cpp} | 6 ++-- ... => npair_skip_trim_size_off2on_oneside.h} | 12 ++++---- 20 files changed, 119 insertions(+), 117 deletions(-) rename src/INTEL/{npair_halffull_newtoff_trim_intel.h => npair_halffull_trim_newtoff_intel.h} (72%) rename src/INTEL/{npair_halffull_newton_trim_intel.cpp => npair_halffull_trim_newton_intel.cpp} (97%) rename src/INTEL/{npair_halffull_newton_trim_intel.h => npair_halffull_trim_newton_intel.h} (81%) rename src/OPENMP/{npair_halffull_newtoff_trim_omp.cpp => npair_halffull_trim_newtoff_omp.cpp} (94%) rename src/OPENMP/{npair_halffull_newtoff_trim_omp.h => npair_halffull_trim_newtoff_omp.h} (72%) rename src/OPENMP/{npair_halffull_newton_trim_omp.cpp => npair_halffull_trim_newton_omp.cpp} (94%) rename src/OPENMP/{npair_halffull_newton_trim_omp.h => npair_halffull_trim_newton_omp.h} (76%) rename src/{npair_halffull_newtoff_trim.cpp => npair_halffull_trim_newtoff.cpp} (94%) rename src/{npair_halffull_newtoff_trim.h => npair_halffull_trim_newtoff.h} (66%) rename src/{npair_halffull_newton_trim.cpp => npair_halffull_trim_newton.cpp} (95%) rename src/{npair_halffull_newton_trim.h => npair_halffull_trim_newton.h} (74%) rename src/{npair_skip_respa_trim.cpp => npair_skip_trim_respa.cpp} (97%) rename src/{npair_skip_respa_trim.h => npair_skip_trim_respa.h} (82%) rename src/{npair_skip_size_trim.cpp => npair_skip_trim_size.cpp} (95%) rename src/{npair_skip_size_trim.h => npair_skip_trim_size.h} (82%) rename src/{npair_skip_size_off2on_trim.cpp => npair_skip_trim_size_off2on.cpp} (95%) rename src/{npair_skip_size_off2on_trim.h => npair_skip_trim_size_off2on.h} (80%) rename src/{npair_skip_size_off2on_oneside_trim.cpp => npair_skip_trim_size_off2on_oneside.cpp} (96%) rename src/{npair_skip_size_off2on_oneside_trim.h => npair_skip_trim_size_off2on_oneside.h} (78%) diff --git a/src/INTEL/npair_halffull_newtoff_trim_intel.h b/src/INTEL/npair_halffull_trim_newtoff_intel.h similarity index 72% rename from src/INTEL/npair_halffull_newtoff_trim_intel.h rename to src/INTEL/npair_halffull_trim_newtoff_intel.h index d8594ce3b8..5e8b01cd09 100644 --- a/src/INTEL/npair_halffull_newtoff_trim_intel.h +++ b/src/INTEL/npair_halffull_trim_newtoff_intel.h @@ -21,24 +21,24 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(halffull/newtoff/trim/intel, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/intel, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | NP_ORTHO | NP_TRI | NP_TRIM | NP_INTEL); -NPairStyle(halffull/newtoff/skip/trim/intel, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/skip/intel, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | - NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_INTEL); + NP_ORTHO | NP_TRI | NP_TRIM | NP_SKIP | NP_INTEL); -NPairStyle(halffull/newtoff/ghost/trim/intel, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/ghost/intel, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | - NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM | NP_INTEL); + NP_ORTHO | NP_TRI | NP_TRIM | NP_GHOST | NP_INTEL); -NPairStyle(halffull/newtoff/skip/ghost/trim/intel, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/skip/ghost/intel, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | - NP_ORTHO | NP_TRI | NP_SKIP | NP_GHOST | NP_TRIM | NP_INTEL); + NP_ORTHO | NP_TRI | NP_TRIM | NP_SKIP | NP_GHOST | NP_INTEL); // clang-format on #endif diff --git a/src/INTEL/npair_halffull_newton_trim_intel.cpp b/src/INTEL/npair_halffull_trim_newton_intel.cpp similarity index 97% rename from src/INTEL/npair_halffull_newton_trim_intel.cpp rename to src/INTEL/npair_halffull_trim_newton_intel.cpp index 34b9b20e9c..b1b69734a4 100644 --- a/src/INTEL/npair_halffull_newton_trim_intel.cpp +++ b/src/INTEL/npair_halffull_trim_newton_intel.cpp @@ -16,7 +16,7 @@ Contributing author: Stan Moore (SNL) ------------------------------------------------------------------------- */ -#include "npair_halffull_newton_trim_intel.h" +#include "npair_halffull_trim_newton_intel.h" #include "atom.h" #include "comm.h" @@ -31,7 +31,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalffullNewtonTrimIntel::NPairHalffullNewtonTrimIntel(LAMMPS *lmp) : NPair(lmp) { +NPairHalffullTrimNewtonIntel::NPairHalffullTrimNewtonIntel(LAMMPS *lmp) : NPair(lmp) { _fix = static_cast(modify->get_fix_by_id("package_intel")); if (!_fix) error->all(FLERR, "The 'package intel' command is required for /intel styles"); } @@ -44,7 +44,7 @@ NPairHalffullNewtonTrimIntel::NPairHalffullNewtonTrimIntel(LAMMPS *lmp) : NPair( ------------------------------------------------------------------------- */ template -void NPairHalffullNewtonTrimIntel::build_t(NeighList *list, +void NPairHalffullTrimNewtonIntel::build_t(NeighList *list, IntelBuffers *buffers) { const int inum_full = list->listfull->inum; @@ -182,7 +182,7 @@ void NPairHalffullNewtonTrimIntel::build_t(NeighList *list, ------------------------------------------------------------------------- */ template -void NPairHalffullNewtonTrimIntel::build_t3(NeighList *list, int *numhalf, +void NPairHalffullTrimNewtonIntel::build_t3(NeighList *list, int *numhalf, IntelBuffers *buffers) { const int inum_full = list->listfull->inum; @@ -272,7 +272,7 @@ void NPairHalffullNewtonTrimIntel::build_t3(NeighList *list, int *numhalf, /* ---------------------------------------------------------------------- */ -void NPairHalffullNewtonTrimIntel::build(NeighList *list) +void NPairHalffullTrimNewtonIntel::build(NeighList *list) { if (_fix->three_body_neighbor() == 0 || domain->triclinic) { if (_fix->precision() == FixIntel::PREC_MODE_MIXED) diff --git a/src/INTEL/npair_halffull_newton_trim_intel.h b/src/INTEL/npair_halffull_trim_newton_intel.h similarity index 81% rename from src/INTEL/npair_halffull_newton_trim_intel.h rename to src/INTEL/npair_halffull_trim_newton_intel.h index 0ca551d682..dfce63e93d 100644 --- a/src/INTEL/npair_halffull_newton_trim_intel.h +++ b/src/INTEL/npair_halffull_trim_newton_intel.h @@ -18,20 +18,20 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(halffull/newton/trim/intel, - NPairHalffullNewtonTrimIntel, +NPairStyle(halffull/trim/newton/intel, + NPairHalffullTrimNewtonIntel, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI| NP_TRIM | NP_INTEL); -NPairStyle(halffull/newton/skip/trim/intel, - NPairHalffullNewtonTrimIntel, +NPairStyle(halffull/trim/newton/skip/intel, + NPairHalffullTrimNewtonIntel, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_INTEL); // clang-format on #else -#ifndef LMP_NPAIR_HALFFULL_NEWTON_TRIM_INTEL_H -#define LMP_NPAIR_HALFFULL_NEWTON_TRIM_INTEL_H +#ifndef LMP_NPAIR_HALFFULL_TRIM_NEWTON_INTEL_H +#define LMP_NPAIR_HALFFULL_TRIM_NEWTON_INTEL_H #include "fix_intel.h" #include "npair.h" @@ -42,9 +42,9 @@ NPairStyle(halffull/newton/skip/trim/intel, namespace LAMMPS_NS { -class NPairHalffullNewtonTrimIntel : public NPair { +class NPairHalffullTrimNewtonIntel : public NPair { public: - NPairHalffullNewtonTrimIntel(class LAMMPS *); + NPairHalffullTrimNewtonIntel(class LAMMPS *); void build(class NeighList *) override; protected: diff --git a/src/KOKKOS/npair_skip_kokkos.h b/src/KOKKOS/npair_skip_kokkos.h index 7672a2c36c..293c53677b 100644 --- a/src/KOKKOS/npair_skip_kokkos.h +++ b/src/KOKKOS/npair_skip_kokkos.h @@ -42,28 +42,28 @@ NPairStyle(skip/ghost/kk/host, NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST); typedef NPairSkipKokkos NPairKokkosSkipTrimDevice; -NPairStyle(skip/kk/device, +NPairStyle(skip/trim/kk/device, NPairKokkosSkipTrimDevice, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM |NP_KOKKOS_DEVICE); typedef NPairSkipKokkos NPairKokkosSkipTrimGhostDevice; -NPairStyle(skip/ghost/kk/device, +NPairStyle(skip/trim/ghost/kk/device, NPairKokkosSkipTrimGhostDevice, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_GHOST | NP_KOKKOS_DEVICE); typedef NPairSkipKokkos NPairKokkosSkipTrimHost; -NPairStyle(skip/kk/host, +NPairStyle(skip/trim/kk/host, NPairKokkosSkipTrimHost, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM | NP_KOKKOS_HOST); typedef NPairSkipKokkos NPairKokkosSkipTrimGhostHost; -NPairStyle(skip/ghost/kk/host, +NPairStyle(skip/trim/ghost/kk/host, NPairKokkosSkipTrimGhostHost, NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | diff --git a/src/OPENMP/npair_halffull_newtoff_trim_omp.cpp b/src/OPENMP/npair_halffull_trim_newtoff_omp.cpp similarity index 94% rename from src/OPENMP/npair_halffull_newtoff_trim_omp.cpp rename to src/OPENMP/npair_halffull_trim_newtoff_omp.cpp index d35b3b2ee8..d0c5c1ab86 100644 --- a/src/OPENMP/npair_halffull_newtoff_trim_omp.cpp +++ b/src/OPENMP/npair_halffull_trim_newtoff_omp.cpp @@ -12,7 +12,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_halffull_newtoff_trim_omp.h" +#include "npair_halffull_trim_newtoff_omp.h" #include "atom.h" #include "error.h" @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalffullNewtoffTrimOmp::NPairHalffullNewtoffTrimOmp(LAMMPS *lmp) : NPair(lmp) {} +NPairHalffullTrimNewtoffOmp::NPairHalffullTrimNewtoffOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build half list from full list and trim to shorter cutoff @@ -35,7 +35,7 @@ NPairHalffullNewtoffTrimOmp::NPairHalffullNewtoffTrimOmp(LAMMPS *lmp) : NPair(lm works if full list is a skip list ------------------------------------------------------------------------- */ -void NPairHalffullNewtoffTrimOmp::build(NeighList *list) +void NPairHalffullTrimNewtoffOmp::build(NeighList *list) { const int inum_full = list->listfull->inum; diff --git a/src/OPENMP/npair_halffull_newtoff_trim_omp.h b/src/OPENMP/npair_halffull_trim_newtoff_omp.h similarity index 72% rename from src/OPENMP/npair_halffull_newtoff_trim_omp.h rename to src/OPENMP/npair_halffull_trim_newtoff_omp.h index 19e1c55eeb..c86c132b69 100644 --- a/src/OPENMP/npair_halffull_newtoff_trim_omp.h +++ b/src/OPENMP/npair_halffull_trim_newtoff_omp.h @@ -13,28 +13,28 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(halffull/newtoff/trim/omp, - NPairHalffullNewtoffTrimOmp, +NPairStyle(halffull/trim/newtoff/omp, + NPairHalffullTrimNewtoffOmp, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_HALF | NP_ORTHO | NP_TRI | NP_TRIM | NP_OMP); -NPairStyle(halffull/newtoff/skip/trim/omp, - NPairHalffullNewtoffTrimOmp, +NPairStyle(halffull/trim/newtoff/skip/omp, + NPairHalffullTrimNewtoffOmp, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_HALF | - NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_OMP); + NP_ORTHO | NP_TRI | NP_TRIM | NP_SKIP | NP_OMP); // clang-format on #else -#ifndef LMP_NPAIR_HALFFULL_NEWTOFF_TRIM_OMP_H -#define LMP_NPAIR_HALFFULL_NEWTOFF_TRIM_OMP_H +#ifndef LMP_NPAIR_HALFFULL_TRIM_NEWTOFF_OMP_H +#define LMP_NPAIR_HALFFULL_TRIM_NEWTOFF_OMP_H #include "npair.h" namespace LAMMPS_NS { -class NPairHalffullNewtoffTrimOmp : public NPair { +class NPairHalffullTrimNewtoffOmp : public NPair { public: - NPairHalffullNewtoffTrimOmp(class LAMMPS *); + NPairHalffullTrimNewtoffOmp(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/OPENMP/npair_halffull_newton_trim_omp.cpp b/src/OPENMP/npair_halffull_trim_newton_omp.cpp similarity index 94% rename from src/OPENMP/npair_halffull_newton_trim_omp.cpp rename to src/OPENMP/npair_halffull_trim_newton_omp.cpp index 9fdd4957af..bd9d553eb9 100644 --- a/src/OPENMP/npair_halffull_newton_trim_omp.cpp +++ b/src/OPENMP/npair_halffull_trim_newton_omp.cpp @@ -12,10 +12,12 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_halffull_newton_trim_omp.h" +#include "npair_halffull_trim_newton_omp.h" #include "atom.h" +#include "domain.h" #include "error.h" +#include "force.h" #include "my_page.h" #include "neigh_list.h" #include "npair_omp.h" @@ -26,7 +28,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalffullNewtonTrimOmp::NPairHalffullNewtonTrimOmp(LAMMPS *lmp) : NPair(lmp) {} +NPairHalffullTrimNewtonOmp::NPairHalffullTrimNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build half list from full list and trim to shorter cutoff @@ -35,7 +37,7 @@ NPairHalffullNewtonTrimOmp::NPairHalffullNewtonTrimOmp(LAMMPS *lmp) : NPair(lmp) works if full list is a skip list ------------------------------------------------------------------------- */ -void NPairHalffullNewtonTrimOmp::build(NeighList *list) +void NPairHalffullTrimNewtonOmp::build(NeighList *list) { const int inum_full = list->listfull->inum; const double delta = 0.01 * force->angstrom; diff --git a/src/OPENMP/npair_halffull_newton_trim_omp.h b/src/OPENMP/npair_halffull_trim_newton_omp.h similarity index 76% rename from src/OPENMP/npair_halffull_newton_trim_omp.h rename to src/OPENMP/npair_halffull_trim_newton_omp.h index 4cb84f1b3a..c6950dfa45 100644 --- a/src/OPENMP/npair_halffull_newton_trim_omp.h +++ b/src/OPENMP/npair_halffull_trim_newton_omp.h @@ -13,28 +13,28 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(halffull/newton/trim/omp, - NPairHalffullNewtonTrimOmp, +NPairStyle(halffull/trim/newton/omp, + NPairHalffullTrimNewtonOmp, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_ORTHO | NP_TRI| NP_TRIM | NP_OMP); -NPairStyle(halffull/newton/skip/trim/omp, - NPairHalffullNewtonTrimOmp, +NPairStyle(halffull/trim/newton/skip/omp, + NPairHalffullTrimNewtonOmp, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM | NP_OMP); // clang-format on #else -#ifndef LMP_NPAIR_HALFFULL_NEWTON_TRIM_OMP_H -#define LMP_NPAIR_HALFFULL_NEWTON_TRIM_OMP_H +#ifndef LMP_NPAIR_HALFFULL_TRIM_NEWTON_OMP_H +#define LMP_NPAIR_HALFFULL_TRIM_NEWTON_OMP_H #include "npair.h" namespace LAMMPS_NS { -class NPairHalffullNewtonTrimOmp : public NPair { +class NPairHalffullTrimNewtonOmp : public NPair { public: - NPairHalffullNewtonTrimOmp(class LAMMPS *); + NPairHalffullTrimNewtonOmp(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/npair_halffull_newtoff_trim.cpp b/src/npair_halffull_trim_newtoff.cpp similarity index 94% rename from src/npair_halffull_newtoff_trim.cpp rename to src/npair_halffull_trim_newtoff.cpp index 8ed392da2f..db97bf185a 100644 --- a/src/npair_halffull_newtoff_trim.cpp +++ b/src/npair_halffull_trim_newtoff.cpp @@ -11,7 +11,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_halffull_newtoff_trim.h" +#include "npair_halffull_trim_newtoff.h" #include "atom.h" #include "error.h" @@ -22,7 +22,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalffullNewtoffTrim::NPairHalffullNewtoffTrim(LAMMPS *lmp) : NPair(lmp) {} +NPairHalffullTrimNewtoff::NPairHalffullTrimNewtoff(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build half list from full list @@ -33,7 +33,7 @@ NPairHalffullNewtoffTrim::NPairHalffullNewtoffTrim(LAMMPS *lmp) : NPair(lmp) {} if ghost, also store neighbors of ghost atoms & set inum,gnum correctly ------------------------------------------------------------------------- */ -void NPairHalffullNewtoffTrim::build(NeighList *list) +void NPairHalffullTrimNewtoff::build(NeighList *list) { int i, j, ii, jj, n, jnum, joriginal; int *neighptr, *jlist; diff --git a/src/npair_halffull_newtoff_trim.h b/src/npair_halffull_trim_newtoff.h similarity index 66% rename from src/npair_halffull_newtoff_trim.h rename to src/npair_halffull_trim_newtoff.h index 0fe730f9c1..ca7726c837 100644 --- a/src/npair_halffull_newtoff_trim.h +++ b/src/npair_halffull_trim_newtoff.h @@ -13,38 +13,38 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(halffull/newtoff/trim, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_HALF | NP_ORTHO | NP_TRI | NP_TRIM); -NPairStyle(halffull/newtoff/skip/trim, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/skip, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_HALF | - NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM); + NP_ORTHO | NP_TRI | NP_TRIM | NP_SKIP); -NPairStyle(halffull/newtoff/ghost/trim, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/ghost, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_HALF | - NP_ORTHO | NP_TRI | NP_GHOST | NP_TRIM); + NP_ORTHO | NP_TRI | NP_TRIM | NP_GHOST); -NPairStyle(halffull/newtoff/skip/ghost/trim, - NPairHalffullNewtoffTrim, +NPairStyle(halffull/trim/newtoff/skip/ghost, + NPairHalffullTrimNewtoff, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_HALF | - NP_ORTHO | NP_TRI | NP_SKIP | NP_GHOST | NP_TRIM); + NP_ORTHO | NP_TRI | NP_TRIM | NP_SKIP | NP_GHOST); // clang-format on #else -#ifndef LMP_NPAIR_HALFFULL_NEWTOFF_TRIM_H -#define LMP_NPAIR_HALFFULL_NEWTOFF_TRIM_H +#ifndef LMP_NPAIR_HALFFULL_TRIM_NEWTOFF_H +#define LMP_NPAIR_HALFFULL_TRIM_NEWTOFF_H #include "npair.h" namespace LAMMPS_NS { -class NPairHalffullNewtoffTrim : public NPair { +class NPairHalffullTrimNewtoff : public NPair { public: - NPairHalffullNewtoffTrim(class LAMMPS *); + NPairHalffullTrimNewtoff(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/npair_halffull_newton_trim.cpp b/src/npair_halffull_trim_newton.cpp similarity index 95% rename from src/npair_halffull_newton_trim.cpp rename to src/npair_halffull_trim_newton.cpp index e758c04284..56cef00b25 100644 --- a/src/npair_halffull_newton_trim.cpp +++ b/src/npair_halffull_trim_newton.cpp @@ -11,7 +11,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_halffull_newton_trim.h" +#include "npair_halffull_trim_newton.h" #include "atom.h" #include "domain.h" @@ -24,7 +24,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalffullNewtonTrim::NPairHalffullNewtonTrim(LAMMPS *lmp) : NPair(lmp) {} +NPairHalffullTrimNewton::NPairHalffullTrimNewton(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build half list from full list @@ -33,7 +33,7 @@ NPairHalffullNewtonTrim::NPairHalffullNewtonTrim(LAMMPS *lmp) : NPair(lmp) {} works if full list is a skip list ------------------------------------------------------------------------- */ -void NPairHalffullNewtonTrim::build(NeighList *list) +void NPairHalffullTrimNewton::build(NeighList *list) { int i, j, ii, jj, n, jnum, joriginal; int *neighptr, *jlist; diff --git a/src/npair_halffull_newton_trim.h b/src/npair_halffull_trim_newton.h similarity index 74% rename from src/npair_halffull_newton_trim.h rename to src/npair_halffull_trim_newton.h index aad3edcbfb..5eb5aa3cd3 100644 --- a/src/npair_halffull_newton_trim.h +++ b/src/npair_halffull_trim_newton.h @@ -13,28 +13,28 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(halffull/newton/trim, - NPairHalffullNewtonTrim, +NPairStyle(halffull/trim/newton, + NPairHalffullTrimNewton, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_ORTHO | NP_TRI | NP_TRIM); -NPairStyle(halffull/newton/skip/trim, - NPairHalffullNewtonTrim, +NPairStyle(halffull/trim/newton/skip, + NPairHalffullTrimNewton, NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | - NP_ORTHO | NP_TRI | NP_SKIP | NP_TRIM); + NP_ORTHO | NP_TRI | NP_TRIM | NP_SKIP); // clang-format on #else -#ifndef LMP_NPAIR_HALFFULL_NEWTON_TRIM_H -#define LMP_NPAIR_HALFFULL_NEWTON_TRIM_H +#ifndef LMP_NPAIR_HALFFULL_TRIM_NEWTON_H +#define LMP_NPAIR_HALFFULL_TRIM_NEWTON_H #include "npair.h" namespace LAMMPS_NS { -class NPairHalffullNewtonTrim : public NPair { +class NPairHalffullTrimNewton : public NPair { public: - NPairHalffullNewtonTrim(class LAMMPS *); + NPairHalffullTrimNewton(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/npair_skip_respa_trim.cpp b/src/npair_skip_trim_respa.cpp similarity index 97% rename from src/npair_skip_respa_trim.cpp rename to src/npair_skip_trim_respa.cpp index 64b1c4d716..7dd040ca0a 100644 --- a/src/npair_skip_respa_trim.cpp +++ b/src/npair_skip_trim_respa.cpp @@ -12,7 +12,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_skip_respa_trim.h" +#include "npair_skip_trim_respa.h" #include "atom.h" #include "error.h" @@ -23,7 +23,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairSkipRespaTrim::NPairSkipRespaTrim(LAMMPS *lmp) : NPair(lmp) {} +NPairSkipTrimRespa::NPairSkipTrimRespa(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build skip list for subset of types from parent list @@ -31,7 +31,7 @@ NPairSkipRespaTrim::NPairSkipRespaTrim(LAMMPS *lmp) : NPair(lmp) {} this is for respa lists, copy the inner/middle values from parent ------------------------------------------------------------------------- */ -void NPairSkipRespaTrim::build(NeighList *list) +void NPairSkipTrimRespa::build(NeighList *list) { int i,j,ii,jj,n,itype,jnum,joriginal,n_inner,n_middle; int *neighptr,*jlist,*neighptr_inner,*neighptr_middle; diff --git a/src/npair_skip_respa_trim.h b/src/npair_skip_trim_respa.h similarity index 82% rename from src/npair_skip_respa_trim.h rename to src/npair_skip_trim_respa.h index f10b726cbe..dcfe71c28d 100644 --- a/src/npair_skip_respa_trim.h +++ b/src/npair_skip_trim_respa.h @@ -13,24 +13,24 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(skip/half/respa/trim, - NPairSkipRespaTrim, +NPairStyle(skip/trim/half/respa, + NPairSkipTrimRespa, NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); // clang-format on #else -#ifndef LMP_NPAIR_SKIP_RESPA_TRIM_H -#define LMP_NPAIR_SKIP_RESPA_TRIM_H +#ifndef LMP_NPAIR_SKIP_TRIM_RESPA_H +#define LMP_NPAIR_SKIP_TRIM_RESPA_H #include "npair.h" namespace LAMMPS_NS { -class NPairSkipRespaTrim : public NPair { +class NPairSkipTrimRespa : public NPair { public: - NPairSkipRespaTrim(class LAMMPS *); + NPairSkipTrimRespa(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/npair_skip_size_trim.cpp b/src/npair_skip_trim_size.cpp similarity index 95% rename from src/npair_skip_size_trim.cpp rename to src/npair_skip_trim_size.cpp index 3fd8f912f9..fab70a78b5 100644 --- a/src/npair_skip_size_trim.cpp +++ b/src/npair_skip_trim_size.cpp @@ -11,7 +11,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_skip_size_trim.h" +#include "npair_skip_trim_size.h" #include "atom.h" #include "error.h" @@ -22,14 +22,14 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairSkipSizeTrim::NPairSkipSizeTrim(LAMMPS *lmp) : NPair(lmp) {} +NPairSkipTrimSize::NPairSkipTrimSize(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build skip list for subset of types from parent list iskip and ijskip flag which atom types and type pairs to skip ------------------------------------------------------------------------- */ -void NPairSkipSizeTrim::build(NeighList *list) +void NPairSkipTrimSize::build(NeighList *list) { int i, j, ii, jj, n, itype, jnum, joriginal; int *neighptr, *jlist; diff --git a/src/npair_skip_size_trim.h b/src/npair_skip_trim_size.h similarity index 82% rename from src/npair_skip_size_trim.h rename to src/npair_skip_trim_size.h index e94b2f5f29..3b536860ca 100644 --- a/src/npair_skip_size_trim.h +++ b/src/npair_skip_trim_size.h @@ -13,23 +13,23 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(skip/half/size/trim, - NPairSkipSizeTrim, +NPairStyle(skip/trim/half/size, + NPairSkipTrimSize, NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); // clang-format on #else -#ifndef LMP_NPAIR_SKIP_SIZE_TRIM_H -#define LMP_NPAIR_SKIP_SIZE_TRIM_H +#ifndef LMP_NPAIR_SKIP_TRIM_SIZE_H +#define LMP_NPAIR_SKIP_TRIM_SIZE_H #include "npair.h" namespace LAMMPS_NS { -class NPairSkipSizeTrim : public NPair { +class NPairSkipTrimSize : public NPair { public: - NPairSkipSizeTrim(class LAMMPS *); + NPairSkipTrimSize(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/npair_skip_size_off2on_trim.cpp b/src/npair_skip_trim_size_off2on.cpp similarity index 95% rename from src/npair_skip_size_off2on_trim.cpp rename to src/npair_skip_trim_size_off2on.cpp index 9591bbc4eb..3e9a1e5f63 100644 --- a/src/npair_skip_size_off2on_trim.cpp +++ b/src/npair_skip_trim_size_off2on.cpp @@ -11,7 +11,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_skip_size_off2on_trim.h" +#include "npair_skip_trim_size_off2on.h" #include "atom.h" #include "error.h" @@ -22,7 +22,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairSkipSizeOff2onTrim::NPairSkipSizeOff2onTrim(LAMMPS *lmp) : NPair(lmp) {} +NPairSkipTrimSizeOff2on::NPairSkipTrimSizeOff2on(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build skip list for subset of types from parent list @@ -30,7 +30,7 @@ NPairSkipSizeOff2onTrim::NPairSkipSizeOff2onTrim(LAMMPS *lmp) : NPair(lmp) {} parent non-skip list used newton off, this skip list is newton on ------------------------------------------------------------------------- */ -void NPairSkipSizeOff2onTrim::build(NeighList *list) +void NPairSkipTrimSizeOff2on::build(NeighList *list) { int i, j, ii, jj, n, itype, jnum, joriginal; tagint itag, jtag; diff --git a/src/npair_skip_size_off2on_trim.h b/src/npair_skip_trim_size_off2on.h similarity index 80% rename from src/npair_skip_size_off2on_trim.h rename to src/npair_skip_trim_size_off2on.h index e471ddd2cc..6e52082329 100644 --- a/src/npair_skip_size_off2on_trim.h +++ b/src/npair_skip_trim_size_off2on.h @@ -13,24 +13,24 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(skip/size/off2on/trim, - NPairSkipSizeOff2onTrim, +NPairStyle(skip/trim/size/off2on, + NPairSkipTrimSizeOff2on, NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); // clang-format on #else -#ifndef LMP_NPAIR_SKIP_SIZE_OFF2ON_TRIM_H -#define LMP_NPAIR_SKIP_SIZE_OFF2ON_TRIM_H +#ifndef LMP_NPAIR_SKIP_TRIM_SIZE_OFF2ON_H +#define LMP_NPAIR_SKIP_TRIM_SIZE_OFF2ON_H #include "npair.h" namespace LAMMPS_NS { -class NPairSkipSizeOff2onTrim : public NPair { +class NPairSkipTrimSizeOff2on : public NPair { public: - NPairSkipSizeOff2onTrim(class LAMMPS *); + NPairSkipTrimSizeOff2on(class LAMMPS *); void build(class NeighList *) override; }; diff --git a/src/npair_skip_size_off2on_oneside_trim.cpp b/src/npair_skip_trim_size_off2on_oneside.cpp similarity index 96% rename from src/npair_skip_size_off2on_oneside_trim.cpp rename to src/npair_skip_trim_size_off2on_oneside.cpp index 91940d3135..9d43ac8087 100644 --- a/src/npair_skip_size_off2on_oneside_trim.cpp +++ b/src/npair_skip_trim_size_off2on_oneside.cpp @@ -12,7 +12,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -#include "npair_skip_size_off2on_oneside_trim.h" +#include "npair_skip_trim_size_off2on_oneside.h" #include "atom.h" #include "domain.h" @@ -24,7 +24,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairSkipSizeOff2onOnesideTrim::NPairSkipSizeOff2onOnesideTrim(LAMMPS *lmp) : +NPairSkipTrimSizeOff2onOneside::NPairSkipTrimSizeOff2onOneside(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- @@ -34,7 +34,7 @@ NPairSkipSizeOff2onOnesideTrim::NPairSkipSizeOff2onOnesideTrim(LAMMPS *lmp) : this skip list is newton on and onesided ------------------------------------------------------------------------- */ -void NPairSkipSizeOff2onOnesideTrim::build(NeighList *list) +void NPairSkipTrimSizeOff2onOneside::build(NeighList *list) { int i,j,ii,jj,itype,jnum,joriginal,flip,tmp; int *surf,*jlist; diff --git a/src/npair_skip_size_off2on_oneside_trim.h b/src/npair_skip_trim_size_off2on_oneside.h similarity index 78% rename from src/npair_skip_size_off2on_oneside_trim.h rename to src/npair_skip_trim_size_off2on_oneside.h index 236b886fe4..27861123dd 100644 --- a/src/npair_skip_size_off2on_oneside_trim.h +++ b/src/npair_skip_trim_size_off2on_oneside.h @@ -13,24 +13,24 @@ #ifdef NPAIR_CLASS // clang-format off -NPairStyle(skip/size/off2on/oneside/trim, - NPairSkipSizeOff2onOnesideTrim, +NPairStyle(skip/trim/size/off2on/oneside, + NPairSkipTrimSizeOff2onOneside, NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_MULTI_OLD | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_TRIM); // clang-format on #else -#ifndef LMP_NPAIR_SKIP_SIZE_OFF2ON_ONESIDE_TRIM_H -#define LMP_NPAIR_SKIP_SIZE_OFF2ON_ONESIDE_TRIM_H +#ifndef LMP_NPAIR_SKIP_TRIM_SIZE_OFF2ON_ONESIDE_H +#define LMP_NPAIR_SKIP_TRIM_SIZE_OFF2ON_ONESIDE_H #include "npair.h" namespace LAMMPS_NS { -class NPairSkipSizeOff2onOnesideTrim : public NPair { +class NPairSkipTrimSizeOff2onOneside : public NPair { public: - NPairSkipSizeOff2onOnesideTrim(class LAMMPS *); + NPairSkipTrimSizeOff2onOneside(class LAMMPS *); void build(class NeighList *) override; }; From be286d2c7d58302cb3de19caa614a90018f25d07 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 Nov 2023 06:21:28 -0500 Subject: [PATCH 376/417] lower the C++ standard to 14 for some files when compiling with intel classic compiler --- cmake/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 95d738d279..961bcef551 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -428,6 +428,18 @@ if(BUILD_OMP) target_link_libraries(lmp PRIVATE OpenMP::OpenMP_CXX) endif() +# lower C++ standard for fmtlib sources when using Intel classic compiler +if((CMAKE_CXX_COMPILER_ID STREQUAL "Intel") AND (CMAKE_CXX_STANDARD GREATER_EQUAL 17) + AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 2021.10)) + message(STATUS "Lowering C++ standard for compiling fmtlib sources with Intel Classic compiler") + get_filename_component(LMP_UTILS_SRC "${LAMMPS_SOURCE_DIR}/utils.cpp" ABSOLUTE) + get_filename_component(LMP_VARIABLE_SRC "${LAMMPS_SOURCE_DIR}/variable.cpp" ABSOLUTE) + get_filename_component(FMT_FORMAT_SRC "${LAMMPS_SOURCE_DIR}/fmtlib_format.cpp" ABSOLUTE) + get_filename_component(FMT_OS_SRC "${LAMMPS_SOURCE_DIR}/fmtlib_os.cpp" ABSOLUTE) + set_source_files_properties("${FMT_FORMAT_SRC}" "${FMT_OS_SRC}" "${LMP_VARIABLE_SRC}" "${LMP_UTILS_SRC}" + PROPERTIES COMPILE_OPTIONS "-std=c++14") +endif() + if(PKG_ATC OR PKG_AWPMD OR PKG_ML-QUIP OR PKG_ML-POD OR PKG_ELECTRODE OR BUILD_TOOLS) enable_language(C) if (NOT USE_INTERNAL_LINALG) From c66710934dd895558d4b37ffeb574cda3b89971d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 Nov 2023 06:22:16 -0500 Subject: [PATCH 377/417] reduce warnings when compiling with intel classic compilers --- cmake/CMakeLists.txt | 2 +- src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi | 2 +- src/MAKE/OPTIONS/Makefile.intel_cpu_mpich | 2 +- src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 961bcef551..3b0b069556 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -106,7 +106,7 @@ 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_TUNE_DEFAULT "-xCOMMON-AVX512") else() - set(CMAKE_TUNE_DEFAULT "-xHost -fp-model fast=2 -no-prec-div -qoverride-limits -diag-disable=10441 -diag-disable=2196") + set(CMAKE_TUNE_DEFAULT "-xHost -fp-model fast=2 -no-prec-div -qoverride-limits -diag-disable=10441 -diag-disable=11074 -diag-disable=11076 -diag-disable=2196") endif() endif() endif() diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi index 3439244b09..8b3bd754cc 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi @@ -6,7 +6,7 @@ SHELL = /bin/sh # compiler/linker settings # specify flags and libraries needed for your compiler -CC = mpiicpc -std=c++11 -diag-disable=10441 -diag-disable=2196 +CC = mpiicpc -std=c++11 -diag-disable=10441 -diag-disable=2196 -diag-disable=11074 -diag-disable=11076 OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ -qopt-zmm-usage=high CCFLAGS = -qopenmp -qno-offload -ansi-alias -restrict \ diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich index 042b207c91..21387fe5af 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich @@ -6,7 +6,7 @@ SHELL = /bin/sh # compiler/linker settings # specify flags and libraries needed for your compiler -CC = mpicxx -cxx=icc -std=c++11 -diag-disable=10441 -diag-disable=2196 +CC = mpicxx -cxx=icc -std=c++11 -diag-disable=10441 -diag-disable=2196 -diag-disable=11074 -diag-disable=11076 OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ -qopt-zmm-usage=high CCFLAGS = -qopenmp -qno-offload -ansi-alias -restrict \ diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi index 9f6de64987..537ad5a8dc 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi @@ -7,7 +7,7 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler export OMPI_CXX = icc -CC = mpicxx -std=c++11 -diag-disable=10441 -diag-disable=2196 +CC = mpicxx -std=c++11 -diag-disable=10441 -diag-disable=2196 -diag-disable=11074 -diag-disable=11076 OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ -qopt-zmm-usage=high CCFLAGS = -qopenmp -qno-offload -ansi-alias -restrict \ From baa00d22e918001ad46292e55b2a9d9a0a960c21 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 Nov 2023 06:22:25 -0500 Subject: [PATCH 378/417] simplify --- src/fmt/compile.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fmt/compile.h b/src/fmt/compile.h index a1fb7d2935..af76507f07 100644 --- a/src/fmt/compile.h +++ b/src/fmt/compile.h @@ -61,7 +61,8 @@ const T& first(const T& value, const Tail&...) { return value; } -#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) && (FMT_CPLUSPLUS >= 201703L) && !FMT_ICC_VERSION +// LAMMPS customization: only use 'if constexpr' with C++17 +#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) && (FMT_CPLUSPLUS >= 201703L) template struct type_list {}; // Returns a reference to the argument at index N from [first, rest...]. From 2d4527d59a90f0bf13cf5e57565745dcedb1ef1c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 Nov 2023 07:14:38 -0500 Subject: [PATCH 379/417] tweak intel compiler makefile for traditional build --- src/MAKE/OPTIONS/Makefile.intel_coprocessor | 13 +++++++++++++ src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi | 13 +++++++++++++ src/MAKE/OPTIONS/Makefile.intel_cpu_mpich | 13 +++++++++++++ src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi | 13 +++++++++++++ 4 files changed, 52 insertions(+) diff --git a/src/MAKE/OPTIONS/Makefile.intel_coprocessor b/src/MAKE/OPTIONS/Makefile.intel_coprocessor index 99e8d22d82..d8a67428de 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_coprocessor +++ b/src/MAKE/OPTIONS/Makefile.intel_coprocessor @@ -14,6 +14,7 @@ CCFLAGS = -qopenmp -qoffload -ansi-alias -restrict \ -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG -DLMP_INTEL_OFFLOAD \ $(OPTFLAGS) -I$(MKLROOT)/include SHFLAGS = -fPIC +FMTFLAGS = -std=c++11 DEPFLAGS = -M LINK = mpiicpc -std=c++11 @@ -118,6 +119,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi index 8b3bd754cc..681bbaabe1 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi @@ -13,6 +13,7 @@ CCFLAGS = -qopenmp -qno-offload -ansi-alias -restrict \ -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) \ -I$(MKLROOT)/include SHFLAGS = -fPIC +FMTFLAGS = -std=c++11 DEPFLAGS = -M LINK = mpiicpc -std=c++11 -diag-disable=10441 -diag-disable=2196 @@ -117,6 +118,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich index 21387fe5af..f1a8c97fc6 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich @@ -13,6 +13,7 @@ CCFLAGS = -qopenmp -qno-offload -ansi-alias -restrict \ -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) \ -I$(MKLROOT)/include SHFLAGS = -fPIC +FMTFLAGS = -std=c++11 DEPFLAGS = -M LINK = mpicxx -cxx=icc -std=c++11 -diag-disable=10441 -diag-disable=2196 @@ -117,6 +118,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi index 537ad5a8dc..c3e4451c7c 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi @@ -14,6 +14,7 @@ CCFLAGS = -qopenmp -qno-offload -ansi-alias -restrict \ -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) \ -I$(MKLROOT)/include SHFLAGS = -fPIC +FMTFLAGS = -std=c++11 DEPFLAGS = -M LINK = mpicxx -std=c++11 -diag-disable=10441 -diag-disable=2196 @@ -118,6 +119,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) From 0487dc5331504ddef7168f0cc3495d6410d86874 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 Nov 2023 11:15:53 -0500 Subject: [PATCH 380/417] copy intel C++17 compiler hack to Kokkos makefiles --- src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi | 16 +++++++++++++++- src/MAKE/OPTIONS/Makefile.kokkos_mpi_only | 14 ++++++++++++++ src/MAKE/OPTIONS/Makefile.kokkos_omp | 14 ++++++++++++++ src/MAKE/OPTIONS/Makefile.kokkos_phi | 14 ++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi index b73c441c71..e78be1acdc 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi +++ b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi @@ -12,6 +12,8 @@ export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper CC = mpicxx CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma SHFLAGS = -fPIC +# uncomment when compiling with Intel 21.5 or older +FMTFLAGS = # -std=c++11 DEPFLAGS = -M LINK = mpicxx @@ -36,7 +38,7 @@ KOKKOS_ARCH = Volta70 LMP_INC = -DLAMMPS_GZIP # MPI library -# see discussion in Section 2.2 (step 5) of manual +# see discussion in Section 3.4 of the manual # MPI wrapper compiler/linker can provide this info # can point to dummy MPI library in src/STUBS as in Makefile.serial # use -D MPICH and OMPI settings in INC to avoid C++ lib conflicts @@ -118,6 +120,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only b/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only index 0adb53eef0..e1f7005617 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only +++ b/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only @@ -9,6 +9,8 @@ SHELL = /bin/sh CC = mpicxx CCFLAGS = -g -O3 -DNDEBUG SHFLAGS = -fPIC +# uncomment when compiling with Intel 21.5 or older +FMTFLAGS = # -std=c++11 DEPFLAGS = -M LINK = mpicxx @@ -114,6 +116,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_omp b/src/MAKE/OPTIONS/Makefile.kokkos_omp index 82144652dd..5f91af7a1e 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_omp +++ b/src/MAKE/OPTIONS/Makefile.kokkos_omp @@ -9,6 +9,8 @@ SHELL = /bin/sh CC = mpicxx CCFLAGS = -g -O3 -DNDEBUG SHFLAGS = -fPIC +# uncomment when compiling with Intel 21.5 or older +FMTFLAGS = # -std=c++11 DEPFLAGS = -M LINK = mpicxx @@ -114,6 +116,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_phi b/src/MAKE/OPTIONS/Makefile.kokkos_phi index 9d5691251c..05b24f8721 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_phi +++ b/src/MAKE/OPTIONS/Makefile.kokkos_phi @@ -9,6 +9,8 @@ SHELL = /bin/sh CC = mpicxx CCFLAGS = -g -O3 -DNDEBUG SHFLAGS = -fPIC +# uncomment when compiling with Intel 21.5 or older +FMTFLAGS = # -std=c++11 DEPFLAGS = -M LINK = mpicxx @@ -115,6 +117,18 @@ $(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS) %.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< +variable.o : ../variable.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +utils.o : ../utils.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_format.o : ../fmtlib_format.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + +fmtlib_os.o : ../fmtlib_os.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) $(FMTFLAGS) -c $< + # Individual dependencies depend : fastdep.exe $(SRC) From 11305107d95be6c395a785c6e7b5946ed17d2441 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Nov 2023 05:40:05 -0500 Subject: [PATCH 381/417] update release date to 21 November 2023 --- doc/lammps.1 | 4 ++-- doc/src/Commands_removed.rst | 4 ++-- doc/src/compute_composition_atom.rst | 2 +- doc/src/compute_property_grid.rst | 2 +- doc/src/compute_reduce.rst | 2 +- doc/src/compute_voronoi_atom.rst | 2 +- doc/src/dump.rst | 2 +- doc/src/dump_image.rst | 2 +- doc/src/fix_deposit.rst | 2 +- doc/src/fix_pimd.rst | 2 +- src/library.cpp | 8 ++++---- src/version.h | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index 766522d4aa..100ea9b663 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,7 +1,7 @@ -.TH LAMMPS "1" "17 November 2023" "2023-11-17" +.TH LAMMPS "1" "21 November 2023" "2023-11-21" .SH NAME .B LAMMPS -\- Molecular Dynamics Simulator. Version 17 November 2023 +\- Molecular Dynamics Simulator. Version 21 November 2023 .SH SYNOPSIS .B lmp diff --git a/doc/src/Commands_removed.rst b/doc/src/Commands_removed.rst index d0e723aabe..8a00c63734 100644 --- a/doc/src/Commands_removed.rst +++ b/doc/src/Commands_removed.rst @@ -88,7 +88,7 @@ The same functionality is available through MPIIO package ------------- -.. deprecated:: 17Nov2023 +.. deprecated:: 21Nov2023 The MPIIO package has been removed from LAMMPS since it was unmaintained for many years and thus not updated to incorporate required changes that @@ -107,7 +107,7 @@ see :doc:`restart `, :doc:`read_restart `, MSCG package ------------ -.. deprecated:: 17Nov2023 +.. deprecated:: 21Nov2023 The MSCG package has been removed from LAMMPS since it was unmaintained for many years and instead superseded by the `OpenMSCG software diff --git a/doc/src/compute_composition_atom.rst b/doc/src/compute_composition_atom.rst index e65a3e9c95..e973eaa234 100644 --- a/doc/src/compute_composition_atom.rst +++ b/doc/src/compute_composition_atom.rst @@ -36,7 +36,7 @@ Examples Description """"""""""" -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 Define a computation that calculates a local composition vector for each atom. For a central atom with :math:`M` neighbors within the neighbor cutoff sphere, diff --git a/doc/src/compute_property_grid.rst b/doc/src/compute_property_grid.rst index a0b9aba7dc..dfdce220c6 100644 --- a/doc/src/compute_property_grid.rst +++ b/doc/src/compute_property_grid.rst @@ -61,7 +61,7 @@ varying fastest, then Y, then Z slowest. For 2d grids (in 2d simulations), the grid IDs range from 1 to Nx*Ny, with X varying fastest and Y slowest. -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 The *proc* attribute is the ID of the processor which owns the grid cell. Processor IDs range from 0 to Nprocs - 1, where Nprocs is the diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index ba60b52563..604b1c1571 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -201,7 +201,7 @@ information in this context, the *replace* keywords will extract the atom IDs for the two atoms in the bond of maximum stretch. These atom IDs and the bond stretch will be printed with thermodynamic output. -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 The *inputs* keyword allows selection of whether all the inputs are per-atom or local quantities. As noted above, all the inputs must be diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 5f00a2abab..3bada09518 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -190,7 +190,7 @@ Voro++ software in the src/VORONOI/README file. Output info """"""""""" -.. deprecated:: 17Nov2023 +.. deprecated:: 21Nov2023 The *peratom* keyword was removed as it is no longer required. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index bdaefb769e..6d13b43200 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -613,7 +613,7 @@ when running on large numbers of processors. Note that using the "\*" and "%" characters together can produce a large number of small dump files! -.. deprecated:: 17Nov2023 +.. deprecated:: 21Nov2023 The MPIIO package and the the corresponding "/mpiio" dump styles, except for the unrelated "netcdf/mpiio" style were removed from LAMMPS. diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 43f182b889..3102caaa97 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -599,7 +599,7 @@ image will appear. The *sfactor* value must be a value 0.0 <= *sfactor* <= 1.0, where *sfactor* = 1 is a highly reflective surface and *sfactor* = 0 is a rough non-shiny surface. -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 The *fsaa* keyword can be used with the dump image command to improve the image quality by enabling full scene anti-aliasing. Internally the diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index ff5afc2241..5264999839 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -220,7 +220,7 @@ rotated configuration of the molecule. existing particle. LAMMPS will issue a warning if R is smaller than this value, based on the radii of existing and inserted particles. -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 The *var* and *set* keywords can be used together to provide a criterion for accepting or rejecting the addition of an individual atom, based on its diff --git a/doc/src/fix_pimd.rst b/doc/src/fix_pimd.rst index 7468ffea13..a2e137da25 100644 --- a/doc/src/fix_pimd.rst +++ b/doc/src/fix_pimd.rst @@ -149,7 +149,7 @@ normal-mode PIMD. A value of *cmd* is for centroid molecular dynamics only the k > 0 modes are thermostatted, not the centroid degrees of freedom. -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 Mode *pimd* added to fix pimd/langevin. diff --git a/src/library.cpp b/src/library.cpp index 7fc79333ad..363110e5f5 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -617,7 +617,7 @@ combined by removing the '&' and the following newline character. After this processing the string is handed to LAMMPS for parsing and executing. -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 The command is now able to process long strings with triple quotes and loops using :doc:`jump SELF \ `. @@ -2484,7 +2484,7 @@ int lammps_set_variable(void *handle, char *name, char *str) * \verbatim embed:rst -.. versionadded:: 17Nov2023 +.. versionadded:: 21Nov2023 This function copies a string with human readable information about a defined variable: name, style, current value(s) into the provided @@ -5581,7 +5581,7 @@ int lammps_config_has_ffmpeg_support() { * \verbatim embed:rst -.. deprecated:: 17Nov2023 +.. deprecated:: 21Nov2023 LAMMPS has now exceptions always enabled, so this function will now always return 1 and can be removed from applications @@ -6658,7 +6658,7 @@ the failing MPI ranks to send messages. instance, but instead would check the global error buffer of the library interface. - .. versionchanged: 17Nov2023 + .. versionchanged: 21Nov2023 The *buffer* pointer may be ``NULL``. This will clear any error status without copying the error message. diff --git a/src/version.h b/src/version.h index a5844f0973..e2f596d1aa 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "17 Nov 2023" +#define LAMMPS_VERSION "21 Nov 2023" From 3c73882a681c2cdfca785235818824a28dba76c7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Nov 2023 08:59:27 -0500 Subject: [PATCH 382/417] update Purge.list and avoid redundant checks --- cmake/Modules/LAMMPSUtils.cmake | 14 +++++++------- src/Purge.list | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cmake/Modules/LAMMPSUtils.cmake b/cmake/Modules/LAMMPSUtils.cmake index bb5ea07609..2ec9d1b706 100644 --- a/cmake/Modules/LAMMPSUtils.cmake +++ b/cmake/Modules/LAMMPSUtils.cmake @@ -83,17 +83,17 @@ function(check_for_autogen_files source_dir) file(GLOB SRC_AUTOGEN_FILES CONFIGURE_DEPENDS ${source_dir}/style_*.h) file(GLOB SRC_AUTOGEN_PACKAGES CONFIGURE_DEPENDS ${source_dir}/packages_*.h) list(APPEND SRC_AUTOGEN_FILES ${SRC_AUTOGEN_PACKAGES} ${source_dir}/lmpinstalledpkgs.h ${source_dir}/lmpgitversion.h) - list(APPEND SRC_AUTOGEN_FILES ${SRC_AUTOGEN_PACKAGES} ${source_dir}/mliap_model_python_couple.h ${source_dir}/mliap_model_python_couple.cpp) + list(APPEND SRC_AUTOGEN_FILES ${source_dir}/mliap_model_python_couple.h ${source_dir}/mliap_model_python_couple.cpp) foreach(_SRC ${SRC_AUTOGEN_FILES}) get_filename_component(FILENAME "${_SRC}" NAME) if(EXISTS ${source_dir}/${FILENAME}) message(FATAL_ERROR "\n########################################################################\n" - "Found header file(s) generated by the make-based build system\n" - "\n" - "Please run\n" - "make -C ${source_dir} purge\n" - "to remove\n" - "########################################################################") + "Found header file ${source_dir}/${FILENAME} generated by the make-based build system\n" + "\n" + "Please run\n" + "make -C ${source_dir} purge\n" + "to remove\n" + "########################################################################") endif() endforeach() endfunction() diff --git a/src/Purge.list b/src/Purge.list index 3052c3af1d..14708a111e 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -8,6 +8,7 @@ style_compute.h style_dihedral.h style_dump.h style_fix.h +style_gran_sub_mod.h style_improper.h style_integrate.h style_kspace.h @@ -32,6 +33,7 @@ packages_compute.h packages_dihedral.h packages_dump.h packages_fix.h +packages_gran_sub_mod.h packages_improper.h packages_integrate.h packages_kspace.h From bc692dce791ec90aa9c2cb25ca2e24585a8ddd42 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Nov 2023 09:18:17 -0500 Subject: [PATCH 383/417] add missing entries --- src/.gitignore | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/.gitignore b/src/.gitignore index 60cfe7eea3..3ee771e139 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -46,6 +46,33 @@ /mdi_plugin.cpp /mdi_plugin.h +/amoeba_charge_transfer.cpp +/amoeba_convolution.cpp +/amoeba_convolution.h +/amoeba_dispersion.cpp +/amoeba_file.cpp +/amoeba_hal.cpp +/amoeba_induce.cpp +/amoeba_kspace.cpp +/amoeba_multipole.cpp +/amoeba_polar.cpp +/amoeba_repulsion.cpp +/amoeba_utils.cpp +/angle_amoeba.cpp +/angle_amoeba.h +/atom_vec_amoeba.cpp +/atom_vec_amoeba.h +/fix_amoeba_bitorsion.cpp +/fix_amoeba_bitorsion.h +/fix_amoeba_pitorsion.cpp +/fix_amoeba_pitorsion.h +/improper_amoeba.cpp +/improper_amoeba.h +/pair_amoeba.cpp +/pair_amoeba.h +/pair_hippo.cpp +/pair_hippo.h + /fix_brownian*.cpp /fix_brownian*.h /fix_propel_self.cpp From 6cd2055084823c897d81fbbc6147c3a4cf7e6c93 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Nov 2023 09:18:40 -0500 Subject: [PATCH 384/417] delete obsolete dependencies --- src/INTEL/Install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/INTEL/Install.sh b/src/INTEL/Install.sh index 2d6d82fae5..94d967b194 100755 --- a/src/INTEL/Install.sh +++ b/src/INTEL/Install.sh @@ -51,8 +51,6 @@ action npair_intel.cpp action intel_simd.h action intel_intrinsics.h pair_tersoff_intel.cpp action intel_intrinsics_airebo.h pair_airebo_intel.cpp -action electrode_accel_intel.h fix_electrode_conp.cpp -action electrode_accel_intel.cpp fix_electrode_conp.cpp if (test $mode = 1) then From ac90a4ac9c2c8b7d9fc5302a7af44d29ca58944c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 19 Nov 2023 09:19:03 -0500 Subject: [PATCH 385/417] reorder for cleaner dependency handling --- src/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index 5f905ee145..196641d67d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -49,6 +49,8 @@ endif # PACKEXT = subset that require an external (downloaded) library PACKAGE = \ + molecule \ + kspace \ adios \ amoeba \ asphere \ @@ -85,7 +87,6 @@ PACKAGE = \ interlayer \ kim \ kokkos \ - kspace \ latboltz \ lepton \ machdyn \ @@ -104,7 +105,6 @@ PACKAGE = \ ml-rann \ ml-snap \ mofff \ - molecule \ molfile \ netcdf \ openmp \ @@ -143,9 +143,11 @@ PACKAGE = \ # NOTE: the last four packages must remain at the end since # they depend on other packages to be installed first. -PACKBASIC = kspace manybody molecule rigid +PACKBASIC = molecule kspace manybody rigid PACKMOST = \ + kspace \ + molecule \ amoeba \ asphere \ bocs \ @@ -173,7 +175,6 @@ PACKMOST = \ fep \ granular \ interlayer \ - kspace \ manybody \ mc \ meam \ @@ -181,7 +182,6 @@ PACKMOST = \ misc \ ml-snap \ mofff \ - molecule \ openmp \ opt \ orient \ From fc28fc318beede342a2f013f6f673c35fba15920 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 21 Nov 2023 10:57:33 -0700 Subject: [PATCH 386/417] Update CODEOWNERS for cmake --- .github/CODEOWNERS | 6 +++--- cmake/CMakeLists.txt | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b6892aa4ee..1b4cae3aaa 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -153,12 +153,12 @@ tools/vim/* @hammondkd unittest/* @akohlmey # cmake -cmake/* @rbberger +cmake/* @akohlmey cmake/Modules/LAMMPSInterfacePlugin.cmake @akohlmey cmake/Modules/MPI4WIN.cmake @akohlmey cmake/Modules/OpenCLLoader.cmake @akohlmey -cmake/Modules/Packages/COLVARS.cmake @rbberger @giacomofiorin -cmake/Modules/Packages/KIM.cmake @rbberger @ellio167 +cmake/Modules/Packages/COLVARS.cmake @giacomofiorin +cmake/Modules/Packages/KIM.cmake @ellio167 cmake/presets/*.cmake @akohlmey # python diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 3b0b069556..28e02bbee7 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -2,7 +2,6 @@ ######################################## # CMake build system # This file is part of LAMMPS -# Created by Christoph Junghans and Richard Berger cmake_minimum_required(VERSION 3.16) ######################################## # set policy to silence warnings about ignoring _ROOT but use it From 3306b95589108fb0e73e8e423e34bb62bcea91d0 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 21 Nov 2023 15:02:12 -0700 Subject: [PATCH 387/417] Update Kokkos library in LAMMPS to v4.2 --- lib/kokkos/CHANGELOG.md | 93 +- lib/kokkos/CMakeLists.txt | 5 +- lib/kokkos/Makefile.kokkos | 70 +- lib/kokkos/Makefile.targets | 2 + lib/kokkos/algorithms/CMakeLists.txt | 2 +- .../algorithms/src/Kokkos_NestedSort.hpp | 184 +- lib/kokkos/algorithms/src/Kokkos_Random.hpp | 6 +- lib/kokkos/algorithms/src/Kokkos_Sort.hpp | 759 +------- .../src/sorting/Kokkos_BinOpsPublicAPI.hpp | 129 ++ .../src/sorting/Kokkos_BinSortPublicAPI.hpp | 410 ++++ .../sorting/Kokkos_NestedSortPublicAPI.hpp | 100 + .../src/sorting/Kokkos_SortPublicAPI.hpp | 194 ++ .../impl/Kokkos_CopyOpsForBinSortImpl.hpp | 61 + .../sorting/impl/Kokkos_NestedSortImpl.hpp | 115 ++ .../src/sorting/impl/Kokkos_SortImpl.hpp | 369 ++++ .../Kokkos_AdjacentDifference.hpp | 203 +- .../std_algorithms/Kokkos_AdjacentFind.hpp | 117 +- .../src/std_algorithms/Kokkos_AllOf.hpp | 64 +- .../src/std_algorithms/Kokkos_AnyOf.hpp | 64 +- .../src/std_algorithms/Kokkos_Copy.hpp | 65 +- .../std_algorithms/Kokkos_CopyBackward.hpp | 65 +- .../src/std_algorithms/Kokkos_CopyIf.hpp | 71 +- .../src/std_algorithms/Kokkos_CopyN.hpp | 68 +- .../src/std_algorithms/Kokkos_Count.hpp | 60 +- .../src/std_algorithms/Kokkos_CountIf.hpp | 64 +- .../src/std_algorithms/Kokkos_Equal.hpp | 289 ++- .../std_algorithms/Kokkos_ExclusiveScan.hpp | 243 ++- .../src/std_algorithms/Kokkos_Fill.hpp | 54 +- .../src/std_algorithms/Kokkos_FillN.hpp | 58 +- .../src/std_algorithms/Kokkos_Find.hpp | 60 +- .../src/std_algorithms/Kokkos_FindEnd.hpp | 144 +- .../src/std_algorithms/Kokkos_FindFirstOf.hpp | 155 +- .../src/std_algorithms/Kokkos_FindIf.hpp | 70 +- .../src/std_algorithms/Kokkos_FindIfNot.hpp | 63 +- .../src/std_algorithms/Kokkos_ForEach.hpp | 67 +- .../src/std_algorithms/Kokkos_ForEachN.hpp | 72 +- .../src/std_algorithms/Kokkos_Generate.hpp | 54 +- .../src/std_algorithms/Kokkos_GenerateN.hpp | 63 +- .../std_algorithms/Kokkos_InclusiveScan.hpp | 311 +++- .../std_algorithms/Kokkos_IsPartitioned.hpp | 61 +- .../src/std_algorithms/Kokkos_IsSorted.hpp | 116 +- .../std_algorithms/Kokkos_IsSortedUntil.hpp | 115 +- .../Kokkos_LexicographicalCompare.hpp | 133 +- .../src/std_algorithms/Kokkos_MaxElement.hpp | 105 +- .../src/std_algorithms/Kokkos_MinElement.hpp | 105 +- .../std_algorithms/Kokkos_MinMaxElement.hpp | 107 +- .../src/std_algorithms/Kokkos_Mismatch.hpp | 145 +- .../src/std_algorithms/Kokkos_Move.hpp | 64 +- .../std_algorithms/Kokkos_MoveBackward.hpp | 67 +- .../src/std_algorithms/Kokkos_NoneOf.hpp | 65 +- .../std_algorithms/Kokkos_PartitionCopy.hpp | 90 +- .../std_algorithms/Kokkos_PartitionPoint.hpp | 62 +- .../src/std_algorithms/Kokkos_Reduce.hpp | 203 +- .../src/std_algorithms/Kokkos_Remove.hpp | 64 +- .../src/std_algorithms/Kokkos_RemoveCopy.hpp | 82 +- .../std_algorithms/Kokkos_RemoveCopyIf.hpp | 71 +- .../src/std_algorithms/Kokkos_RemoveIf.hpp | 66 +- .../src/std_algorithms/Kokkos_Replace.hpp | 63 +- .../src/std_algorithms/Kokkos_ReplaceCopy.hpp | 83 +- .../std_algorithms/Kokkos_ReplaceCopyIf.hpp | 88 +- .../src/std_algorithms/Kokkos_ReplaceIf.hpp | 69 +- .../src/std_algorithms/Kokkos_Reverse.hpp | 53 +- .../src/std_algorithms/Kokkos_ReverseCopy.hpp | 67 +- .../src/std_algorithms/Kokkos_Rotate.hpp | 57 +- .../src/std_algorithms/Kokkos_RotateCopy.hpp | 75 +- .../src/std_algorithms/Kokkos_Search.hpp | 143 +- .../src/std_algorithms/Kokkos_SearchN.hpp | 131 +- .../src/std_algorithms/Kokkos_ShiftLeft.hpp | 54 +- .../src/std_algorithms/Kokkos_ShiftRight.hpp | 54 +- .../src/std_algorithms/Kokkos_SwapRanges.hpp | 66 +- .../src/std_algorithms/Kokkos_Transform.hpp | 208 ++- .../Kokkos_TransformExclusiveScan.hpp | 130 +- .../Kokkos_TransformInclusiveScan.hpp | 244 ++- .../std_algorithms/Kokkos_TransformReduce.hpp | 276 ++- .../src/std_algorithms/Kokkos_Unique.hpp | 125 +- .../src/std_algorithms/Kokkos_UniqueCopy.hpp | 163 +- .../impl/Kokkos_AdjacentDifference.hpp | 58 +- .../impl/Kokkos_AdjacentFind.hpp | 81 +- .../impl/Kokkos_AllOfAnyOfNoneOf.hpp | 55 +- .../impl/Kokkos_Constraints.hpp | 47 +- .../impl/Kokkos_CopyBackward.hpp | 49 +- .../std_algorithms/impl/Kokkos_CopyCopyN.hpp | 75 +- .../src/std_algorithms/impl/Kokkos_CopyIf.hpp | 73 +- .../impl/Kokkos_CountCountIf.hpp | 52 +- .../src/std_algorithms/impl/Kokkos_Equal.hpp | 116 +- .../impl/Kokkos_ExclusiveScan.hpp | 240 ++- .../std_algorithms/impl/Kokkos_FillFillN.hpp | 49 +- .../std_algorithms/impl/Kokkos_FindEnd.hpp | 110 +- .../impl/Kokkos_FindFirstOf.hpp | 80 +- .../impl/Kokkos_FindIfOrNot.hpp | 72 +- .../impl/Kokkos_ForEachForEachN.hpp | 64 +- .../impl/Kokkos_FunctorsForExclusiveScan.hpp | 220 +++ .../impl/Kokkos_GenerateGenerateN.hpp | 51 +- .../impl/Kokkos_InclusiveScan.hpp | 144 +- .../impl/Kokkos_IsPartitioned.hpp | 71 +- .../std_algorithms/impl/Kokkos_IsSorted.hpp | 53 +- .../impl/Kokkos_IsSortedUntil.hpp | 74 +- .../impl/Kokkos_LexicographicalCompare.hpp | 92 +- .../impl/Kokkos_MinMaxMinmaxElement.hpp | 83 +- .../std_algorithms/impl/Kokkos_Mismatch.hpp | 95 +- .../src/std_algorithms/impl/Kokkos_Move.hpp | 33 +- .../impl/Kokkos_MoveBackward.hpp | 42 +- .../impl/Kokkos_MustUseKokkosSingleInTeam.hpp | 47 + .../impl/Kokkos_PartitionCopy.hpp | 76 +- .../impl/Kokkos_PartitionPoint.hpp | 45 +- .../src/std_algorithms/impl/Kokkos_Reduce.hpp | 115 +- .../impl/Kokkos_RemoveAllVariants.hpp | 123 +- .../std_algorithms/impl/Kokkos_Replace.hpp | 28 +- .../impl/Kokkos_ReplaceCopy.hpp | 49 +- .../impl/Kokkos_ReplaceCopyIf.hpp | 65 +- .../std_algorithms/impl/Kokkos_ReplaceIf.hpp | 34 +- .../std_algorithms/impl/Kokkos_Reverse.hpp | 28 +- .../impl/Kokkos_ReverseCopy.hpp | 42 +- .../src/std_algorithms/impl/Kokkos_Rotate.hpp | 34 +- .../std_algorithms/impl/Kokkos_RotateCopy.hpp | 49 +- .../src/std_algorithms/impl/Kokkos_Search.hpp | 110 +- .../std_algorithms/impl/Kokkos_SearchN.hpp | 120 +- .../std_algorithms/impl/Kokkos_ShiftLeft.hpp | 40 +- .../std_algorithms/impl/Kokkos_ShiftRight.hpp | 61 +- .../std_algorithms/impl/Kokkos_SwapRanges.hpp | 39 +- .../std_algorithms/impl/Kokkos_Transform.hpp | 103 +- .../impl/Kokkos_TransformExclusiveScan.hpp | 122 +- .../impl/Kokkos_TransformInclusiveScan.hpp | 212 ++- .../impl/Kokkos_TransformReduce.hpp | 116 +- .../src/std_algorithms/impl/Kokkos_Unique.hpp | 89 +- .../std_algorithms/impl/Kokkos_UniqueCopy.hpp | 130 +- .../algorithms/unit_tests/CMakeLists.txt | 262 ++- lib/kokkos/algorithms/unit_tests/Makefile | 18 +- .../algorithms/unit_tests/TestBinSortA.hpp | 14 +- .../algorithms/unit_tests/TestBinSortB.hpp | 70 +- .../algorithms/unit_tests/TestRandom.hpp | 92 + .../unit_tests/TestRandomAccessIterator.cpp | 11 + .../unit_tests/TestSortCustomComp.hpp | 133 ++ .../unit_tests/TestStdAlgorithmsCommon.cpp | 14 + .../unit_tests/TestStdAlgorithmsCommon.hpp | 499 ++++- .../TestStdAlgorithmsExclusiveScan.cpp | 5 +- .../TestStdAlgorithmsHelperFunctors.hpp | 20 +- .../TestStdAlgorithmsPartitioningOps.cpp | 2 +- ...estStdAlgorithmsTeamAdjacentDifference.cpp | 220 +++ .../TestStdAlgorithmsTeamAdjacentFind.cpp | 256 +++ .../unit_tests/TestStdAlgorithmsTeamAllOf.cpp | 165 ++ .../unit_tests/TestStdAlgorithmsTeamAnyOf.cpp | 165 ++ .../unit_tests/TestStdAlgorithmsTeamCopy.cpp | 157 ++ .../TestStdAlgorithmsTeamCopyBackward.cpp | 168 ++ .../TestStdAlgorithmsTeamCopyIf.cpp | 176 ++ .../TestStdAlgorithmsTeamCopy_n.cpp | 176 ++ .../unit_tests/TestStdAlgorithmsTeamCount.cpp | 201 ++ .../TestStdAlgorithmsTeamCountIf.cpp | 162 ++ .../unit_tests/TestStdAlgorithmsTeamEqual.cpp | 278 +++ .../TestStdAlgorithmsTeamExclusiveScan.cpp | 253 +++ .../unit_tests/TestStdAlgorithmsTeamFill.cpp | 106 ++ .../TestStdAlgorithmsTeamFill_n.cpp | 176 ++ .../unit_tests/TestStdAlgorithmsTeamFind.cpp | 212 +++ .../TestStdAlgorithmsTeamFindEnd.cpp | 271 +++ .../TestStdAlgorithmsTeamFindFirstOf.cpp | 280 +++ .../TestStdAlgorithmsTeamFindIf.cpp | 241 +++ .../TestStdAlgorithmsTeamFindIfNot.cpp | 236 +++ .../TestStdAlgorithmsTeamForEach.cpp | 126 ++ .../TestStdAlgorithmsTeamForEachN.cpp | 144 ++ .../TestStdAlgorithmsTeamGenerate.cpp | 116 ++ .../TestStdAlgorithmsTeamGenerate_n.cpp | 179 ++ .../TestStdAlgorithmsTeamInclusiveScan.cpp | 277 +++ .../TestStdAlgorithmsTeamIsPartitioned.cpp | 255 +++ .../TestStdAlgorithmsTeamIsSorted.cpp | 209 +++ .../TestStdAlgorithmsTeamIsSortedUntil.cpp | 275 +++ ...tdAlgorithmsTeamLexicographicalCompare.cpp | 286 +++ .../TestStdAlgorithmsTeamMaxElement.cpp | 182 ++ .../TestStdAlgorithmsTeamMinElement.cpp | 181 ++ .../TestStdAlgorithmsTeamMinMaxElement.cpp | 200 ++ .../TestStdAlgorithmsTeamMismatch.cpp | 283 +++ .../unit_tests/TestStdAlgorithmsTeamMove.cpp | 161 ++ .../TestStdAlgorithmsTeamMoveBackward.cpp | 170 ++ .../TestStdAlgorithmsTeamNoneOf.cpp | 165 ++ .../TestStdAlgorithmsTeamPartitionCopy.cpp | 313 ++++ .../TestStdAlgorithmsTeamPartitionPoint.cpp | 260 +++ .../TestStdAlgorithmsTeamReduce.cpp | 272 +++ .../TestStdAlgorithmsTeamRemove.cpp | 182 ++ .../TestStdAlgorithmsTeamRemoveCopy.cpp | 222 +++ .../TestStdAlgorithmsTeamRemoveCopyIf.cpp | 178 ++ .../TestStdAlgorithmsTeamRemoveIf.cpp | 166 ++ .../TestStdAlgorithmsTeamReplace.cpp | 135 ++ .../TestStdAlgorithmsTeamReplaceCopy.cpp | 204 ++ .../TestStdAlgorithmsTeamReplaceCopyIf.cpp | 183 ++ .../TestStdAlgorithmsTeamReplaceIf.cpp | 138 ++ .../TestStdAlgorithmsTeamReverse.cpp | 105 ++ .../TestStdAlgorithmsTeamReverseCopy.cpp | 153 ++ .../TestStdAlgorithmsTeamRotate.cpp | 173 ++ .../TestStdAlgorithmsTeamRotateCopy.cpp | 188 ++ .../TestStdAlgorithmsTeamSearch.cpp | 279 +++ .../TestStdAlgorithmsTeamSearchN.cpp | 295 +++ .../TestStdAlgorithmsTeamShiftLeft.cpp | 189 ++ .../TestStdAlgorithmsTeamShiftRight.cpp | 187 ++ .../TestStdAlgorithmsTeamSwapRanges.cpp | 151 ++ ...TestStdAlgorithmsTeamTransformBinaryOp.cpp | 185 ++ ...tdAlgorithmsTeamTransformExclusiveScan.cpp | 228 +++ ...tdAlgorithmsTeamTransformInclusiveScan.cpp | 264 +++ .../TestStdAlgorithmsTeamTransformReduce.cpp | 323 ++++ .../TestStdAlgorithmsTeamTransformUnaryOp.cpp | 176 ++ .../TestStdAlgorithmsTeamUnique.cpp | 171 ++ .../TestStdAlgorithmsTeamUniqueCopy.cpp | 196 ++ ...estStdAlgorithmsTransformExclusiveScan.cpp | 2 +- ...estStdAlgorithmsTransformInclusiveScan.cpp | 14 +- lib/kokkos/appveyor.yml | 2 +- lib/kokkos/benchmarks/CMakeLists.txt | 1 + lib/kokkos/benchmarks/gups/CMakeLists.txt | 4 + lib/kokkos/benchmarks/gups/Makefile | 51 - lib/kokkos/benchmarks/gups/gups-kokkos.cpp | 175 -- lib/kokkos/benchmarks/gups/gups.cpp | 195 ++ lib/kokkos/bin/kokkos_launch_compiler | 4 +- lib/kokkos/bin/nvcc_wrapper | 2 +- lib/kokkos/cmake/KokkosConfigCommon.cmake.in | 1 + lib/kokkos/cmake/KokkosCore_config.h.in | 23 +- lib/kokkos/cmake/Modules/FindTPLROCM.cmake | 26 +- lib/kokkos/cmake/fake_tribits.cmake | 9 - lib/kokkos/cmake/kokkos_arch.cmake | 156 +- lib/kokkos/cmake/kokkos_compiler_id.cmake | 9 +- lib/kokkos/cmake/kokkos_enable_devices.cmake | 10 + lib/kokkos/cmake/kokkos_enable_options.cmake | 9 +- lib/kokkos/cmake/kokkos_test_cxx_std.cmake | 8 +- lib/kokkos/cmake/kokkos_tpls.cmake | 7 +- lib/kokkos/cmake/kokkos_tribits.cmake | 9 + .../containers/performance_tests/TestCuda.cpp | 4 - lib/kokkos/containers/src/Kokkos_Bitset.hpp | 54 +- lib/kokkos/containers/src/Kokkos_DualView.hpp | 9 + .../containers/src/Kokkos_DynRankView.hpp | 2 +- .../containers/src/Kokkos_UnorderedMap.hpp | 88 +- lib/kokkos/containers/src/Kokkos_Vector.hpp | 21 +- .../src/impl/Kokkos_Bitset_impl.hpp | 1 - .../src/impl/Kokkos_UnorderedMap_impl.hpp | 5 +- .../containers/unit_tests/CMakeLists.txt | 8 + lib/kokkos/containers/unit_tests/Makefile | 7 +- .../containers/unit_tests/TestBitset.hpp | 11 - .../containers/unit_tests/TestDualView.hpp | 50 + .../unit_tests/TestUnorderedMap.hpp | 99 +- lib/kokkos/core/perf_test/CMakeLists.txt | 7 +- .../core/perf_test/PerfTest_MallocFree.cpp | 100 + .../core/perf_test/PerfTest_ViewAllocate.cpp | 34 - lib/kokkos/core/perf_test/test_mempool.cpp | 1 + lib/kokkos/core/perf_test/test_taskdag.cpp | 2 + lib/kokkos/core/src/Cuda/Kokkos_Cuda.hpp | 8 +- lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp | 103 +- .../Cuda/Kokkos_Cuda_BlockSize_Deduction.hpp | 8 +- .../src/Cuda/Kokkos_Cuda_GraphNodeKernel.hpp | 8 - .../src/Cuda/Kokkos_Cuda_GraphNode_Impl.hpp | 1 - .../core/src/Cuda/Kokkos_Cuda_Graph_Impl.hpp | 43 +- .../core/src/Cuda/Kokkos_Cuda_Instance.cpp | 441 ++--- .../core/src/Cuda/Kokkos_Cuda_Instance.hpp | 351 +++- .../src/Cuda/Kokkos_Cuda_KernelLaunch.hpp | 81 +- .../src/Cuda/Kokkos_Cuda_Parallel_Team.hpp | 7 +- .../core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp | 2 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp | 32 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp | 67 +- .../core/src/Cuda/Kokkos_Cuda_ZeroMemset.hpp | 14 +- lib/kokkos/core/src/HIP/Kokkos_HIP.cpp | 10 +- lib/kokkos/core/src/HIP/Kokkos_HIP.hpp | 7 +- .../src/HIP/Kokkos_HIP_GraphNodeKernel.hpp | 161 ++ .../src/HIP/Kokkos_HIP_GraphNode_Impl.hpp | 54 + .../core/src/HIP/Kokkos_HIP_Graph_Impl.hpp | 187 ++ .../core/src/HIP/Kokkos_HIP_Instance.cpp | 106 +- .../core/src/HIP/Kokkos_HIP_Instance.hpp | 44 +- .../core/src/HIP/Kokkos_HIP_KernelLaunch.hpp | 157 +- .../src/HIP/Kokkos_HIP_Parallel_MDRange.hpp | 8 +- .../src/HIP/Kokkos_HIP_Parallel_Range.hpp | 102 +- .../core/src/HIP/Kokkos_HIP_Parallel_Team.hpp | 52 +- .../core/src/HIP/Kokkos_HIP_ReduceScan.hpp | 48 +- .../src/HIP/Kokkos_HIP_Shuffle_Reduce.hpp | 9 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Space.cpp | 23 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Space.hpp | 3 + lib/kokkos/core/src/HIP/Kokkos_HIP_Team.hpp | 69 +- .../core/src/HIP/Kokkos_HIP_Vectorization.hpp | 2 +- lib/kokkos/core/src/HPX/Kokkos_HPX.cpp | 27 +- lib/kokkos/core/src/HPX/Kokkos_HPX.hpp | 57 +- lib/kokkos/core/src/HPX/Kokkos_HPX_Task.hpp | 9 +- .../src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp | 3 +- lib/kokkos/core/src/Kokkos_Abort.hpp | 105 ++ lib/kokkos/core/src/Kokkos_Array.hpp | 20 +- lib/kokkos/core/src/Kokkos_Assert.hpp | 70 + .../core/src/Kokkos_BitManipulation.hpp | 37 +- lib/kokkos/core/src/Kokkos_Complex.hpp | 5 + lib/kokkos/core/src/Kokkos_Concepts.hpp | 4 +- lib/kokkos/core/src/Kokkos_CopyViews.hpp | 57 +- lib/kokkos/core/src/Kokkos_Core_fwd.hpp | 1 + lib/kokkos/core/src/Kokkos_Graph.hpp | 6 + lib/kokkos/core/src/Kokkos_Half.hpp | 1 + lib/kokkos/core/src/Kokkos_HostSpace.hpp | 11 +- lib/kokkos/core/src/Kokkos_Macros.hpp | 2 +- .../core/src/Kokkos_MathematicalFunctions.hpp | 10 +- .../Kokkos_MathematicalSpecialFunctions.hpp | 81 +- lib/kokkos/core/src/Kokkos_MemoryPool.hpp | 2 - lib/kokkos/core/src/Kokkos_Pair.hpp | 6 +- .../core/src/Kokkos_Parallel_Reduce.hpp | 1 - lib/kokkos/core/src/Kokkos_Printf.hpp | 54 + lib/kokkos/core/src/Kokkos_ScratchSpace.hpp | 2 +- .../core/src/OpenACC/Kokkos_OpenACC.hpp | 3 + .../OpenACC/Kokkos_OpenACC_FunctorAdapter.hpp | 2 +- .../Kokkos_OpenACC_ParallelFor_Team.hpp | 3 +- .../Kokkos_OpenACC_ParallelScan_Range.hpp | 98 +- .../src/OpenACC/Kokkos_OpenACC_Traits.hpp | 3 + lib/kokkos/core/src/OpenMP/Kokkos_OpenMP.cpp | 2 + lib/kokkos/core/src/OpenMP/Kokkos_OpenMP.hpp | 1 - .../src/OpenMP/Kokkos_OpenMP_Instance.cpp | 2 - .../src/OpenMP/Kokkos_OpenMP_Instance.hpp | 14 +- .../src/OpenMP/Kokkos_OpenMP_Parallel.hpp | 1267 ------------- .../src/OpenMP/Kokkos_OpenMP_Parallel_For.hpp | 433 +++++ .../OpenMP/Kokkos_OpenMP_Parallel_Reduce.hpp | 567 ++++++ .../OpenMP/Kokkos_OpenMP_Parallel_Scan.hpp | 312 ++++ .../core/src/OpenMP/Kokkos_OpenMP_Task.hpp | 5 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp | 9 +- .../Kokkos_OpenMPTarget_Instance.cpp | 10 +- ...Kokkos_OpenMPTarget_ParallelScan_Range.hpp | 3 +- .../Kokkos_OpenMPTarget_ParallelScan_Team.hpp | 65 +- .../Kokkos_OpenMPTarget_Parallel_Common.hpp | 117 +- lib/kokkos/core/src/SYCL/Kokkos_SYCL.cpp | 14 + lib/kokkos/core/src/SYCL/Kokkos_SYCL.hpp | 6 +- .../core/src/SYCL/Kokkos_SYCL_Abort.hpp | 4 +- .../src/SYCL/Kokkos_SYCL_Half_Conversion.hpp | 128 +- .../src/SYCL/Kokkos_SYCL_Half_Impl_Type.hpp | 37 +- .../core/src/SYCL/Kokkos_SYCL_Instance.cpp | 107 +- ...pp => Kokkos_SYCL_ParallelFor_MDRange.hpp} | 133 +- .../SYCL/Kokkos_SYCL_ParallelFor_Range.hpp | 148 ++ .../src/SYCL/Kokkos_SYCL_ParallelFor_Team.hpp | 188 ++ .../Kokkos_SYCL_ParallelReduce_MDRange.hpp | 343 ++++ .../SYCL/Kokkos_SYCL_ParallelReduce_Range.hpp | 362 ++++ .../SYCL/Kokkos_SYCL_ParallelReduce_Team.hpp | 458 +++++ ...hpp => Kokkos_SYCL_ParallelScan_Range.hpp} | 34 +- .../src/SYCL/Kokkos_SYCL_Parallel_Reduce.hpp | 788 -------- .../src/SYCL/Kokkos_SYCL_Parallel_Team.hpp | 914 --------- .../core/src/SYCL/Kokkos_SYCL_Space.cpp | 2 + lib/kokkos/core/src/SYCL/Kokkos_SYCL_Team.hpp | 75 +- .../core/src/SYCL/Kokkos_SYCL_TeamPolicy.hpp | 357 ++++ .../SYCL/Kokkos_SYCL_WorkgroupReduction.hpp | 177 ++ .../core/src/SYCL/Kokkos_SYCL_ZeroMemset.hpp | 2 + lib/kokkos/core/src/Serial/Kokkos_Serial.cpp | 6 + lib/kokkos/core/src/Serial/Kokkos_Serial.hpp | 38 + .../core/src/Threads/Kokkos_Threads.hpp | 16 - .../core/src/Threads/Kokkos_ThreadsExec.hpp | 5 +- .../core/src/Threads/Kokkos_ThreadsTeam.hpp | 63 +- .../Kokkos_Threads_ParallelFor_MDRange.hpp | 115 ++ .../Kokkos_Threads_ParallelFor_Range.hpp | 122 ++ .../Kokkos_Threads_ParallelFor_Team.hpp | 118 ++ ...Kokkos_Threads_ParallelReduce_MDRange.hpp} | 91 +- .../Kokkos_Threads_ParallelReduce_Range.hpp | 171 ++ ...=> Kokkos_Threads_ParallelReduce_Team.hpp} | 94 +- .../Kokkos_Threads_ParallelScan_Range.hpp | 198 ++ .../Threads/Kokkos_Threads_Parallel_Range.hpp | 435 ----- .../Kokkos_Threads_WorkGraphPolicy.hpp | 2 +- .../src/View/MDSpan/Kokkos_MDSpan_Extents.hpp | 10 +- .../src/View/MDSpan/Kokkos_MDSpan_Header.hpp | 24 +- .../core/src/decl/Kokkos_Declare_OPENMP.hpp | 3 + .../core/src/decl/Kokkos_Declare_SYCL.hpp | 11 +- .../core/src/decl/Kokkos_Declare_THREADS.hpp | 10 + lib/kokkos/core/src/impl/Kokkos_Abort.cpp | 44 + .../src/impl/Kokkos_CheckedIntegerOps.hpp | 66 + lib/kokkos/core/src/impl/Kokkos_Core.cpp | 25 +- .../src/impl/Kokkos_Default_Graph_Impl.hpp | 2 - lib/kokkos/core/src/impl/Kokkos_Error.cpp | 24 +- lib/kokkos/core/src/impl/Kokkos_Error.hpp | 148 +- .../core/src/impl/Kokkos_FunctorAnalysis.hpp | 4 - .../impl/Kokkos_Half_FloatingPointWrapper.hpp | 161 +- .../Kokkos_Half_MathematicalFunctions.hpp | 259 +++ .../src/impl/Kokkos_Half_NumericTraits.hpp | 60 +- lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp | 98 +- .../src/impl/Kokkos_HostSpace_ZeroMemset.hpp | 2 - .../src/impl/Kokkos_HostSpace_deepcopy.cpp | 2 +- .../core/src/impl/Kokkos_HostThreadTeam.hpp | 73 +- lib/kokkos/core/src/impl/Kokkos_Profiling.cpp | 16 +- .../core/src/impl/Kokkos_SharedAlloc.cpp | 50 +- .../core/src/impl/Kokkos_SharedAlloc.hpp | 4 +- .../src/impl/Kokkos_SharedAlloc_timpl.hpp | 6 +- .../core/src/impl/Kokkos_TaskQueueCommon.hpp | 8 +- .../src/impl/Kokkos_TaskQueueMultiple.hpp | 4 +- lib/kokkos/core/src/impl/Kokkos_Utilities.hpp | 27 + .../core/src/impl/Kokkos_ViewMapping.hpp | 4 +- .../core/src/setup/Kokkos_Setup_SYCL.hpp | 5 + lib/kokkos/core/unit_test/CMakeLists.txt | 151 +- lib/kokkos/core/unit_test/TestAbort.hpp | 10 +- lib/kokkos/core/unit_test/TestArrayOps.hpp | 393 ++++ .../core/unit_test/TestAtomicOperations.hpp | 1421 ++++---------- .../TestAtomicOperations_complexdouble.hpp | 26 +- .../TestAtomicOperations_complexfloat.hpp | 26 +- .../unit_test/TestAtomicOperations_double.hpp | 19 +- .../unit_test/TestAtomicOperations_float.hpp | 19 +- .../unit_test/TestAtomicOperations_int.hpp | 29 +- .../TestAtomicOperations_longint.hpp | 29 +- .../TestAtomicOperations_longlongint.hpp | 29 +- .../TestAtomicOperations_unsignedint.hpp | 33 +- .../TestAtomicOperations_unsignedlongint.hpp | 33 +- ...stAtomicOperations_unsignedlonglongint.hpp | 36 + lib/kokkos/core/unit_test/TestAtomics.hpp | 14 +- .../core/unit_test/TestBitManipulation.cpp | 4 +- .../unit_test/TestBitManipulationBuiltins.hpp | 19 +- .../core/unit_test/TestCheckedIntegerOps.hpp | 51 + .../unit_test/TestExecSpacePartitioning.hpp | 69 +- .../core/unit_test/TestHalfOperators.hpp | 107 +- .../TestHostSharedPtrAccessOnDevice.hpp | 6 - .../TestJoinBackwardCompatibility.hpp | 29 +- .../core/unit_test/TestLocalDeepCopy.hpp | 29 +- .../TestMDRangePolicyConstructors.hpp | 2 - lib/kokkos/core/unit_test/TestMDSpan.hpp | 4 +- .../unit_test/TestMathematicalConstants.hpp | 3 +- .../unit_test/TestMathematicalFunctions.hpp | 806 +++++++- .../TestMathematicalSpecialFunctions.hpp | 67 +- lib/kokkos/core/unit_test/TestMinMaxClamp.hpp | 5 - .../core/unit_test/TestNumericTraits.hpp | 122 +- lib/kokkos/core/unit_test/TestOther.hpp | 5 - lib/kokkos/core/unit_test/TestPrintf.hpp | 37 + .../core/unit_test/TestQuadPrecisionMath.hpp | 2 +- lib/kokkos/core/unit_test/TestRange.hpp | 10 +- .../core/unit_test/TestRangePolicyRequire.hpp | 13 +- lib/kokkos/core/unit_test/TestReducers.hpp | 7 +- lib/kokkos/core/unit_test/TestReducers_b.hpp | 4 + lib/kokkos/core/unit_test/TestSharedSpace.cpp | 8 +- .../core/unit_test/TestTaskScheduler.hpp | 2 +- lib/kokkos/core/unit_test/TestTeam.hpp | 25 +- lib/kokkos/core/unit_test/TestTeamScan.hpp | 129 ++ lib/kokkos/core/unit_test/TestTeamScratch.hpp | 18 + lib/kokkos/core/unit_test/TestTeamVector.hpp | 182 +- .../core/unit_test/TestTeamVectorRange.hpp | 22 +- lib/kokkos/core/unit_test/TestUtilities.hpp | 90 + lib/kokkos/core/unit_test/TestViewAPI.hpp | 4 +- .../core/unit_test/TestViewCtorDimMatch.hpp | 4 +- .../TestViewLayoutStrideAssignment.hpp | 2 - .../TestViewMemoryAccessViolation.hpp | 8 +- .../core/unit_test/cuda/TestCuda_Spaces.cpp | 10 - .../headers_self_contained/CMakeLists.txt | 4 + .../hpx/TestHPX_IndependentInstances.cpp | 2 +- ...X_IndependentInstancesDelayedExecution.cpp | 2 +- ...estHPX_IndependentInstancesInstanceIds.cpp | 2 +- .../unit_test/sycl/TestSYCL_InterOp_Init.cpp | 3 +- .../sycl/TestSYCL_InterOp_Init_Context.cpp | 6 +- .../sycl/TestSYCL_InterOp_Streams.cpp | 3 +- .../sycl/TestSYCL_TeamScratchStreams.cpp | 6 +- .../view/TestExtentsDatatypeConversion.cpp | 53 +- .../build_cmake_in_tree/cmake_example.cpp | 2 + .../build_cmake_installed/cmake_example.cpp | 2 + .../foo.cpp | 2 +- .../cmake_example.cpp | 2 + .../03_vectorization/vectorization.cpp | 7 +- lib/kokkos/generate_makefile.bash | 11 +- lib/kokkos/master_history.txt | 1 + lib/kokkos/simd/src/Kokkos_SIMD.hpp | 61 +- lib/kokkos/simd/src/Kokkos_SIMD_AVX2.hpp | 1216 +++++++++--- lib/kokkos/simd/src/Kokkos_SIMD_AVX512.hpp | 1647 ++++++++++++----- lib/kokkos/simd/src/Kokkos_SIMD_Common.hpp | 167 +- .../simd/src/Kokkos_SIMD_Common_Math.hpp | 260 +++ lib/kokkos/simd/src/Kokkos_SIMD_NEON.hpp | 999 ++++++++-- lib/kokkos/simd/src/Kokkos_SIMD_Scalar.hpp | 229 ++- lib/kokkos/simd/unit_tests/CMakeLists.txt | 2 + lib/kokkos/simd/unit_tests/TestSIMD.cpp | 548 +----- .../unit_tests/include/SIMDTesting_Ops.hpp | 212 +++ .../include/SIMDTesting_Utilities.hpp | 167 ++ .../unit_tests/include/TestSIMD_Condition.hpp | 105 ++ .../include/TestSIMD_Conversions.hpp | 131 ++ .../include/TestSIMD_GeneratorCtors.hpp | 140 ++ .../unit_tests/include/TestSIMD_MaskOps.hpp | 116 ++ .../unit_tests/include/TestSIMD_MathOps.hpp | 289 +++ .../unit_tests/include/TestSIMD_ShiftOps.hpp | 280 +++ .../include/TestSIMD_WhereExpressions.hpp | 195 ++ ...da_cc7_asm_atomic_fetch_op.inc_forceglobal | 153 -- .../cuda_cc7_asm_atomic_fetch_op.inc_generic | 151 -- .../cuda_cc7_asm_atomic_fetch_op.inc_isglobal | 57 +- ...cuda_cc7_asm_atomic_fetch_op.inc_predicate | 54 +- .../cuda_cc7_asm_atomic_op.inc_forceglobal | 64 - .../cuda/cuda_cc7_asm_atomic_op.inc_generic | 64 - .../cuda/cuda_cc7_asm_atomic_op.inc_isglobal | 57 +- .../cuda/cuda_cc7_asm_atomic_op.inc_predicate | 57 +- .../__p0009_bits/compressed_pair.hpp | 54 +- .../experimental/__p0009_bits/config.hpp | 68 +- .../__p0009_bits/default_accessor.hpp | 50 +- .../__p0009_bits/dynamic_extent.hpp | 72 +- .../experimental/__p0009_bits/extents.hpp | 953 +++++----- .../__p0009_bits/full_extent_t.hpp | 48 +- .../experimental/__p0009_bits/layout_left.hpp | 96 +- .../__p0009_bits/layout_right.hpp | 97 +- .../__p0009_bits/layout_stride.hpp | 228 +-- .../experimental/__p0009_bits/macros.hpp | 76 +- .../__p0009_bits/maybe_static_value.hpp | 152 -- .../experimental/__p0009_bits/mdspan.hpp | 197 +- .../__p0009_bits/no_unique_address.hpp | 54 +- .../standard_layout_static_array.hpp | 685 ------- .../__p0009_bits/static_array.hpp | 286 --- .../experimental/__p0009_bits/submdspan.hpp | 586 ------ .../__p0009_bits/trait_backports.hpp | 62 +- .../experimental/__p0009_bits/type_list.hpp | 52 +- .../experimental/__p1684_bits/mdarray.hpp | 221 ++- .../__p2630_bits/strided_slice.hpp | 49 + .../experimental/__p2630_bits/submdspan.hpp | 42 + .../__p2630_bits/submdspan_extents.hpp | 323 ++++ .../__p2630_bits/submdspan_mapping.hpp | 299 +++ .../tpls/mdspan/include/experimental/mdarray | 48 - .../tpls/mdspan/include/experimental/mdspan | 56 - .../tpls/mdspan/include/mdspan/mdarray.hpp | 31 + .../tpls/mdspan/include/mdspan/mdspan.hpp | 41 + 493 files changed, 41548 insertions(+), 15629 deletions(-) create mode 100644 lib/kokkos/algorithms/src/sorting/Kokkos_BinOpsPublicAPI.hpp create mode 100644 lib/kokkos/algorithms/src/sorting/Kokkos_BinSortPublicAPI.hpp create mode 100644 lib/kokkos/algorithms/src/sorting/Kokkos_NestedSortPublicAPI.hpp create mode 100644 lib/kokkos/algorithms/src/sorting/Kokkos_SortPublicAPI.hpp create mode 100644 lib/kokkos/algorithms/src/sorting/impl/Kokkos_CopyOpsForBinSortImpl.hpp create mode 100644 lib/kokkos/algorithms/src/sorting/impl/Kokkos_NestedSortImpl.hpp create mode 100644 lib/kokkos/algorithms/src/sorting/impl/Kokkos_SortImpl.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FunctorsForExclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MustUseKokkosSingleInTeam.hpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestSortCustomComp.hpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamAdjacentDifference.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamAdjacentFind.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamAllOf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamAnyOf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamCopy.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamCopyBackward.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamCopyIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamCopy_n.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamCount.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamCountIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamEqual.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamExclusiveScan.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFill.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFill_n.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFind.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFindEnd.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFindFirstOf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFindIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamFindIfNot.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamForEach.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamForEachN.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamGenerate.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamGenerate_n.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamInclusiveScan.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamIsPartitioned.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamIsSorted.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamIsSortedUntil.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamLexicographicalCompare.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamMaxElement.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamMinElement.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamMinMaxElement.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamMismatch.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamMove.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamMoveBackward.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamNoneOf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamPartitionCopy.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamPartitionPoint.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReduce.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamRemove.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamRemoveCopy.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamRemoveCopyIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamRemoveIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReplace.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReplaceCopy.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReplaceCopyIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReplaceIf.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReverse.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamReverseCopy.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamRotate.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamRotateCopy.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamSearch.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamSearchN.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamShiftLeft.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamShiftRight.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamSwapRanges.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamTransformBinaryOp.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamTransformExclusiveScan.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamTransformInclusiveScan.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamTransformReduce.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamTransformUnaryOp.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamUnique.cpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsTeamUniqueCopy.cpp create mode 100644 lib/kokkos/benchmarks/CMakeLists.txt create mode 100644 lib/kokkos/benchmarks/gups/CMakeLists.txt delete mode 100644 lib/kokkos/benchmarks/gups/Makefile delete mode 100644 lib/kokkos/benchmarks/gups/gups-kokkos.cpp create mode 100644 lib/kokkos/benchmarks/gups/gups.cpp create mode 100644 lib/kokkos/core/perf_test/PerfTest_MallocFree.cpp create mode 100644 lib/kokkos/core/src/HIP/Kokkos_HIP_GraphNodeKernel.hpp create mode 100644 lib/kokkos/core/src/HIP/Kokkos_HIP_GraphNode_Impl.hpp create mode 100644 lib/kokkos/core/src/HIP/Kokkos_HIP_Graph_Impl.hpp create mode 100644 lib/kokkos/core/src/Kokkos_Abort.hpp create mode 100644 lib/kokkos/core/src/Kokkos_Assert.hpp create mode 100644 lib/kokkos/core/src/Kokkos_Printf.hpp delete mode 100644 lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel.hpp create mode 100644 lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel_For.hpp create mode 100644 lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel_Reduce.hpp create mode 100644 lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel_Scan.hpp rename lib/kokkos/core/src/SYCL/{Kokkos_SYCL_Parallel_Range.hpp => Kokkos_SYCL_ParallelFor_MDRange.hpp} (61%) create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_ParallelFor_Range.hpp create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_ParallelFor_Team.hpp create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_ParallelReduce_MDRange.hpp create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_ParallelReduce_Range.hpp create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_ParallelReduce_Team.hpp rename lib/kokkos/core/src/SYCL/{Kokkos_SYCL_Parallel_Scan.hpp => Kokkos_SYCL_ParallelScan_Range.hpp} (95%) delete mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_Parallel_Reduce.hpp delete mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_Parallel_Team.hpp create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_TeamPolicy.hpp create mode 100644 lib/kokkos/core/src/SYCL/Kokkos_SYCL_WorkgroupReduction.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_ParallelFor_MDRange.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_ParallelFor_Range.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_ParallelFor_Team.hpp rename lib/kokkos/core/src/Threads/{Kokkos_Threads_Parallel_MDRange.hpp => Kokkos_Threads_ParallelReduce_MDRange.hpp} (65%) create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_ParallelReduce_Range.hpp rename lib/kokkos/core/src/Threads/{Kokkos_Threads_Parallel_Team.hpp => Kokkos_Threads_ParallelReduce_Team.hpp} (59%) create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_ParallelScan_Range.hpp delete mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel_Range.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_Abort.cpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_CheckedIntegerOps.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_Half_MathematicalFunctions.hpp create mode 100644 lib/kokkos/core/unit_test/TestArrayOps.hpp create mode 100644 lib/kokkos/core/unit_test/TestAtomicOperations_unsignedlonglongint.hpp create mode 100644 lib/kokkos/core/unit_test/TestCheckedIntegerOps.hpp create mode 100644 lib/kokkos/core/unit_test/TestPrintf.hpp create mode 100644 lib/kokkos/simd/src/Kokkos_SIMD_Common_Math.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/SIMDTesting_Ops.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/SIMDTesting_Utilities.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_Condition.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_Conversions.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_GeneratorCtors.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_MaskOps.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_MathOps.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_ShiftOps.hpp create mode 100644 lib/kokkos/simd/unit_tests/include/TestSIMD_WhereExpressions.hpp delete mode 100644 lib/kokkos/tpls/desul/include/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_forceglobal delete mode 100644 lib/kokkos/tpls/desul/include/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_generic delete mode 100644 lib/kokkos/tpls/desul/include/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_forceglobal delete mode 100644 lib/kokkos/tpls/desul/include/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_generic delete mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p0009_bits/maybe_static_value.hpp delete mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p0009_bits/standard_layout_static_array.hpp delete mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p0009_bits/static_array.hpp delete mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p0009_bits/submdspan.hpp create mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p2630_bits/strided_slice.hpp create mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p2630_bits/submdspan.hpp create mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p2630_bits/submdspan_extents.hpp create mode 100644 lib/kokkos/tpls/mdspan/include/experimental/__p2630_bits/submdspan_mapping.hpp delete mode 100644 lib/kokkos/tpls/mdspan/include/experimental/mdarray delete mode 100644 lib/kokkos/tpls/mdspan/include/experimental/mdspan create mode 100644 lib/kokkos/tpls/mdspan/include/mdspan/mdarray.hpp create mode 100644 lib/kokkos/tpls/mdspan/include/mdspan/mdspan.hpp diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index 4c145c44b3..c6115f4b3d 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,6 +1,97 @@ # CHANGELOG -## [4.1.00](https://github.com/kokkos/kokkos/tree/4.0.01) (2023-06-16) +## [4.2.00](https://github.com/kokkos/kokkos/tree/4.2.00) (2023-11-06) +[Full Changelog](https://github.com/kokkos/kokkos/compare/4.1.00...4.2.00) + +### Features: +- SIMD: significant improvements to SIMD support and alignment with C++26 SIMD + - add `Kokkos::abs` overload for SIMD types [\#6069](https://github.com/kokkos/kokkos/pull/6069) + - add generator constructors [\#6347](https://github.com/kokkos/kokkos/pull/6347) + - convert binary operators to hidden friends [\#6320](https://github.com/kokkos/kokkos/pull/6320) + - add shift operators [\#6109](https://github.com/kokkos/kokkos/pull/6109) + - add `float` support [\#6177](https://github.com/kokkos/kokkos/pull/6177) + - add remaining `gather_from` and `scatter_to` overloads [\#6220](https://github.com/kokkos/kokkos/pull/6220) + - define simd math function overloads in the Kokkos namespace [\#6465](https://github.com/kokkos/kokkos/pull/6465), [\#6487](https://github.com/kokkos/kokkos/pull/6487) + - `Kokkos_ENABLE_NATIVE=ON` autodetects SIMD types supported [\#6188](https://github.com/kokkos/kokkos/pull/6188) + - fix AVX2 SIMD support for ZEN2 AMD CPU [\#6238](https://github.com/kokkos/kokkos/pull/6238) +- `Kokkos::printf` [\#6083](https://github.com/kokkos/kokkos/pull/6083) +- `Kokkos::sort`: support custom comparator [\#6253](https://github.com/kokkos/kokkos/pull/6253) +- `half_t` and `bhalf_t` numeric traits [\#5778](https://github.com/kokkos/kokkos/pull/5778) +- `half_t` and `bhalf_t` mixed comparisons [\#6407](https://github.com/kokkos/kokkos/pull/6407) +- `half_t` and `bhalf_t` mathematical functions [\#6124](https://github.com/kokkos/kokkos/pull/6124) +- `TeamThreadRange` `parallel_scan` with return value [\#6090](https://github.com/kokkos/kokkos/pull/6090), [\#6301](https://github.com/kokkos/kokkos/pull/6301), [\#6302](https://github.com/kokkos/kokkos/pull/6302), [\#6303](https://github.com/kokkos/kokkos/pull/6303), [\#6307](https://github.com/kokkos/kokkos/pull/6307) +- `ThreadVectorRange` `parallel_scan` with return value [\#6235](https://github.com/kokkos/kokkos/pull/6235), [\#6242](https://github.com/kokkos/kokkos/pull/6242), [\#6308](https://github.com/kokkos/kokkos/pull/6308), [\#6305](https://github.com/kokkos/kokkos/pull/6305), [\#6292](https://github.com/kokkos/kokkos/pull/6292) +- Add team-level std algorithms [\#6200](https://github.com/kokkos/kokkos/pull/6200), [\#6205](https://github.com/kokkos/kokkos/pull/6205), [\#6207](https://github.com/kokkos/kokkos/pull/6207), [\#6208](https://github.com/kokkos/kokkos/pull/6208), [\#6209](https://github.com/kokkos/kokkos/pull/6209), [\#6210](https://github.com/kokkos/kokkos/pull/6210), [\#6211](https://github.com/kokkos/kokkos/pull/6211), [\#6212](https://github.com/kokkos/kokkos/pull/6212), [\#6213](https://github.com/kokkos/kokkos/pull/6213), [\#6256](https://github.com/kokkos/kokkos/pull/6256), [\#6258](https://github.com/kokkos/kokkos/pull/6258), [\#6350](https://github.com/kokkos/kokkos/pull/6350), [\#6351](https://github.com/kokkos/kokkos/pull/6351) +- Serial: Allow for distinct execution space instances [\#6441](https://github.com/kokkos/kokkos/pull/6441) + +### Backend and Architecture Enhancements: + +#### CUDA: +- Fixed potential data race in Cuda `parallel_reduce` [\#6236](https://github.com/kokkos/kokkos/pull/6236) +- Use `cudaMallocAsync` by default [\#6402](https://github.com/kokkos/kokkos/pull/6402) +- Bugfix for using Kokkos from a thread of execution [\#6299](https://github.com/kokkos/kokkos/pull/6299) + +#### HIP: +- New naming convention for AMD GPU: VEGA906, VEGA908, VEGA90A, NAVI1030 to AMD_GFX906, AMD_GFX908, AMD_GFX90A, AMD_GFX1030 [\#6266](https://github.com/kokkos/kokkos/pull/6266) +- Add initial support for gfx942: [\#6358](https://github.com/kokkos/kokkos/pull/6358) +- Improve reduction performance [\#6229](https://github.com/kokkos/kokkos/pull/6229) +- Deprecate `HIP(hipStream_t,bool)` constructor [\#6401](https://github.com/kokkos/kokkos/pull/6401) +- Add support for Graph [\#6370](https://github.com/kokkos/kokkos/pull/6370) +- Improve reduction performance when using Teams [\#6284](https://github.com/kokkos/kokkos/pull/6284) +- Fix concurrency calculation [\#6479](https://github.com/kokkos/kokkos/pull/6479) +- Fix potential data race in HIP `parallel_reduce` [\#6429](https://github.com/kokkos/kokkos/pull/6429) + +#### SYCL: +- Enforce external `sycl::queues` to be in-order [\#6246](https://github.com/kokkos/kokkos/pull/6246) +- Improve reduction performance: [\#6272](https://github.com/kokkos/kokkos/pull/6272) [\#6271](https://github.com/kokkos/kokkos/pull/6271) [\#6270](https://github.com/kokkos/kokkos/pull/6270) [\#6264](https://github.com/kokkos/kokkos/pull/6264) +- Allow using the SYCL execution space on AMD GPUs [\#6321](https://github.com/kokkos/kokkos/pull/6321) +- Allow sorting via native oneDPL to support Views with stride=1 [\#6322](https://github.com/kokkos/kokkos/pull/6322) +- Make in-order queues the default via macro [\#6189](https://github.com/kokkos/kokkos/pull/6189) + +#### OpenACC: +- Support Clacc compiler [\#6250](https://github.com/kokkos/kokkos/pull/6250) + +### General Enhancements +- Add missing `is_*_view` traits and `is_*_view_v` helper variable templates for `DynRankView`, `DynamicView`, `OffsetView`, `ScatterView` containers [\#6195](https://github.com/kokkos/kokkos/pull/6195) +- Make `nvcc_wrapper` and `compiler_launcher` scripts more portable by switching to a `#!/usr/bin/env` shebang [\#6357](https://github.com/kokkos/kokkos/pull/6357) +- Add an improved `Kokkos::malloc` / `Kokkos::free` performance test [\#6377](https://github.com/kokkos/kokkos/pull/6377) +- Ensure `Views` with `size==0` can be used with `deep_copy` [\#6273](https://github.com/kokkos/kokkos/pull/6273) +- `Kokkos::abort` is moved to header `Kokkos_Abort.hpp` [\#6445](https://github.com/kokkos/kokkos/pull/6445) +- `KOKKOS_ASSERT`, `KOKKOS_EXPECTS`, `KOKKOS_ENSURES` are moved to header `Kokkos_Assert.hpp` [\#6445](https://github.com/kokkos/kokkos/pull/6445) +- Add a permuted-index mode to the gups benchmark [\#6378](https://github.com/kokkos/kokkos/pull/6378) +- Check for overflow during backend initialization [\#6159](https://github.com/kokkos/kokkos/pull/6159) +- Make constraints on `Kokkos::sort` more visible [\#6234](https://github.com/kokkos/kokkos/pull/6234) and cleanup API [\#6239](https://github.com/kokkos/kokkos/pull/6239) +- Add converting assignment to `DualView`: [\#6474](https://github.com/kokkos/kokkos/pull/6474) + + +### Build System Changes + +- Export `Kokkos_CXX_COMPILER_VERSION` [\#6282](https://github.com/kokkos/kokkos/pull/6282) +- Disable default oneDPL support in Trilinos [\#6342](https://github.com/kokkos/kokkos/pull/6342) + +### Incompatibilities (i.e. breaking changes) + - Ensure that `Kokkos::complex` only gets instantiated for cv-unqualified floating-point types [\#6251](https://github.com/kokkos/kokkos/pull/6251) + - Removed (deprecated-3) support for volatile join operators in reductions [\#6385](https://github.com/kokkos/kokkos/pull/6385) + - Enforce `ViewCtorArgs` restrictions for `create_mirror_view` [\#6304](https://github.com/kokkos/kokkos/pull/6304) + - SIMD types for ARM NEON are not autodetected anymore but need `Kokkos_ARCH_ARM_NEON` or `Kokkos_ARCH_NATIVE=ON` [\#6394](https://github.com/kokkos/kokkos/pull/6394) + - Remove `#include ` from headers where possible [\#6482](https://github.com/kokkos/kokkos/pull/6482) + +### Deprecations +- Deprecated `Kokkos::vector` [\#6252](https://github.com/kokkos/kokkos/pull/6252) +- All host allocation mechanisms except for `STD_MALLOC` have been deprecated [\#6341](https://github.com/kokkos/kokkos/pull/6341) + +### Bug Fixes + - Missing memory fence in `RandomPool::free_state` functions [\#6290](https://github.com/kokkos/kokkos/pull/6290) + - Fix for corner case in `Kokkos::Experimental::is_partitioned` algorithm [\#6257](https://github.com/kokkos/kokkos/pull/6257) + - Fix initialization of scratch lock variables in the `Cuda` backend [\#6433](https://github.com/kokkos/kokkos/pull/6433) + - Fixes for `Kokkos::Array` [\#6372](https://github.com/kokkos/kokkos/pull/6372) + - Fixed symlink configure issue for Windows [\#6241](https://github.com/kokkos/kokkos/pull/6241) + - OpenMPTarget init-join fix [\#6444](https://github.com/kokkos/kokkos/pull/6444) + - Fix atomic operations bug for Min and Max [\#6435](https://github.com/kokkos/kokkos/pull/6435) + - Fix implementation for `cyl_bessel_i0` [\#6484](https://github.com/kokkos/kokkos/pull/6484) + - Fix various NVCC warnings in `BinSort`, `Array`, and bit manipulation function templates [\#6483](https://github.com/kokkos/kokkos/pull/6483) + +## [4.1.00](https://github.com/kokkos/kokkos/tree/4.1.00) (2023-06-16) [Full Changelog](https://github.com/kokkos/kokkos/compare/4.0.01...4.1.00) ### Features: diff --git a/lib/kokkos/CMakeLists.txt b/lib/kokkos/CMakeLists.txt index 895cee6a08..f6bd81058e 100644 --- a/lib/kokkos/CMakeLists.txt +++ b/lib/kokkos/CMakeLists.txt @@ -150,8 +150,8 @@ ENDIF() set(Kokkos_VERSION_MAJOR 4) -set(Kokkos_VERSION_MINOR 1) -set(Kokkos_VERSION_PATCH 00) +set(Kokkos_VERSION_MINOR 2) +set(Kokkos_VERSION_PATCH 0) set(Kokkos_VERSION "${Kokkos_VERSION_MAJOR}.${Kokkos_VERSION_MINOR}.${Kokkos_VERSION_PATCH}") message(STATUS "Kokkos version: ${Kokkos_VERSION}") math(EXPR KOKKOS_VERSION "${Kokkos_VERSION_MAJOR} * 10000 + ${Kokkos_VERSION_MINOR} * 100 + ${Kokkos_VERSION_PATCH}") @@ -314,7 +314,6 @@ KOKKOS_PROCESS_SUBPACKAGES() # E) If Kokkos itself is enabled, process the Kokkos package # -KOKKOS_EXCLUDE_AUTOTOOLS_FILES() KOKKOS_PACKAGE_POSTPROCESS() KOKKOS_CONFIGURE_CORE() diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index 46998091fe..c970f72755 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -11,8 +11,8 @@ CXXFLAGS += $(SHFLAGS) endif KOKKOS_VERSION_MAJOR = 4 -KOKKOS_VERSION_MINOR = 1 -KOKKOS_VERSION_PATCH = 00 +KOKKOS_VERSION_MINOR = 2 +KOKKOS_VERSION_PATCH = 0 KOKKOS_VERSION = $(shell echo $(KOKKOS_VERSION_MAJOR)*10000+$(KOKKOS_VERSION_MINOR)*100+$(KOKKOS_VERSION_PATCH) | bc) # Options: Cuda,HIP,SYCL,OpenMPTarget,OpenMP,Threads,Serial @@ -23,7 +23,7 @@ KOKKOS_DEVICES ?= "OpenMP" # NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61,Volta70,Volta72,Turing75,Ampere80,Ampere86,Ada89,Hopper90 # ARM: ARMv80,ARMv81,ARMv8-ThunderX,ARMv8-TX2,A64FX # IBM: BGQ,Power7,Power8,Power9 -# AMD-GPUS: Vega906,Vega908,Vega90A,Navi1030 +# AMD-GPUS: GFX906,GFX908,GFX90A,GFX942,GFX1030,GFX1100 # AMD-CPUS: AMDAVX,Zen,Zen2,Zen3 # Intel-GPUs: Gen9,Gen11,Gen12LP,DG1,XeHP,PVC KOKKOS_ARCH ?= "" @@ -40,7 +40,7 @@ KOKKOS_TRIBITS ?= "no" KOKKOS_STANDALONE_CMAKE ?= "no" # Default settings specific options. -# Options: force_uvm,use_ldg,rdc,enable_lambda,enable_constexpr +# Options: force_uvm,use_ldg,rdc,enable_lambda,enable_constexpr,disable_malloc_async KOKKOS_CUDA_OPTIONS ?= "enable_lambda" # Options: rdc @@ -92,6 +92,7 @@ KOKKOS_INTERNAL_CUDA_USE_UVM := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS), KOKKOS_INTERNAL_CUDA_USE_RELOC := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),rdc) KOKKOS_INTERNAL_CUDA_USE_LAMBDA := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),enable_lambda) KOKKOS_INTERNAL_CUDA_USE_CONSTEXPR := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),enable_constexpr) +KOKKOS_INTERNAL_CUDA_DISABLE_MALLOC_ASYNC := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),disable_malloc_async) KOKKOS_INTERNAL_HPX_ENABLE_ASYNC_DISPATCH := $(call kokkos_has_string,$(KOKKOS_HPX_OPTIONS),enable_async_dispatch) # deprecated KOKKOS_INTERNAL_ENABLE_DESUL_ATOMICS := $(call kokkos_has_string,$(KOKKOS_OPTIONS),enable_desul_atomics) @@ -412,10 +413,11 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ZEN3), 0) KOKKOS_INTERNAL_USE_ARCH_ZEN := $(call kokkos_has_string,$(KOKKOS_ARCH),Zen) endif endif -KOKKOS_INTERNAL_USE_ARCH_VEGA906 := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega906) -KOKKOS_INTERNAL_USE_ARCH_VEGA908 := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega908) -KOKKOS_INTERNAL_USE_ARCH_VEGA90A := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega90A) -KOKKOS_INTERNAL_USE_ARCH_NAVI1030 := $(call kokkos_has_string,$(KOKKOS_ARCH),Navi1030) +KOKKOS_INTERNAL_USE_ARCH_AMD_GFX906 := $(or $(call kokkos_has_string,$(KOKKOS_ARCH),VEGA906),$(call kokkos_has_string,$(KOKKOS_ARCH),AMD_GFX906)) +KOKKOS_INTERNAL_USE_ARCH_AMD_GFX908 := $(or $(call kokkos_has_string,$(KOKKOS_ARCH),VEGA908),$(call kokkos_has_string,$(KOKKOS_ARCH),AMD_GFX908)) +KOKKOS_INTERNAL_USE_ARCH_AMD_GFX90A := $(or $(call kokkos_has_string,$(KOKKOS_ARCH),VEGA90A),$(call kokkos_has_string,$(KOKKOS_ARCH),AMD_GFX90A)) +KOKKOS_INTERNAL_USE_ARCH_AMD_GFX1030 := $(or $(call kokkos_has_string,$(KOKKOS_ARCH),NAVI1030),$(call kokkos_has_string,$(KOKKOS_ARCH),AMD_GFX1030)) +KOKKOS_INTERNAL_USE_ARCH_AMD_GFX1100 := $(or $(call kokkos_has_string,$(KOKKOS_ARCH),NAVI1100),$(call kokkos_has_string,$(KOKKOS_ARCH),AMD_GFX1100)) # Any AVX? KOKKOS_INTERNAL_USE_ARCH_SSE42 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM)) @@ -698,6 +700,12 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_IMPL_CUDA_CLANG_WORKAROUND") endif + + ifeq ($(KOKKOS_INTERNAL_CUDA_DISABLE_MALLOC_ASYNC), 0) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_IMPL_CUDA_MALLOC_ASYNC") + else + tmp := $(call kokkos_append_header,"/* $H""undef KOKKOS_ENABLE_IMPL_CUDA_MALLOC_ASYNC */") + endif endif ifeq ($(KOKKOS_INTERNAL_USE_HPX), 1) @@ -710,6 +718,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV80), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARMV80") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARM_NEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -722,6 +731,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV81), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARMV81") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARM_NEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -734,6 +744,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_A64FX), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_A64FX") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARM_NEON") KOKKOS_CXXFLAGS += -march=armv8.2-a+sve KOKKOS_LDFLAGS += -march=armv8.2-a+sve @@ -749,7 +760,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ZEN), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_ZEN") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_AVX2") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX2") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -mavx2 @@ -762,7 +773,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ZEN2), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_ZEN2") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_AVX2") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX2") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -mavx2 @@ -775,7 +786,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ZEN3), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_ZEN3") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_AVX2") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX2") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -mavx2 @@ -789,6 +800,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARMV80") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARMV8_THUNDERX") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARM_NEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -802,6 +814,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX2), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARMV81") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARMV8_THUNDERX2") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_ARM_NEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -1085,29 +1098,34 @@ endif # Figure out the architecture flag for ROCm. -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA906), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA906") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AMD_GFX906), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GFX906") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GPU") KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx906 endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA908), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA908") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AMD_GFX908), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GFX908") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GPU") KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx908 endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA90A), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA90A") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AMD_GFX90A), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GFX90A") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GPU") KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx90a endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NAVI1030), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_NAVI1030") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_NAVI") +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AMD_GFX942), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GFX942") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GPU") + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx942 +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AMD_GFX1030), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GFX1030") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GPU") KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx1030 endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NAVI1100), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_NAVI1100") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_NAVI") +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AMD_GFX1100), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GFX1100") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AMD_GPU") KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx1100 endif diff --git a/lib/kokkos/Makefile.targets b/lib/kokkos/Makefile.targets index 4e08a46c69..ec8770dd7d 100644 --- a/lib/kokkos/Makefile.targets +++ b/lib/kokkos/Makefile.targets @@ -36,6 +36,8 @@ Kokkos_HostSpace_deepcopy.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/ $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_HostSpace_deepcopy.cpp Kokkos_NumericTraits.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_NumericTraits.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_NumericTraits.cpp +Kokkos_Abort.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Abort.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Abort.cpp ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) Kokkos_Serial.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial.cpp diff --git a/lib/kokkos/algorithms/CMakeLists.txt b/lib/kokkos/algorithms/CMakeLists.txt index ab557ab66a..368984647e 100644 --- a/lib/kokkos/algorithms/CMakeLists.txt +++ b/lib/kokkos/algorithms/CMakeLists.txt @@ -2,6 +2,6 @@ IF (NOT Kokkos_INSTALL_TESTING) ADD_SUBDIRECTORY(src) ENDIF() # FIXME_OPENACC: temporarily disabled due to unimplemented features -IF(NOT ((KOKKOS_ENABLE_OPENMPTARGET OR KOKKOS_ENABLE_OPENACC) AND KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC)) +IF(NOT ((KOKKOS_ENABLE_OPENMPTARGET AND KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC) OR KOKKOS_ENABLE_OPENACC)) KOKKOS_ADD_TEST_DIRECTORIES(unit_tests) ENDIF() diff --git a/lib/kokkos/algorithms/src/Kokkos_NestedSort.hpp b/lib/kokkos/algorithms/src/Kokkos_NestedSort.hpp index 4c8be792d8..18e0674efe 100644 --- a/lib/kokkos/algorithms/src/Kokkos_NestedSort.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_NestedSort.hpp @@ -14,175 +14,17 @@ // //@HEADER -#ifndef KOKKOS_NESTEDSORT_HPP_ -#define KOKKOS_NESTEDSORT_HPP_ - -#include -#include -#include - -namespace Kokkos { -namespace Experimental { -namespace Impl { - -// true for TeamVectorRange, false for ThreadVectorRange -template -struct NestedRange {}; - -// Specialization for team-level -template <> -struct NestedRange { - template - KOKKOS_FUNCTION static auto create(const TeamMember& t, SizeType len) { - return Kokkos::TeamVectorRange(t, len); - } - template - KOKKOS_FUNCTION static void barrier(const TeamMember& t) { - t.team_barrier(); - } -}; - -// Specialization for thread-level -template <> -struct NestedRange { - template - KOKKOS_FUNCTION static auto create(const TeamMember& t, SizeType len) { - return Kokkos::ThreadVectorRange(t, len); - } - // Barrier is no-op, as vector lanes of a thread are implicitly synchronized - // after parallel region - template - KOKKOS_FUNCTION static void barrier(const TeamMember&) {} -}; - -// When just doing sort (not sort_by_key), use nullptr_t for ValueViewType. -// This only takes the NestedRange instance for template arg deduction. -template -KOKKOS_INLINE_FUNCTION void sort_nested_impl( - const TeamMember& t, const KeyViewType& keyView, - [[maybe_unused]] const ValueViewType& valueView, const Comparator& comp, - const NestedRange) { - using SizeType = typename KeyViewType::size_type; - using KeyType = typename KeyViewType::non_const_value_type; - using Range = NestedRange; - SizeType n = keyView.extent(0); - SizeType npot = 1; - SizeType levels = 0; - // FIXME: ceiling power-of-two is a common thing to need - make it a utility - while (npot < n) { - levels++; - npot <<= 1; - } - for (SizeType i = 0; i < levels; i++) { - for (SizeType j = 0; j <= i; j++) { - // n/2 pairs of items are compared in parallel - Kokkos::parallel_for(Range::create(t, npot / 2), [=](const SizeType k) { - // How big are the brown/pink boxes? - // (Terminology comes from Wikipedia diagram) - // https://commons.wikimedia.org/wiki/File:BitonicSort.svg#/media/File:BitonicSort.svg - SizeType boxSize = SizeType(2) << (i - j); - // Which box contains this thread? - SizeType boxID = k >> (i - j); // k * 2 / boxSize; - SizeType boxStart = boxID << (1 + i - j); // boxID * boxSize - SizeType boxOffset = k - (boxStart >> 1); // k - boxID * boxSize / 2; - SizeType elem1 = boxStart + boxOffset; - // In first phase (j == 0, brown box): within a box, compare with the - // opposite value in the box. - // In later phases (j > 0, pink box): within a box, compare with fixed - // distance (boxSize / 2) apart. - SizeType elem2 = (j == 0) ? (boxStart + boxSize - 1 - boxOffset) - : (elem1 + boxSize / 2); - if (elem2 < n) { - KeyType key1 = keyView(elem1); - KeyType key2 = keyView(elem2); - if (comp(key2, key1)) { - keyView(elem1) = key2; - keyView(elem2) = key1; - if constexpr (!std::is_same_v) { - Kokkos::Experimental::swap(valueView(elem1), valueView(elem2)); - } - } - } - }); - Range::barrier(t); - } - } -} - -} // namespace Impl - -template -KOKKOS_INLINE_FUNCTION void sort_team(const TeamMember& t, - const ViewType& view) { - Impl::sort_nested_impl(t, view, nullptr, - Experimental::Impl::StdAlgoLessThanBinaryPredicate< - typename ViewType::non_const_value_type>(), - Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_team(const TeamMember& t, const ViewType& view, - const Comparator& comp) { - Impl::sort_nested_impl(t, view, nullptr, comp, Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_by_key_team(const TeamMember& t, - const KeyViewType& keyView, - const ValueViewType& valueView) { - Impl::sort_nested_impl(t, keyView, valueView, - Experimental::Impl::StdAlgoLessThanBinaryPredicate< - typename KeyViewType::non_const_value_type>(), - Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_by_key_team(const TeamMember& t, - const KeyViewType& keyView, - const ValueViewType& valueView, - const Comparator& comp) { - Impl::sort_nested_impl(t, keyView, valueView, comp, - Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_thread(const TeamMember& t, - const ViewType& view) { - Impl::sort_nested_impl(t, view, nullptr, - Experimental::Impl::StdAlgoLessThanBinaryPredicate< - typename ViewType::non_const_value_type>(), - Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_thread(const TeamMember& t, - const ViewType& view, - const Comparator& comp) { - Impl::sort_nested_impl(t, view, nullptr, comp, Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_by_key_thread(const TeamMember& t, - const KeyViewType& keyView, - const ValueViewType& valueView) { - Impl::sort_nested_impl(t, keyView, valueView, - Experimental::Impl::StdAlgoLessThanBinaryPredicate< - typename KeyViewType::non_const_value_type>(), - Impl::NestedRange()); -} - -template -KOKKOS_INLINE_FUNCTION void sort_by_key_thread(const TeamMember& t, - const KeyViewType& keyView, - const ValueViewType& valueView, - const Comparator& comp) { - Impl::sort_nested_impl(t, keyView, valueView, comp, - Impl::NestedRange()); -} - -} // namespace Experimental -} // namespace Kokkos +#ifndef KOKKOS_NESTED_SORT_HPP_ +#define KOKKOS_NESTED_SORT_HPP_ +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_NESTED_SORT +#endif + +#include "sorting/Kokkos_NestedSortPublicAPI.hpp" + +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_NESTED_SORT +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_NESTED_SORT +#endif #endif diff --git a/lib/kokkos/algorithms/src/Kokkos_Random.hpp b/lib/kokkos/algorithms/src/Kokkos_Random.hpp index abb028d28e..2d7d236d2f 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Random.hpp @@ -956,6 +956,8 @@ class Random_XorShift64_Pool { KOKKOS_INLINE_FUNCTION void free_state(const Random_XorShift64& state) const { state_(state.state_idx_, 0) = state.state_; + // Release the lock only after the state has been updated in memory + Kokkos::memory_fence(); locks_(state.state_idx_, 0) = 0; } }; @@ -1208,7 +1210,9 @@ class Random_XorShift1024_Pool { KOKKOS_INLINE_FUNCTION void free_state(const Random_XorShift1024& state) const { for (int i = 0; i < 16; i++) state_(state.state_idx_, i) = state.state_[i]; - p_(state.state_idx_, 0) = state.p_; + p_(state.state_idx_, 0) = state.p_; + // Release the lock only after the state has been updated in memory + Kokkos::memory_fence(); locks_(state.state_idx_, 0) = 0; } }; diff --git a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp index 10f9ad6462..f77484cc55 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp @@ -21,762 +21,9 @@ #define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT #endif -#include -#include -#include -#include - -#if defined(KOKKOS_ENABLE_CUDA) - -// Workaround for `Instruction 'shfl' without '.sync' is not supported on -// .target sm_70 and higher from PTX ISA version 6.4`. -// Also see https://github.com/NVIDIA/cub/pull/170. -#if !defined(CUB_USE_COOPERATIVE_GROUPS) -#define CUB_USE_COOPERATIVE_GROUPS -#endif - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wshadow" - -#if defined(KOKKOS_COMPILER_CLANG) -// Some versions of Clang fail to compile Thrust, failing with errors like -// this: -// /thrust/system/cuda/detail/core/agent_launcher.h:557:11: -// error: use of undeclared identifier 'va_printf' -// The exact combination of versions for Clang and Thrust (or CUDA) for this -// failure was not investigated, however even very recent version combination -// (Clang 10.0.0 and Cuda 10.0) demonstrated failure. -// -// Defining _CubLog here locally allows us to avoid that code path, however -// disabling some debugging diagnostics -#pragma push_macro("_CubLog") -#ifdef _CubLog -#undef _CubLog -#endif -#define _CubLog -#include -#include -#pragma pop_macro("_CubLog") -#else -#include -#include -#endif - -#pragma GCC diagnostic pop - -#endif - -#if defined(KOKKOS_ENABLE_ONEDPL) -#include -#include -#endif - -namespace Kokkos { - -namespace Impl { - -template -struct CopyOp; - -template -struct CopyOp { - KOKKOS_INLINE_FUNCTION - static void copy(DstViewType const& dst, size_t i_dst, SrcViewType const& src, - size_t i_src) { - dst(i_dst) = src(i_src); - } -}; - -template -struct CopyOp { - KOKKOS_INLINE_FUNCTION - static void copy(DstViewType const& dst, size_t i_dst, SrcViewType const& src, - size_t i_src) { - for (int j = 0; j < (int)dst.extent(1); j++) dst(i_dst, j) = src(i_src, j); - } -}; - -template -struct CopyOp { - KOKKOS_INLINE_FUNCTION - static void copy(DstViewType const& dst, size_t i_dst, SrcViewType const& src, - size_t i_src) { - for (int j = 0; j < dst.extent(1); j++) - for (int k = 0; k < dst.extent(2); k++) - dst(i_dst, j, k) = src(i_src, j, k); - } -}; -} // namespace Impl - -//---------------------------------------------------------------------------- - -template -class BinSort { - public: - template - struct copy_functor { - using src_view_type = typename SrcViewType::const_type; - - using copy_op = Impl::CopyOp; - - DstViewType dst_values; - src_view_type src_values; - int dst_offset; - - copy_functor(DstViewType const& dst_values_, int const& dst_offset_, - SrcViewType const& src_values_) - : dst_values(dst_values_), - src_values(src_values_), - dst_offset(dst_offset_) {} - - KOKKOS_INLINE_FUNCTION - void operator()(const int& i) const { - copy_op::copy(dst_values, i + dst_offset, src_values, i); - } - }; - - template - struct copy_permute_functor { - // If a Kokkos::View then can generate constant random access - // otherwise can only use the constant type. - - using src_view_type = std::conditional_t< - Kokkos::is_view::value, - Kokkos::View -#endif - >, - typename SrcViewType::const_type>; - - using perm_view_type = typename PermuteViewType::const_type; - - using copy_op = Impl::CopyOp; - - DstViewType dst_values; - perm_view_type sort_order; - src_view_type src_values; - int src_offset; - - copy_permute_functor(DstViewType const& dst_values_, - PermuteViewType const& sort_order_, - SrcViewType const& src_values_, int const& src_offset_) - : dst_values(dst_values_), - sort_order(sort_order_), - src_values(src_values_), - src_offset(src_offset_) {} - - KOKKOS_INLINE_FUNCTION - void operator()(const int& i) const { - copy_op::copy(dst_values, i, src_values, src_offset + sort_order(i)); - } - }; - - // Naming this alias "execution_space" would be problematic since it would be - // considered as execution space for the various functors which might use - // another execution space through sort() or create_permute_vector(). - using exec_space = typename Space::execution_space; - using bin_op_type = BinSortOp; - - struct bin_count_tag {}; - struct bin_offset_tag {}; - struct bin_binning_tag {}; - struct bin_sort_bins_tag {}; - - public: - using size_type = SizeType; - using value_type = size_type; - - using offset_type = Kokkos::View; - using bin_count_type = Kokkos::View; - - using const_key_view_type = typename KeyViewType::const_type; - - // If a Kokkos::View then can generate constant random access - // otherwise can only use the constant type. - - using const_rnd_key_view_type = std::conditional_t< - Kokkos::is_view::value, - Kokkos::View >, - const_key_view_type>; - - using non_const_key_scalar = typename KeyViewType::non_const_value_type; - using const_key_scalar = typename KeyViewType::const_value_type; - - using bin_count_atomic_type = - Kokkos::View >; - - private: - const_key_view_type keys; - const_rnd_key_view_type keys_rnd; - - public: - BinSortOp bin_op; - offset_type bin_offsets; - bin_count_atomic_type bin_count_atomic; - bin_count_type bin_count_const; - offset_type sort_order; - - int range_begin; - int range_end; - bool sort_within_bins; - - public: -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 - KOKKOS_DEPRECATED BinSort() = default; -#else - BinSort() = delete; -#endif - - //---------------------------------------- - // Constructor: takes the keys, the binning_operator and optionally whether to - // sort within bins (default false) - template - BinSort(const ExecutionSpace& exec, const_key_view_type keys_, - int range_begin_, int range_end_, BinSortOp bin_op_, - bool sort_within_bins_ = false) - : keys(keys_), - keys_rnd(keys_), - bin_op(bin_op_), - bin_offsets(), - bin_count_atomic(), - bin_count_const(), - sort_order(), - range_begin(range_begin_), - range_end(range_end_), - sort_within_bins(sort_within_bins_) { - static_assert( - Kokkos::SpaceAccessibility::accessible, - "The provided execution space must be able to access the memory space " - "BinSort was initialized with!"); - if (bin_op.max_bins() <= 0) - Kokkos::abort( - "The number of bins in the BinSortOp object must be greater than 0!"); - bin_count_atomic = Kokkos::View( - "Kokkos::SortImpl::BinSortFunctor::bin_count", bin_op.max_bins()); - bin_count_const = bin_count_atomic; - bin_offsets = - offset_type(view_alloc(exec, WithoutInitializing, - "Kokkos::SortImpl::BinSortFunctor::bin_offsets"), - bin_op.max_bins()); - sort_order = - offset_type(view_alloc(exec, WithoutInitializing, - "Kokkos::SortImpl::BinSortFunctor::sort_order"), - range_end - range_begin); - } - - BinSort(const_key_view_type keys_, int range_begin_, int range_end_, - BinSortOp bin_op_, bool sort_within_bins_ = false) - : BinSort(exec_space{}, keys_, range_begin_, range_end_, bin_op_, - sort_within_bins_) {} - - template - BinSort(const ExecutionSpace& exec, const_key_view_type keys_, - BinSortOp bin_op_, bool sort_within_bins_ = false) - : BinSort(exec, keys_, 0, keys_.extent(0), bin_op_, sort_within_bins_) {} - - BinSort(const_key_view_type keys_, BinSortOp bin_op_, - bool sort_within_bins_ = false) - : BinSort(exec_space{}, keys_, bin_op_, sort_within_bins_) {} - - //---------------------------------------- - // Create the permutation vector, the bin_offset array and the bin_count - // array. Can be called again if keys changed - template - void create_permute_vector(const ExecutionSpace& exec) { - static_assert( - Kokkos::SpaceAccessibility::accessible, - "The provided execution space must be able to access the memory space " - "BinSort was initialized with!"); - - const size_t len = range_end - range_begin; - Kokkos::parallel_for( - "Kokkos::Sort::BinCount", - Kokkos::RangePolicy(exec, 0, len), - *this); - Kokkos::parallel_scan("Kokkos::Sort::BinOffset", - Kokkos::RangePolicy( - exec, 0, bin_op.max_bins()), - *this); - - Kokkos::deep_copy(exec, bin_count_atomic, 0); - Kokkos::parallel_for( - "Kokkos::Sort::BinBinning", - Kokkos::RangePolicy(exec, 0, len), - *this); - - if (sort_within_bins) - Kokkos::parallel_for( - "Kokkos::Sort::BinSort", - Kokkos::RangePolicy( - exec, 0, bin_op.max_bins()), - *this); - } - - // Create the permutation vector, the bin_offset array and the bin_count - // array. Can be called again if keys changed - void create_permute_vector() { - Kokkos::fence("Kokkos::Binsort::create_permute_vector: before"); - exec_space e{}; - create_permute_vector(e); - e.fence("Kokkos::Binsort::create_permute_vector: after"); - } - - // Sort a subset of a view with respect to the first dimension using the - // permutation array - template - void sort(const ExecutionSpace& exec, ValuesViewType const& values, - int values_range_begin, int values_range_end) const { - if (values.extent(0) == 0) { - return; - } - - static_assert( - Kokkos::SpaceAccessibility::accessible, - "The provided execution space must be able to access the memory space " - "BinSort was initialized with!"); - static_assert( - Kokkos::SpaceAccessibility< - ExecutionSpace, typename ValuesViewType::memory_space>::accessible, - "The provided execution space must be able to access the memory space " - "of the View argument!"); - - const size_t len = range_end - range_begin; - const size_t values_len = values_range_end - values_range_begin; - if (len != values_len) { - Kokkos::abort( - "BinSort::sort: values range length != permutation vector length"); - } - - using scratch_view_type = - Kokkos::View; - scratch_view_type sorted_values( - view_alloc(exec, WithoutInitializing, - "Kokkos::SortImpl::BinSortFunctor::sorted_values"), - values.rank_dynamic > 0 ? len : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 1 ? values.extent(1) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 2 ? values.extent(2) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 3 ? values.extent(3) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 4 ? values.extent(4) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 5 ? values.extent(5) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 6 ? values.extent(6) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG, - values.rank_dynamic > 7 ? values.extent(7) - : KOKKOS_IMPL_CTOR_DEFAULT_ARG); - - { - copy_permute_functor - functor(sorted_values, sort_order, values, - values_range_begin - range_begin); - - parallel_for("Kokkos::Sort::CopyPermute", - Kokkos::RangePolicy(exec, 0, len), functor); - } - - { - copy_functor functor( - values, range_begin, sorted_values); - - parallel_for("Kokkos::Sort::Copy", - Kokkos::RangePolicy(exec, 0, len), functor); - } - } - - // Sort a subset of a view with respect to the first dimension using the - // permutation array - template - void sort(ValuesViewType const& values, int values_range_begin, - int values_range_end) const { - Kokkos::fence("Kokkos::Binsort::sort: before"); - exec_space exec; - sort(exec, values, values_range_begin, values_range_end); - exec.fence("Kokkos::BinSort:sort: after"); - } - - template - void sort(ExecutionSpace const& exec, ValuesViewType const& values) const { - this->sort(exec, values, 0, /*values.extent(0)*/ range_end - range_begin); - } - - template - void sort(ValuesViewType const& values) const { - this->sort(values, 0, /*values.extent(0)*/ range_end - range_begin); - } - - // Get the permutation vector - KOKKOS_INLINE_FUNCTION - offset_type get_permute_vector() const { return sort_order; } - - // Get the start offsets for each bin - KOKKOS_INLINE_FUNCTION - offset_type get_bin_offsets() const { return bin_offsets; } - - // Get the count for each bin - KOKKOS_INLINE_FUNCTION - bin_count_type get_bin_count() const { return bin_count_const; } - - public: - KOKKOS_INLINE_FUNCTION - void operator()(const bin_count_tag& /*tag*/, const int i) const { - const int j = range_begin + i; - bin_count_atomic(bin_op.bin(keys, j))++; - } - - KOKKOS_INLINE_FUNCTION - void operator()(const bin_offset_tag& /*tag*/, const int i, - value_type& offset, const bool& final) const { - if (final) { - bin_offsets(i) = offset; - } - offset += bin_count_const(i); - } - - KOKKOS_INLINE_FUNCTION - void operator()(const bin_binning_tag& /*tag*/, const int i) const { - const int j = range_begin + i; - const int bin = bin_op.bin(keys, j); - const int count = bin_count_atomic(bin)++; - - sort_order(bin_offsets(bin) + count) = j; - } - - KOKKOS_INLINE_FUNCTION - void operator()(const bin_sort_bins_tag& /*tag*/, const int i) const { - auto bin_size = bin_count_const(i); - if (bin_size <= 1) return; - constexpr bool use_std_sort = - std::is_same_v; - int lower_bound = bin_offsets(i); - int upper_bound = lower_bound + bin_size; - // Switching to std::sort for more than 10 elements has been found - // reasonable experimentally. - if (use_std_sort && bin_size > 10) { - if constexpr (use_std_sort) { - std::sort(&sort_order(lower_bound), &sort_order(upper_bound), - [this](int p, int q) { return bin_op(keys_rnd, p, q); }); - } - } else { - for (int k = lower_bound + 1; k < upper_bound; ++k) { - int old_idx = sort_order(k); - int j = k - 1; - while (j >= lower_bound) { - int new_idx = sort_order(j); - if (!bin_op(keys_rnd, old_idx, new_idx)) break; - sort_order(j + 1) = new_idx; - --j; - } - sort_order(j + 1) = old_idx; - } - } - } -}; - -//---------------------------------------------------------------------------- - -template -struct BinOp1D { - int max_bins_ = {}; - double mul_ = {}; - double min_ = {}; - -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 - KOKKOS_DEPRECATED BinOp1D() = default; -#else - BinOp1D() = delete; -#endif - - // Construct BinOp with number of bins, minimum value and maximum value - BinOp1D(int max_bins__, typename KeyViewType::const_value_type min, - typename KeyViewType::const_value_type max) - : max_bins_(max_bins__ + 1), - // Cast to double to avoid possible overflow when using integer - mul_(static_cast(max_bins__) / - (static_cast(max) - static_cast(min))), - min_(static_cast(min)) { - // For integral types the number of bins may be larger than the range - // in which case we can exactly have one unique value per bin - // and then don't need to sort bins. - if (std::is_integral::value && - (static_cast(max) - static_cast(min)) <= - static_cast(max_bins__)) { - mul_ = 1.; - } - } - - // Determine bin index from key value - template - KOKKOS_INLINE_FUNCTION int bin(ViewType& keys, const int& i) const { - return static_cast(mul_ * (static_cast(keys(i)) - min_)); - } - - // Return maximum bin index + 1 - KOKKOS_INLINE_FUNCTION - int max_bins() const { return max_bins_; } - - // Compare to keys within a bin if true new_val will be put before old_val - template - KOKKOS_INLINE_FUNCTION bool operator()(ViewType& keys, iType1& i1, - iType2& i2) const { - return keys(i1) < keys(i2); - } -}; - -template -struct BinOp3D { - int max_bins_[3] = {}; - double mul_[3] = {}; - double min_[3] = {}; - -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 - KOKKOS_DEPRECATED BinOp3D() = default; -#else - BinOp3D() = delete; -#endif - - BinOp3D(int max_bins__[], typename KeyViewType::const_value_type min[], - typename KeyViewType::const_value_type max[]) { - max_bins_[0] = max_bins__[0]; - max_bins_[1] = max_bins__[1]; - max_bins_[2] = max_bins__[2]; - mul_[0] = static_cast(max_bins__[0]) / - (static_cast(max[0]) - static_cast(min[0])); - mul_[1] = static_cast(max_bins__[1]) / - (static_cast(max[1]) - static_cast(min[1])); - mul_[2] = static_cast(max_bins__[2]) / - (static_cast(max[2]) - static_cast(min[2])); - min_[0] = static_cast(min[0]); - min_[1] = static_cast(min[1]); - min_[2] = static_cast(min[2]); - } - - template - KOKKOS_INLINE_FUNCTION int bin(ViewType& keys, const int& i) const { - return int((((int(mul_[0] * (keys(i, 0) - min_[0])) * max_bins_[1]) + - int(mul_[1] * (keys(i, 1) - min_[1]))) * - max_bins_[2]) + - int(mul_[2] * (keys(i, 2) - min_[2]))); - } - - KOKKOS_INLINE_FUNCTION - int max_bins() const { return max_bins_[0] * max_bins_[1] * max_bins_[2]; } - - template - KOKKOS_INLINE_FUNCTION bool operator()(ViewType& keys, iType1& i1, - iType2& i2) const { - if (keys(i1, 0) > keys(i2, 0)) - return true; - else if (keys(i1, 0) == keys(i2, 0)) { - if (keys(i1, 1) > keys(i2, 1)) - return true; - else if (keys(i1, 1) == keys(i2, 1)) { - if (keys(i1, 2) > keys(i2, 2)) return true; - } - } - return false; - } -}; - -namespace Impl { - -template -struct min_max_functor { - using minmax_scalar = - Kokkos::MinMaxScalar; - - ViewType view; - min_max_functor(const ViewType& view_) : view(view_) {} - - KOKKOS_INLINE_FUNCTION - void operator()(const size_t& i, minmax_scalar& minmax) const { - if (view(i) < minmax.min_val) minmax.min_val = view(i); - if (view(i) > minmax.max_val) minmax.max_val = view(i); - } -}; - -} // namespace Impl - -template -std::enable_if_t<(Kokkos::is_execution_space::value) && - (!SpaceAccessibility< - HostSpace, typename Kokkos::View:: - memory_space>::accessible)> -sort(const ExecutionSpace& exec, - const Kokkos::View& view) { - if (view.extent(0) == 0) { - return; - } - - using ViewType = Kokkos::View; - using CompType = BinOp1D; - - Kokkos::MinMaxScalar result; - Kokkos::MinMax reducer(result); - parallel_reduce("Kokkos::Sort::FindExtent", - Kokkos::RangePolicy( - exec, 0, view.extent(0)), - Impl::min_max_functor(view), reducer); - if (result.min_val == result.max_val) return; - // For integral types the number of bins may be larger than the range - // in which case we can exactly have one unique value per bin - // and then don't need to sort bins. - bool sort_in_bins = true; - // TODO: figure out better max_bins then this ... - int64_t max_bins = view.extent(0) / 2; - if (std::is_integral::value) { - // Cast to double to avoid possible overflow when using integer - auto const max_val = static_cast(result.max_val); - auto const min_val = static_cast(result.min_val); - // using 10M as the cutoff for special behavior (roughly 40MB for the count - // array) - if ((max_val - min_val) < 10000000) { - max_bins = max_val - min_val + 1; - sort_in_bins = false; - } - } - if (std::is_floating_point::value) { - KOKKOS_ASSERT(std::isfinite(static_cast(result.max_val) - - static_cast(result.min_val))); - } - - BinSort bin_sort( - view, CompType(max_bins, result.min_val, result.max_val), sort_in_bins); - bin_sort.create_permute_vector(exec); - bin_sort.sort(exec, view); -} - -#if defined(KOKKOS_ENABLE_ONEDPL) -template -void sort(const Experimental::SYCL& space, - const Kokkos::View& view) { - if (view.extent(0) == 0) { - return; - } - - using ViewType = Kokkos::View; - static_assert(SpaceAccessibility::accessible, - "SYCL execution space is not able to access the memory space " - "of the View argument!"); - - auto queue = space.sycl_queue(); - auto policy = oneapi::dpl::execution::make_device_policy(queue); - - // Can't use Experimental::begin/end here since the oneDPL then assumes that - // the data is on the host. - static_assert( - ViewType::rank == 1 && - (std::is_same::value || - std::is_same::value), - "SYCL sort only supports contiguous 1D Views."); - const int n = view.extent(0); - oneapi::dpl::sort(policy, view.data(), view.data() + n); -} -#endif - -template -std::enable_if_t<(Kokkos::is_execution_space::value) && - (SpaceAccessibility< - HostSpace, typename Kokkos::View:: - memory_space>::accessible)> -sort(const ExecutionSpace&, const Kokkos::View& view) { - if (view.extent(0) == 0) { - return; - } - auto first = Experimental::begin(view); - auto last = Experimental::end(view); - std::sort(first, last); -} - -#if defined(KOKKOS_ENABLE_CUDA) -template -void sort(const Cuda& space, - const Kokkos::View& view) { - if (view.extent(0) == 0) { - return; - } - const auto exec = thrust::cuda::par.on(space.cuda_stream()); - auto first = Experimental::begin(view); - auto last = Experimental::end(view); - thrust::sort(exec, first, last); -} -#endif - -template -void sort(ViewType const& view) { - Kokkos::fence("Kokkos::sort: before"); - - if (view.extent(0) == 0) { - return; - } - - typename ViewType::execution_space exec; - sort(exec, view); - exec.fence("Kokkos::sort: fence after sorting"); -} - -template -std::enable_if_t::value> sort( - const ExecutionSpace& exec, ViewType view, size_t const begin, - size_t const end) { - if (view.extent(0) == 0) { - return; - } - - using range_policy = Kokkos::RangePolicy; - using CompType = BinOp1D; - - Kokkos::MinMaxScalar result; - Kokkos::MinMax reducer(result); - - parallel_reduce("Kokkos::Sort::FindExtent", range_policy(exec, begin, end), - Impl::min_max_functor(view), reducer); - - if (result.min_val == result.max_val) return; - - BinSort bin_sort( - exec, view, begin, end, - CompType((end - begin) / 2, result.min_val, result.max_val), true); - - bin_sort.create_permute_vector(exec); - bin_sort.sort(exec, view, begin, end); -} - -template -void sort(ViewType view, size_t const begin, size_t const end) { - Kokkos::fence("Kokkos::sort: before"); - - if (view.extent(0) == 0) { - return; - } - - typename ViewType::execution_space exec; - sort(exec, view, begin, end); - exec.fence("Kokkos::Sort: fence after sorting"); -} - -} // namespace Kokkos +#include "sorting/Kokkos_BinSortPublicAPI.hpp" +#include "sorting/Kokkos_SortPublicAPI.hpp" +#include "sorting/Kokkos_NestedSortPublicAPI.hpp" #ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT #undef KOKKOS_IMPL_PUBLIC_INCLUDE diff --git a/lib/kokkos/algorithms/src/sorting/Kokkos_BinOpsPublicAPI.hpp b/lib/kokkos/algorithms/src/sorting/Kokkos_BinOpsPublicAPI.hpp new file mode 100644 index 0000000000..73e751f572 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/Kokkos_BinOpsPublicAPI.hpp @@ -0,0 +1,129 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_BIN_OPS_PUBLIC_API_HPP_ +#define KOKKOS_BIN_OPS_PUBLIC_API_HPP_ + +#include +#include + +namespace Kokkos { + +template +struct BinOp1D { + int max_bins_ = {}; + double mul_ = {}; + double min_ = {}; + +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 + KOKKOS_DEPRECATED BinOp1D() = default; +#else + BinOp1D() = delete; +#endif + + // Construct BinOp with number of bins, minimum value and maximum value + BinOp1D(int max_bins__, typename KeyViewType::const_value_type min, + typename KeyViewType::const_value_type max) + : max_bins_(max_bins__ + 1), + // Cast to double to avoid possible overflow when using integer + mul_(static_cast(max_bins__) / + (static_cast(max) - static_cast(min))), + min_(static_cast(min)) { + // For integral types the number of bins may be larger than the range + // in which case we can exactly have one unique value per bin + // and then don't need to sort bins. + if (std::is_integral::value && + (static_cast(max) - static_cast(min)) <= + static_cast(max_bins__)) { + mul_ = 1.; + } + } + + // Determine bin index from key value + template + KOKKOS_INLINE_FUNCTION int bin(ViewType& keys, const int& i) const { + return static_cast(mul_ * (static_cast(keys(i)) - min_)); + } + + // Return maximum bin index + 1 + KOKKOS_INLINE_FUNCTION + int max_bins() const { return max_bins_; } + + // Compare to keys within a bin if true new_val will be put before old_val + template + KOKKOS_INLINE_FUNCTION bool operator()(ViewType& keys, iType1& i1, + iType2& i2) const { + return keys(i1) < keys(i2); + } +}; + +template +struct BinOp3D { + int max_bins_[3] = {}; + double mul_[3] = {}; + double min_[3] = {}; + +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 + KOKKOS_DEPRECATED BinOp3D() = default; +#else + BinOp3D() = delete; +#endif + + BinOp3D(int max_bins__[], typename KeyViewType::const_value_type min[], + typename KeyViewType::const_value_type max[]) { + max_bins_[0] = max_bins__[0]; + max_bins_[1] = max_bins__[1]; + max_bins_[2] = max_bins__[2]; + mul_[0] = static_cast(max_bins__[0]) / + (static_cast(max[0]) - static_cast(min[0])); + mul_[1] = static_cast(max_bins__[1]) / + (static_cast(max[1]) - static_cast(min[1])); + mul_[2] = static_cast(max_bins__[2]) / + (static_cast(max[2]) - static_cast(min[2])); + min_[0] = static_cast(min[0]); + min_[1] = static_cast(min[1]); + min_[2] = static_cast(min[2]); + } + + template + KOKKOS_INLINE_FUNCTION int bin(ViewType& keys, const int& i) const { + return int((((int(mul_[0] * (keys(i, 0) - min_[0])) * max_bins_[1]) + + int(mul_[1] * (keys(i, 1) - min_[1]))) * + max_bins_[2]) + + int(mul_[2] * (keys(i, 2) - min_[2]))); + } + + KOKKOS_INLINE_FUNCTION + int max_bins() const { return max_bins_[0] * max_bins_[1] * max_bins_[2]; } + + template + KOKKOS_INLINE_FUNCTION bool operator()(ViewType& keys, iType1& i1, + iType2& i2) const { + if (keys(i1, 0) > keys(i2, 0)) + return true; + else if (keys(i1, 0) == keys(i2, 0)) { + if (keys(i1, 1) > keys(i2, 1)) + return true; + else if (keys(i1, 1) == keys(i2, 1)) { + if (keys(i1, 2) > keys(i2, 2)) return true; + } + } + return false; + } +}; + +} // namespace Kokkos +#endif diff --git a/lib/kokkos/algorithms/src/sorting/Kokkos_BinSortPublicAPI.hpp b/lib/kokkos/algorithms/src/sorting/Kokkos_BinSortPublicAPI.hpp new file mode 100644 index 0000000000..c399279fe4 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/Kokkos_BinSortPublicAPI.hpp @@ -0,0 +1,410 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_BIN_SORT_PUBLIC_API_HPP_ +#define KOKKOS_BIN_SORT_PUBLIC_API_HPP_ + +#include "Kokkos_BinOpsPublicAPI.hpp" +#include "impl/Kokkos_CopyOpsForBinSortImpl.hpp" +#include +#include + +namespace Kokkos { + +template +class BinSort { + public: + template + struct copy_functor { + using src_view_type = typename SrcViewType::const_type; + + using copy_op = Impl::CopyOp; + + DstViewType dst_values; + src_view_type src_values; + int dst_offset; + + copy_functor(DstViewType const& dst_values_, int const& dst_offset_, + SrcViewType const& src_values_) + : dst_values(dst_values_), + src_values(src_values_), + dst_offset(dst_offset_) {} + + KOKKOS_INLINE_FUNCTION + void operator()(const int& i) const { + copy_op::copy(dst_values, i + dst_offset, src_values, i); + } + }; + + template + struct copy_permute_functor { + // If a Kokkos::View then can generate constant random access + // otherwise can only use the constant type. + + using src_view_type = std::conditional_t< + Kokkos::is_view::value, + Kokkos::View= 230700) + , + Kokkos::MemoryTraits +#endif + >, + typename SrcViewType::const_type>; + + using perm_view_type = typename PermuteViewType::const_type; + + using copy_op = Impl::CopyOp; + + DstViewType dst_values; + perm_view_type sort_order; + src_view_type src_values; + int src_offset; + + copy_permute_functor(DstViewType const& dst_values_, + PermuteViewType const& sort_order_, + SrcViewType const& src_values_, int const& src_offset_) + : dst_values(dst_values_), + sort_order(sort_order_), + src_values(src_values_), + src_offset(src_offset_) {} + + KOKKOS_INLINE_FUNCTION + void operator()(const int& i) const { + copy_op::copy(dst_values, i, src_values, src_offset + sort_order(i)); + } + }; + + // Naming this alias "execution_space" would be problematic since it would be + // considered as execution space for the various functors which might use + // another execution space through sort() or create_permute_vector(). + using exec_space = typename Space::execution_space; + using bin_op_type = BinSortOp; + + struct bin_count_tag {}; + struct bin_offset_tag {}; + struct bin_binning_tag {}; + struct bin_sort_bins_tag {}; + + public: + using size_type = SizeType; + using value_type = size_type; + + using offset_type = Kokkos::View; + using bin_count_type = Kokkos::View; + + using const_key_view_type = typename KeyViewType::const_type; + + // If a Kokkos::View then can generate constant random access + // otherwise can only use the constant type. + + using const_rnd_key_view_type = std::conditional_t< + Kokkos::is_view::value, + Kokkos::View >, + const_key_view_type>; + + using non_const_key_scalar = typename KeyViewType::non_const_value_type; + using const_key_scalar = typename KeyViewType::const_value_type; + + using bin_count_atomic_type = + Kokkos::View >; + + private: + const_key_view_type keys; + const_rnd_key_view_type keys_rnd; + + public: + BinSortOp bin_op; + offset_type bin_offsets; + bin_count_atomic_type bin_count_atomic; + bin_count_type bin_count_const; + offset_type sort_order; + + int range_begin; + int range_end; + bool sort_within_bins; + + public: +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 + KOKKOS_DEPRECATED BinSort() = default; +#else + BinSort() = delete; +#endif + + //---------------------------------------- + // Constructor: takes the keys, the binning_operator and optionally whether to + // sort within bins (default false) + template + BinSort(const ExecutionSpace& exec, const_key_view_type keys_, + int range_begin_, int range_end_, BinSortOp bin_op_, + bool sort_within_bins_ = false) + : keys(keys_), + keys_rnd(keys_), + bin_op(bin_op_), + bin_offsets(), + bin_count_atomic(), + bin_count_const(), + sort_order(), + range_begin(range_begin_), + range_end(range_end_), + sort_within_bins(sort_within_bins_) { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + if (bin_op.max_bins() <= 0) + Kokkos::abort( + "The number of bins in the BinSortOp object must be greater than 0!"); + bin_count_atomic = Kokkos::View( + "Kokkos::SortImpl::BinSortFunctor::bin_count", bin_op.max_bins()); + bin_count_const = bin_count_atomic; + bin_offsets = + offset_type(view_alloc(exec, WithoutInitializing, + "Kokkos::SortImpl::BinSortFunctor::bin_offsets"), + bin_op.max_bins()); + sort_order = + offset_type(view_alloc(exec, WithoutInitializing, + "Kokkos::SortImpl::BinSortFunctor::sort_order"), + range_end - range_begin); + } + + BinSort(const_key_view_type keys_, int range_begin_, int range_end_, + BinSortOp bin_op_, bool sort_within_bins_ = false) + : BinSort(exec_space{}, keys_, range_begin_, range_end_, bin_op_, + sort_within_bins_) {} + + template + BinSort(const ExecutionSpace& exec, const_key_view_type keys_, + BinSortOp bin_op_, bool sort_within_bins_ = false) + : BinSort(exec, keys_, 0, keys_.extent(0), bin_op_, sort_within_bins_) {} + + BinSort(const_key_view_type keys_, BinSortOp bin_op_, + bool sort_within_bins_ = false) + : BinSort(exec_space{}, keys_, bin_op_, sort_within_bins_) {} + + //---------------------------------------- + // Create the permutation vector, the bin_offset array and the bin_count + // array. Can be called again if keys changed + template + void create_permute_vector(const ExecutionSpace& exec) { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + + const size_t len = range_end - range_begin; + Kokkos::parallel_for( + "Kokkos::Sort::BinCount", + Kokkos::RangePolicy(exec, 0, len), + *this); + Kokkos::parallel_scan("Kokkos::Sort::BinOffset", + Kokkos::RangePolicy( + exec, 0, bin_op.max_bins()), + *this); + + Kokkos::deep_copy(exec, bin_count_atomic, 0); + Kokkos::parallel_for( + "Kokkos::Sort::BinBinning", + Kokkos::RangePolicy(exec, 0, len), + *this); + + if (sort_within_bins) + Kokkos::parallel_for( + "Kokkos::Sort::BinSort", + Kokkos::RangePolicy( + exec, 0, bin_op.max_bins()), + *this); + } + + // Create the permutation vector, the bin_offset array and the bin_count + // array. Can be called again if keys changed + void create_permute_vector() { + Kokkos::fence("Kokkos::Binsort::create_permute_vector: before"); + exec_space e{}; + create_permute_vector(e); + e.fence("Kokkos::Binsort::create_permute_vector: after"); + } + + // Sort a subset of a view with respect to the first dimension using the + // permutation array + template + void sort(const ExecutionSpace& exec, ValuesViewType const& values, + int values_range_begin, int values_range_end) const { + if (values.extent(0) == 0) { + return; + } + + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + static_assert( + Kokkos::SpaceAccessibility< + ExecutionSpace, typename ValuesViewType::memory_space>::accessible, + "The provided execution space must be able to access the memory space " + "of the View argument!"); + + const size_t len = range_end - range_begin; + const size_t values_len = values_range_end - values_range_begin; + if (len != values_len) { + Kokkos::abort( + "BinSort::sort: values range length != permutation vector length"); + } + + using scratch_view_type = + Kokkos::View; + scratch_view_type sorted_values( + view_alloc(exec, WithoutInitializing, + "Kokkos::SortImpl::BinSortFunctor::sorted_values"), + values.rank_dynamic > 0 ? len : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 1 ? values.extent(1) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 2 ? values.extent(2) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 3 ? values.extent(3) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 4 ? values.extent(4) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 5 ? values.extent(5) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 6 ? values.extent(6) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG, + values.rank_dynamic > 7 ? values.extent(7) + : KOKKOS_IMPL_CTOR_DEFAULT_ARG); + + { + copy_permute_functor + functor(sorted_values, sort_order, values, + values_range_begin - range_begin); + + parallel_for("Kokkos::Sort::CopyPermute", + Kokkos::RangePolicy(exec, 0, len), functor); + } + + { + copy_functor functor( + values, range_begin, sorted_values); + + parallel_for("Kokkos::Sort::Copy", + Kokkos::RangePolicy(exec, 0, len), functor); + } + } + + // Sort a subset of a view with respect to the first dimension using the + // permutation array + template + void sort(ValuesViewType const& values, int values_range_begin, + int values_range_end) const { + Kokkos::fence("Kokkos::Binsort::sort: before"); + exec_space exec; + sort(exec, values, values_range_begin, values_range_end); + exec.fence("Kokkos::BinSort:sort: after"); + } + + template + void sort(ExecutionSpace const& exec, ValuesViewType const& values) const { + this->sort(exec, values, 0, /*values.extent(0)*/ range_end - range_begin); + } + + template + void sort(ValuesViewType const& values) const { + this->sort(values, 0, /*values.extent(0)*/ range_end - range_begin); + } + + // Get the permutation vector + KOKKOS_INLINE_FUNCTION + offset_type get_permute_vector() const { return sort_order; } + + // Get the start offsets for each bin + KOKKOS_INLINE_FUNCTION + offset_type get_bin_offsets() const { return bin_offsets; } + + // Get the count for each bin + KOKKOS_INLINE_FUNCTION + bin_count_type get_bin_count() const { return bin_count_const; } + + public: + KOKKOS_INLINE_FUNCTION + void operator()(const bin_count_tag& /*tag*/, const int i) const { + const int j = range_begin + i; + bin_count_atomic(bin_op.bin(keys, j))++; + } + + KOKKOS_INLINE_FUNCTION + void operator()(const bin_offset_tag& /*tag*/, const int i, + value_type& offset, const bool& final) const { + if (final) { + bin_offsets(i) = offset; + } + offset += bin_count_const(i); + } + + KOKKOS_INLINE_FUNCTION + void operator()(const bin_binning_tag& /*tag*/, const int i) const { + const int j = range_begin + i; + const int bin = bin_op.bin(keys, j); + const int count = bin_count_atomic(bin)++; + + sort_order(bin_offsets(bin) + count) = j; + } + + KOKKOS_INLINE_FUNCTION + void operator()(const bin_sort_bins_tag& /*tag*/, const int i) const { + auto bin_size = bin_count_const(i); + if (bin_size <= 1) return; + constexpr bool use_std_sort = + std::is_same_v; + int lower_bound = bin_offsets(i); + int upper_bound = lower_bound + bin_size; + // Switching to std::sort for more than 10 elements has been found + // reasonable experimentally. + if (use_std_sort && bin_size > 10) { + KOKKOS_IF_ON_HOST( + (std::sort(&sort_order(lower_bound), &sort_order(upper_bound), + [this](int p, int q) { return bin_op(keys_rnd, p, q); });)) + } else { + for (int k = lower_bound + 1; k < upper_bound; ++k) { + int old_idx = sort_order(k); + int j = k - 1; + while (j >= lower_bound) { + int new_idx = sort_order(j); + if (!bin_op(keys_rnd, old_idx, new_idx)) break; + sort_order(j + 1) = new_idx; + --j; + } + sort_order(j + 1) = old_idx; + } + } + } +}; + +} // namespace Kokkos +#endif diff --git a/lib/kokkos/algorithms/src/sorting/Kokkos_NestedSortPublicAPI.hpp b/lib/kokkos/algorithms/src/sorting/Kokkos_NestedSortPublicAPI.hpp new file mode 100644 index 0000000000..dd468e0734 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/Kokkos_NestedSortPublicAPI.hpp @@ -0,0 +1,100 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_NESTED_SORT_PUBLIC_API_HPP_ +#define KOKKOS_NESTED_SORT_PUBLIC_API_HPP_ + +#include "impl/Kokkos_NestedSortImpl.hpp" +#include +#include + +namespace Kokkos { +namespace Experimental { + +template +KOKKOS_INLINE_FUNCTION void sort_team(const TeamMember& t, + const ViewType& view) { + Impl::sort_nested_impl(t, view, nullptr, + Experimental::Impl::StdAlgoLessThanBinaryPredicate< + typename ViewType::non_const_value_type>(), + Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_team(const TeamMember& t, const ViewType& view, + const Comparator& comp) { + Impl::sort_nested_impl(t, view, nullptr, comp, Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_by_key_team(const TeamMember& t, + const KeyViewType& keyView, + const ValueViewType& valueView) { + Impl::sort_nested_impl(t, keyView, valueView, + Experimental::Impl::StdAlgoLessThanBinaryPredicate< + typename KeyViewType::non_const_value_type>(), + Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_by_key_team(const TeamMember& t, + const KeyViewType& keyView, + const ValueViewType& valueView, + const Comparator& comp) { + Impl::sort_nested_impl(t, keyView, valueView, comp, + Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_thread(const TeamMember& t, + const ViewType& view) { + Impl::sort_nested_impl(t, view, nullptr, + Experimental::Impl::StdAlgoLessThanBinaryPredicate< + typename ViewType::non_const_value_type>(), + Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_thread(const TeamMember& t, + const ViewType& view, + const Comparator& comp) { + Impl::sort_nested_impl(t, view, nullptr, comp, Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_by_key_thread(const TeamMember& t, + const KeyViewType& keyView, + const ValueViewType& valueView) { + Impl::sort_nested_impl(t, keyView, valueView, + Experimental::Impl::StdAlgoLessThanBinaryPredicate< + typename KeyViewType::non_const_value_type>(), + Impl::NestedRange()); +} + +template +KOKKOS_INLINE_FUNCTION void sort_by_key_thread(const TeamMember& t, + const KeyViewType& keyView, + const ValueViewType& valueView, + const Comparator& comp) { + Impl::sort_nested_impl(t, keyView, valueView, comp, + Impl::NestedRange()); +} + +} // namespace Experimental +} // namespace Kokkos +#endif diff --git a/lib/kokkos/algorithms/src/sorting/Kokkos_SortPublicAPI.hpp b/lib/kokkos/algorithms/src/sorting/Kokkos_SortPublicAPI.hpp new file mode 100644 index 0000000000..a763c41e58 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/Kokkos_SortPublicAPI.hpp @@ -0,0 +1,194 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_SORT_PUBLIC_API_HPP_ +#define KOKKOS_SORT_PUBLIC_API_HPP_ + +#include "./impl/Kokkos_SortImpl.hpp" +#include +#include +#include + +namespace Kokkos { + +// --------------------------------------------------------------- +// basic overloads +// --------------------------------------------------------------- + +template +void sort([[maybe_unused]] const ExecutionSpace& exec, + const Kokkos::View& view) { + // constraints + using ViewType = Kokkos::View; + using MemSpace = typename ViewType::memory_space; + static_assert( + ViewType::rank == 1 && + (std::is_same_v || + std::is_same_v || + std::is_same_v), + "Kokkos::sort without comparator: supports 1D Views with LayoutRight, " + "LayoutLeft or LayoutStride."); + + static_assert(SpaceAccessibility::accessible, + "Kokkos::sort: execution space instance is not able to access " + "the memory space of the " + "View argument!"); + + if (view.extent(0) <= 1) { + return; + } + + if constexpr (Impl::better_off_calling_std_sort_v) { + auto first = ::Kokkos::Experimental::begin(view); + auto last = ::Kokkos::Experimental::end(view); + std::sort(first, last); + } else { + Impl::sort_device_view_without_comparator(exec, view); + } +} + +template +void sort(const Kokkos::View& view) { + using ViewType = Kokkos::View; + static_assert(ViewType::rank == 1, + "Kokkos::sort: currently only supports rank-1 Views."); + + Kokkos::fence("Kokkos::sort: before"); + + if (view.extent(0) <= 1) { + return; + } + + typename ViewType::execution_space exec; + sort(exec, view); + exec.fence("Kokkos::sort: fence after sorting"); +} + +// --------------------------------------------------------------- +// overloads supporting a custom comparator +// --------------------------------------------------------------- +template +void sort([[maybe_unused]] const ExecutionSpace& exec, + const Kokkos::View& view, + const ComparatorType& comparator) { + // constraints + using ViewType = Kokkos::View; + using MemSpace = typename ViewType::memory_space; + static_assert( + ViewType::rank == 1 && + (std::is_same_v || + std::is_same_v || + std::is_same_v), + "Kokkos::sort with comparator: supports 1D Views with LayoutRight, " + "LayoutLeft or LayoutStride."); + + static_assert(SpaceAccessibility::accessible, + "Kokkos::sort: execution space instance is not able to access " + "the memory space of the View argument!"); + + if (view.extent(0) <= 1) { + return; + } + + if constexpr (Impl::better_off_calling_std_sort_v) { + auto first = ::Kokkos::Experimental::begin(view); + auto last = ::Kokkos::Experimental::end(view); + std::sort(first, last, comparator); + } else { + Impl::sort_device_view_with_comparator(exec, view, comparator); + } +} + +template +void sort(const Kokkos::View& view, + const ComparatorType& comparator) { + using ViewType = Kokkos::View; + static_assert( + ViewType::rank == 1 && + (std::is_same_v || + std::is_same_v || + std::is_same_v), + "Kokkos::sort with comparator: supports 1D Views with LayoutRight, " + "LayoutLeft or LayoutStride."); + + Kokkos::fence("Kokkos::sort with comparator: before"); + + if (view.extent(0) <= 1) { + return; + } + + typename ViewType::execution_space exec; + sort(exec, view, comparator); + exec.fence("Kokkos::sort with comparator: fence after sorting"); +} + +// --------------------------------------------------------------- +// overloads for sorting a view with a subrange +// specified via integers begin, end +// --------------------------------------------------------------- + +template +std::enable_if_t::value> sort( + const ExecutionSpace& exec, ViewType view, size_t const begin, + size_t const end) { + // view must be rank-1 because the Impl::min_max_functor + // used below only works for rank-1 views for now + static_assert(ViewType::rank == 1, + "Kokkos::sort: currently only supports rank-1 Views."); + + if (view.extent(0) <= 1) { + return; + } + + using range_policy = Kokkos::RangePolicy; + using CompType = BinOp1D; + + Kokkos::MinMaxScalar result; + Kokkos::MinMax reducer(result); + + parallel_reduce("Kokkos::Sort::FindExtent", range_policy(exec, begin, end), + Impl::min_max_functor(view), reducer); + + if (result.min_val == result.max_val) return; + + BinSort bin_sort( + exec, view, begin, end, + CompType((end - begin) / 2, result.min_val, result.max_val), true); + + bin_sort.create_permute_vector(exec); + bin_sort.sort(exec, view, begin, end); +} + +template +void sort(ViewType view, size_t const begin, size_t const end) { + // same constraints as the overload above which this gets dispatched to + static_assert(ViewType::rank == 1, + "Kokkos::sort: currently only supports rank-1 Views."); + + Kokkos::fence("Kokkos::sort: before"); + + if (view.extent(0) <= 1) { + return; + } + + typename ViewType::execution_space exec; + sort(exec, view, begin, end); + exec.fence("Kokkos::Sort: fence after sorting"); +} + +} // namespace Kokkos +#endif diff --git a/lib/kokkos/algorithms/src/sorting/impl/Kokkos_CopyOpsForBinSortImpl.hpp b/lib/kokkos/algorithms/src/sorting/impl/Kokkos_CopyOpsForBinSortImpl.hpp new file mode 100644 index 0000000000..07f5926d82 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/impl/Kokkos_CopyOpsForBinSortImpl.hpp @@ -0,0 +1,61 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_COPY_OPS_FOR_BINSORT_IMPL_HPP_ +#define KOKKOS_COPY_OPS_FOR_BINSORT_IMPL_HPP_ + +#include +#include + +namespace Kokkos { +namespace Impl { + +template +struct CopyOp; + +template +struct CopyOp { + KOKKOS_INLINE_FUNCTION + static void copy(DstViewType const& dst, size_t i_dst, SrcViewType const& src, + size_t i_src) { + dst(i_dst) = src(i_src); + } +}; + +template +struct CopyOp { + KOKKOS_INLINE_FUNCTION + static void copy(DstViewType const& dst, size_t i_dst, SrcViewType const& src, + size_t i_src) { + for (int j = 0; j < (int)dst.extent(1); j++) dst(i_dst, j) = src(i_src, j); + } +}; + +template +struct CopyOp { + KOKKOS_INLINE_FUNCTION + static void copy(DstViewType const& dst, size_t i_dst, SrcViewType const& src, + size_t i_src) { + for (int j = 0; j < dst.extent(1); j++) + for (int k = 0; k < dst.extent(2); k++) + dst(i_dst, j, k) = src(i_src, j, k); + } +}; + +} // namespace Impl +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/sorting/impl/Kokkos_NestedSortImpl.hpp b/lib/kokkos/algorithms/src/sorting/impl/Kokkos_NestedSortImpl.hpp new file mode 100644 index 0000000000..50ac823319 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/impl/Kokkos_NestedSortImpl.hpp @@ -0,0 +1,115 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_NESTED_SORT_IMPL_HPP_ +#define KOKKOS_NESTED_SORT_IMPL_HPP_ + +#include +#include + +namespace Kokkos { +namespace Experimental { +namespace Impl { + +// true for TeamVectorRange, false for ThreadVectorRange +template +struct NestedRange {}; + +// Specialization for team-level +template <> +struct NestedRange { + template + KOKKOS_FUNCTION static auto create(const TeamMember& t, SizeType len) { + return Kokkos::TeamVectorRange(t, len); + } + template + KOKKOS_FUNCTION static void barrier(const TeamMember& t) { + t.team_barrier(); + } +}; + +// Specialization for thread-level +template <> +struct NestedRange { + template + KOKKOS_FUNCTION static auto create(const TeamMember& t, SizeType len) { + return Kokkos::ThreadVectorRange(t, len); + } + // Barrier is no-op, as vector lanes of a thread are implicitly synchronized + // after parallel region + template + KOKKOS_FUNCTION static void barrier(const TeamMember&) {} +}; + +// When just doing sort (not sort_by_key), use nullptr_t for ValueViewType. +// This only takes the NestedRange instance for template arg deduction. +template +KOKKOS_INLINE_FUNCTION void sort_nested_impl( + const TeamMember& t, const KeyViewType& keyView, + [[maybe_unused]] const ValueViewType& valueView, const Comparator& comp, + const NestedRange) { + using SizeType = typename KeyViewType::size_type; + using KeyType = typename KeyViewType::non_const_value_type; + using Range = NestedRange; + SizeType n = keyView.extent(0); + SizeType npot = 1; + SizeType levels = 0; + // FIXME: ceiling power-of-two is a common thing to need - make it a utility + while (npot < n) { + levels++; + npot <<= 1; + } + for (SizeType i = 0; i < levels; i++) { + for (SizeType j = 0; j <= i; j++) { + // n/2 pairs of items are compared in parallel + Kokkos::parallel_for(Range::create(t, npot / 2), [=](const SizeType k) { + // How big are the brown/pink boxes? + // (Terminology comes from Wikipedia diagram) + // https://commons.wikimedia.org/wiki/File:BitonicSort.svg#/media/File:BitonicSort.svg + SizeType boxSize = SizeType(2) << (i - j); + // Which box contains this thread? + SizeType boxID = k >> (i - j); // k * 2 / boxSize; + SizeType boxStart = boxID << (1 + i - j); // boxID * boxSize + SizeType boxOffset = k - (boxStart >> 1); // k - boxID * boxSize / 2; + SizeType elem1 = boxStart + boxOffset; + // In first phase (j == 0, brown box): within a box, compare with the + // opposite value in the box. + // In later phases (j > 0, pink box): within a box, compare with fixed + // distance (boxSize / 2) apart. + SizeType elem2 = (j == 0) ? (boxStart + boxSize - 1 - boxOffset) + : (elem1 + boxSize / 2); + if (elem2 < n) { + KeyType key1 = keyView(elem1); + KeyType key2 = keyView(elem2); + if (comp(key2, key1)) { + keyView(elem1) = key2; + keyView(elem2) = key1; + if constexpr (!std::is_same_v) { + Kokkos::Experimental::swap(valueView(elem1), valueView(elem2)); + } + } + } + }); + Range::barrier(t); + } + } +} + +} // namespace Impl +} // namespace Experimental +} // namespace Kokkos +#endif diff --git a/lib/kokkos/algorithms/src/sorting/impl/Kokkos_SortImpl.hpp b/lib/kokkos/algorithms/src/sorting/impl/Kokkos_SortImpl.hpp new file mode 100644 index 0000000000..d87ab09e77 --- /dev/null +++ b/lib/kokkos/algorithms/src/sorting/impl/Kokkos_SortImpl.hpp @@ -0,0 +1,369 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_SORT_FREE_FUNCS_IMPL_HPP_ +#define KOKKOS_SORT_FREE_FUNCS_IMPL_HPP_ + +#include "../Kokkos_BinOpsPublicAPI.hpp" +#include "../Kokkos_BinSortPublicAPI.hpp" +#include +#include +#include + +#if defined(KOKKOS_ENABLE_CUDA) + +// Workaround for `Instruction 'shfl' without '.sync' is not supported on +// .target sm_70 and higher from PTX ISA version 6.4`. +// Also see https://github.com/NVIDIA/cub/pull/170. +#if !defined(CUB_USE_COOPERATIVE_GROUPS) +#define CUB_USE_COOPERATIVE_GROUPS +#endif + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" + +#if defined(KOKKOS_COMPILER_CLANG) +// Some versions of Clang fail to compile Thrust, failing with errors like +// this: +// /thrust/system/cuda/detail/core/agent_launcher.h:557:11: +// error: use of undeclared identifier 'va_printf' +// The exact combination of versions for Clang and Thrust (or CUDA) for this +// failure was not investigated, however even very recent version combination +// (Clang 10.0.0 and Cuda 10.0) demonstrated failure. +// +// Defining _CubLog here locally allows us to avoid that code path, however +// disabling some debugging diagnostics +#pragma push_macro("_CubLog") +#ifdef _CubLog +#undef _CubLog +#endif +#define _CubLog +#include +#include +#pragma pop_macro("_CubLog") +#else +#include +#include +#endif + +#pragma GCC diagnostic pop + +#endif + +#if defined(KOKKOS_ENABLE_ONEDPL) +#include +#include +#endif + +namespace Kokkos { +namespace Impl { + +template +struct better_off_calling_std_sort : std::false_type {}; + +#if defined KOKKOS_ENABLE_SERIAL +template <> +struct better_off_calling_std_sort : std::true_type {}; +#endif + +#if defined KOKKOS_ENABLE_OPENMP +template <> +struct better_off_calling_std_sort : std::true_type {}; +#endif + +#if defined KOKKOS_ENABLE_THREADS +template <> +struct better_off_calling_std_sort : std::true_type {}; +#endif + +#if defined KOKKOS_ENABLE_HPX +template <> +struct better_off_calling_std_sort : std::true_type { +}; +#endif + +template +inline constexpr bool better_off_calling_std_sort_v = + better_off_calling_std_sort::value; + +template +struct min_max_functor { + using minmax_scalar = + Kokkos::MinMaxScalar; + + ViewType view; + min_max_functor(const ViewType& view_) : view(view_) {} + + KOKKOS_INLINE_FUNCTION + void operator()(const size_t& i, minmax_scalar& minmax) const { + if (view(i) < minmax.min_val) minmax.min_val = view(i); + if (view(i) > minmax.max_val) minmax.max_val = view(i); + } +}; + +template +void sort_via_binsort(const ExecutionSpace& exec, + const Kokkos::View& view) { + // Although we are using BinSort below, which could work on rank-2 views, + // for now view must be rank-1 because the min_max_functor + // used below only works for rank-1 views + using ViewType = Kokkos::View; + static_assert(ViewType::rank == 1, + "Kokkos::sort: currently only supports rank-1 Views."); + + if (view.extent(0) <= 1) { + return; + } + + Kokkos::MinMaxScalar result; + Kokkos::MinMax reducer(result); + parallel_reduce("Kokkos::Sort::FindExtent", + Kokkos::RangePolicy( + exec, 0, view.extent(0)), + min_max_functor(view), reducer); + if (result.min_val == result.max_val) return; + // For integral types the number of bins may be larger than the range + // in which case we can exactly have one unique value per bin + // and then don't need to sort bins. + bool sort_in_bins = true; + // TODO: figure out better max_bins then this ... + int64_t max_bins = view.extent(0) / 2; + if (std::is_integral::value) { + // Cast to double to avoid possible overflow when using integer + auto const max_val = static_cast(result.max_val); + auto const min_val = static_cast(result.min_val); + // using 10M as the cutoff for special behavior (roughly 40MB for the count + // array) + if ((max_val - min_val) < 10000000) { + max_bins = max_val - min_val + 1; + sort_in_bins = false; + } + } + if (std::is_floating_point::value) { + KOKKOS_ASSERT(std::isfinite(static_cast(result.max_val) - + static_cast(result.min_val))); + } + + using CompType = BinOp1D; + BinSort bin_sort( + view, CompType(max_bins, result.min_val, result.max_val), sort_in_bins); + bin_sort.create_permute_vector(exec); + bin_sort.sort(exec, view); +} + +#if defined(KOKKOS_ENABLE_CUDA) +template +void sort_cudathrust(const Cuda& space, + const Kokkos::View& view, + MaybeComparator&&... maybeComparator) { + using ViewType = Kokkos::View; + static_assert(ViewType::rank == 1, + "Kokkos::sort: currently only supports rank-1 Views."); + + if (view.extent(0) <= 1) { + return; + } + const auto exec = thrust::cuda::par.on(space.cuda_stream()); + auto first = ::Kokkos::Experimental::begin(view); + auto last = ::Kokkos::Experimental::end(view); + thrust::sort(exec, first, last, + std::forward(maybeComparator)...); +} +#endif + +#if defined(KOKKOS_ENABLE_ONEDPL) +template +void sort_onedpl(const Kokkos::Experimental::SYCL& space, + const Kokkos::View& view, + MaybeComparator&&... maybeComparator) { + using ViewType = Kokkos::View; + static_assert(SpaceAccessibility::accessible, + "SYCL execution space is not able to access the memory space " + "of the View argument!"); + + static_assert( + (ViewType::rank == 1) && + (std::is_same_v || + std::is_same_v || + std::is_same_v), + "SYCL sort only supports contiguous rank-1 Views with LayoutLeft, " + "LayoutRight or LayoutStride" + "For the latter, this means the View must have stride(0) = 1, enforced " + "at runtime."); + + if (view.stride(0) != 1) { + Kokkos::abort("SYCL sort only supports rank-1 Views with stride(0) = 1."); + } + + if (view.extent(0) <= 1) { + return; + } + + // Can't use Experimental::begin/end here since the oneDPL then assumes that + // the data is on the host. + auto queue = space.sycl_queue(); + auto policy = oneapi::dpl::execution::make_device_policy(queue); + const int n = view.extent(0); + oneapi::dpl::sort(policy, view.data(), view.data() + n, + std::forward(maybeComparator)...); +} +#endif + +template +void copy_to_host_run_stdsort_copy_back( + const ExecutionSpace& exec, + const Kokkos::View& view, + MaybeComparator&&... maybeComparator) { + namespace KE = ::Kokkos::Experimental; + + using ViewType = Kokkos::View; + using layout = typename ViewType::array_layout; + if constexpr (std::is_same_v) { + // for strided views we cannot just deep_copy from device to host, + // so we need to do a few more jumps + using view_value_type = typename ViewType::non_const_value_type; + using view_exespace = typename ViewType::execution_space; + using view_deep_copyable_t = Kokkos::View; + view_deep_copyable_t view_dc("view_dc", view.extent(0)); + KE::copy(exec, view, view_dc); + + // run sort on the mirror of view_dc + auto mv_h = create_mirror_view_and_copy(Kokkos::HostSpace(), view_dc); + auto first = KE::begin(mv_h); + auto last = KE::end(mv_h); + std::sort(first, last, std::forward(maybeComparator)...); + Kokkos::deep_copy(exec, view_dc, mv_h); + + // copy back to argument view + KE::copy(exec, KE::cbegin(view_dc), KE::cend(view_dc), KE::begin(view)); + } else { + auto view_h = create_mirror_view_and_copy(Kokkos::HostSpace(), view); + auto first = KE::begin(view_h); + auto last = KE::end(view_h); + std::sort(first, last, std::forward(maybeComparator)...); + Kokkos::deep_copy(exec, view, view_h); + } +} + +// -------------------------------------------------- +// +// specialize cases for sorting without comparator +// +// -------------------------------------------------- + +#if defined(KOKKOS_ENABLE_CUDA) +template +void sort_device_view_without_comparator( + const Cuda& exec, const Kokkos::View& view) { + sort_cudathrust(exec, view); +} +#endif + +#if defined(KOKKOS_ENABLE_ONEDPL) +template +void sort_device_view_without_comparator( + const Kokkos::Experimental::SYCL& exec, + const Kokkos::View& view) { + using ViewType = Kokkos::View; + static_assert( + (ViewType::rank == 1) && + (std::is_same_v || + std::is_same_v || + std::is_same_v), + "sort_device_view_without_comparator: supports rank-1 Views " + "with LayoutLeft, LayoutRight or LayoutStride"); + + if (view.stride(0) == 1) { + sort_onedpl(exec, view); + } else { + copy_to_host_run_stdsort_copy_back(exec, view); + } +} +#endif + +// fallback case +template +std::enable_if_t::value> +sort_device_view_without_comparator( + const ExecutionSpace& exec, + const Kokkos::View& view) { + sort_via_binsort(exec, view); +} + +// -------------------------------------------------- +// +// specialize cases for sorting with comparator +// +// -------------------------------------------------- + +#if defined(KOKKOS_ENABLE_CUDA) +template +void sort_device_view_with_comparator( + const Cuda& exec, const Kokkos::View& view, + const ComparatorType& comparator) { + sort_cudathrust(exec, view, comparator); +} +#endif + +#if defined(KOKKOS_ENABLE_ONEDPL) +template +void sort_device_view_with_comparator( + const Kokkos::Experimental::SYCL& exec, + const Kokkos::View& view, + const ComparatorType& comparator) { + using ViewType = Kokkos::View; + static_assert( + (ViewType::rank == 1) && + (std::is_same_v || + std::is_same_v || + std::is_same_v), + "sort_device_view_with_comparator: supports rank-1 Views " + "with LayoutLeft, LayoutRight or LayoutStride"); + + if (view.stride(0) == 1) { + sort_onedpl(exec, view, comparator); + } else { + copy_to_host_run_stdsort_copy_back(exec, view, comparator); + } +} +#endif + +template +std::enable_if_t::value> +sort_device_view_with_comparator( + const ExecutionSpace& exec, + const Kokkos::View& view, + const ComparatorType& comparator) { + // This is a fallback case if a more specialized overload does not exist: + // for now, this fallback copies data to host, runs std::sort + // and then copies data back. Potentially, this can later be changed + // with a better solution like our own quicksort on device or similar. + + using ViewType = Kokkos::View; + using MemSpace = typename ViewType::memory_space; + static_assert(!SpaceAccessibility::accessible, + "Impl::sort_device_view_with_comparator: should not be called " + "on a view that is already accessible on the host"); + + copy_to_host_run_stdsort_copy_back(exec, view, comparator); +} + +} // namespace Impl +} // namespace Kokkos +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp index 38dcd1a674..f254686dba 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp @@ -23,64 +23,85 @@ namespace Kokkos { namespace Experimental { -template -std::enable_if_t::value, - OutputIteratorType> -adjacent_difference(const ExecutionSpace& ex, InputIteratorType first_from, - InputIteratorType last_from, - OutputIteratorType first_dest) { +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIteratorType, + typename OutputIteratorType, + std::enable_if_t::value && + ::Kokkos::is_execution_space::value, + int> = 0> +OutputIteratorType adjacent_difference(const ExecutionSpace& ex, + InputIteratorType first_from, + InputIteratorType last_from, + OutputIteratorType first_dest) { using value_type1 = typename InputIteratorType::value_type; using value_type2 = typename OutputIteratorType::value_type; using binary_op = Impl::StdAdjacentDifferenceDefaultBinaryOpFunctor; - return Impl::adjacent_difference_impl( + return Impl::adjacent_difference_exespace_impl( "Kokkos::adjacent_difference_iterator_api", ex, first_from, last_from, first_dest, binary_op()); } -template -std::enable_if_t::value, - OutputIteratorType> -adjacent_difference(const ExecutionSpace& ex, InputIteratorType first_from, - InputIteratorType last_from, OutputIteratorType first_dest, - BinaryOp bin_op) { - return Impl::adjacent_difference_impl( +template < + typename ExecutionSpace, typename InputIteratorType, + typename OutputIteratorType, typename BinaryOp, + std::enable_if_t::value && + ::Kokkos::is_execution_space::value, + int> = 0> +OutputIteratorType adjacent_difference(const ExecutionSpace& ex, + InputIteratorType first_from, + InputIteratorType last_from, + OutputIteratorType first_dest, + BinaryOp bin_op) { + return Impl::adjacent_difference_exespace_impl( "Kokkos::adjacent_difference_iterator_api", ex, first_from, last_from, first_dest, bin_op); } -template -std::enable_if_t::value, - OutputIteratorType> -adjacent_difference(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first_from, InputIteratorType last_from, - OutputIteratorType first_dest) { +template < + typename ExecutionSpace, typename InputIteratorType, + typename OutputIteratorType, + std::enable_if_t::value && + ::Kokkos::is_execution_space::value, + int> = 0> +OutputIteratorType adjacent_difference(const std::string& label, + const ExecutionSpace& ex, + InputIteratorType first_from, + InputIteratorType last_from, + OutputIteratorType first_dest) { using value_type1 = typename InputIteratorType::value_type; using value_type2 = typename OutputIteratorType::value_type; using binary_op = Impl::StdAdjacentDifferenceDefaultBinaryOpFunctor; - return Impl::adjacent_difference_impl(label, ex, first_from, last_from, - first_dest, binary_op()); + return Impl::adjacent_difference_exespace_impl( + label, ex, first_from, last_from, first_dest, binary_op()); } -template -std::enable_if_t::value, - OutputIteratorType> -adjacent_difference(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first_from, InputIteratorType last_from, - OutputIteratorType first_dest, BinaryOp bin_op) { - return Impl::adjacent_difference_impl(label, ex, first_from, last_from, - first_dest, bin_op); +template < + typename ExecutionSpace, typename InputIteratorType, + typename OutputIteratorType, typename BinaryOp, + std::enable_if_t::value && + ::Kokkos::is_execution_space::value, + int> = 0> +OutputIteratorType adjacent_difference(const std::string& label, + const ExecutionSpace& ex, + InputIteratorType first_from, + InputIteratorType last_from, + OutputIteratorType first_dest, + BinaryOp bin_op) { + return Impl::adjacent_difference_exespace_impl(label, ex, first_from, + last_from, first_dest, bin_op); } -template +template ::value, + int> = 0> auto adjacent_difference( const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -96,13 +117,15 @@ auto adjacent_difference( using binary_op = Impl::StdAdjacentDifferenceDefaultBinaryOpFunctor; - return Impl::adjacent_difference_impl( + return Impl::adjacent_difference_exespace_impl( "Kokkos::adjacent_difference_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), binary_op()); } -template +template ::value, + int> = 0> auto adjacent_difference( const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -111,13 +134,15 @@ auto adjacent_difference( namespace KE = ::Kokkos::Experimental; Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - return Impl::adjacent_difference_impl( + return Impl::adjacent_difference_exespace_impl( "Kokkos::adjacent_difference_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), bin_op); } -template +template ::value, + int> = 0> auto adjacent_difference( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -134,13 +159,15 @@ auto adjacent_difference( Impl::StdAdjacentDifferenceDefaultBinaryOpFunctor; - return Impl::adjacent_difference_impl(label, ex, KE::cbegin(view_from), - KE::cend(view_from), - KE::begin(view_dest), binary_op()); + return Impl::adjacent_difference_exespace_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op()); } -template +template ::value, + int> = 0> auto adjacent_difference( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -149,9 +176,85 @@ auto adjacent_difference( namespace KE = ::Kokkos::Experimental; Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - return Impl::adjacent_difference_impl(label, ex, KE::cbegin(view_from), - KE::cend(view_from), - KE::begin(view_dest), bin_op); + return Impl::adjacent_difference_exespace_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), bin_op); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template ::value && + ::Kokkos::is_team_handle::value, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType adjacent_difference( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest) { + using value_type1 = typename InputIteratorType::value_type; + using value_type2 = typename OutputIteratorType::value_type; + using binary_op = + Impl::StdAdjacentDifferenceDefaultBinaryOpFunctor; + return Impl::adjacent_difference_team_impl(teamHandle, first_from, last_from, + first_dest, binary_op()); +} + +template ::value && + ::Kokkos::is_team_handle::value, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType +adjacent_difference(const TeamHandleType& teamHandle, + InputIteratorType first_from, InputIteratorType last_from, + OutputIteratorType first_dest, BinaryOp bin_op) { + return Impl::adjacent_difference_team_impl(teamHandle, first_from, last_from, + first_dest, bin_op); +} + +template < + typename TeamHandleType, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto adjacent_difference( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest) { + namespace KE = ::Kokkos::Experimental; + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + + using view_type1 = ::Kokkos::View; + using view_type2 = ::Kokkos::View; + using value_type1 = typename view_type1::value_type; + using value_type2 = typename view_type2::value_type; + using binary_op = + Impl::StdAdjacentDifferenceDefaultBinaryOpFunctor; + return Impl::adjacent_difference_team_impl(teamHandle, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest), binary_op()); +} + +template < + typename TeamHandleType, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOp, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto adjacent_difference( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp bin_op) { + namespace KE = ::Kokkos::Experimental; + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + return Impl::adjacent_difference_team_impl(teamHandle, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest), bin_op); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp index 43c2b66010..ac476ca5bf 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp @@ -23,71 +23,144 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set1 -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t, int> = 0> IteratorType adjacent_find(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::adjacent_find_impl("Kokkos::adjacent_find_iterator_api_default", - ex, first, last); + return Impl::adjacent_find_exespace_impl( + "Kokkos::adjacent_find_iterator_api_default", ex, first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t, int> = 0> IteratorType adjacent_find(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::adjacent_find_impl(label, ex, first, last); + return Impl::adjacent_find_exespace_impl(label, ex, first, last); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t, int> = 0> auto adjacent_find(const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::adjacent_find_impl("Kokkos::adjacent_find_view_api_default", ex, - KE::begin(v), KE::end(v)); + return Impl::adjacent_find_exespace_impl( + "Kokkos::adjacent_find_view_api_default", ex, KE::begin(v), KE::end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t, int> = 0> auto adjacent_find(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::adjacent_find_impl(label, ex, KE::begin(v), KE::end(v)); + return Impl::adjacent_find_exespace_impl(label, ex, KE::begin(v), KE::end(v)); } // overload set2 -template +template < + typename ExecutionSpace, typename IteratorType, + typename BinaryPredicateType, + std::enable_if_t, int> = 0> IteratorType adjacent_find(const ExecutionSpace& ex, IteratorType first, IteratorType last, BinaryPredicateType pred) { - return Impl::adjacent_find_impl("Kokkos::adjacent_find_iterator_api_default", - ex, first, last, pred); + return Impl::adjacent_find_exespace_impl( + "Kokkos::adjacent_find_iterator_api_default", ex, first, last, pred); } -template +template < + typename ExecutionSpace, typename IteratorType, + typename BinaryPredicateType, + std::enable_if_t, int> = 0> IteratorType adjacent_find(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, BinaryPredicateType pred) { - return Impl::adjacent_find_impl(label, ex, first, last, pred); + return Impl::adjacent_find_exespace_impl(label, ex, first, last, pred); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename BinaryPredicateType, + std::enable_if_t, int> = 0> auto adjacent_find(const ExecutionSpace& ex, const ::Kokkos::View& v, BinaryPredicateType pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::adjacent_find_impl("Kokkos::adjacent_find_view_api_default", ex, - KE::begin(v), KE::end(v), pred); + return Impl::adjacent_find_exespace_impl( + "Kokkos::adjacent_find_view_api_default", ex, KE::begin(v), KE::end(v), + pred); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename BinaryPredicateType, + std::enable_if_t, int> = 0> auto adjacent_find(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, BinaryPredicateType pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::adjacent_find_impl(label, ex, KE::begin(v), KE::end(v), pred); + return Impl::adjacent_find_exespace_impl(label, ex, KE::begin(v), KE::end(v), + pred); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set1 +template , int> = 0> +KOKKOS_FUNCTION IteratorType adjacent_find(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last) { + return Impl::adjacent_find_team_impl(teamHandle, first, last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto adjacent_find( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_team_impl(teamHandle, KE::begin(v), KE::end(v)); +} + +// overload set2 +template , int> = 0> +KOKKOS_FUNCTION IteratorType adjacent_find(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last, + BinaryPredicateType pred) { + return Impl::adjacent_find_team_impl(teamHandle, first, last, pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto adjacent_find( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + BinaryPredicateType pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_team_impl(teamHandle, KE::begin(v), KE::end(v), + pred); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp index 2ffec7e144..d6ed4c4a7e 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp @@ -23,41 +23,79 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool all_of(const ExecutionSpace& ex, InputIterator first, InputIterator last, Predicate predicate) { - return Impl::all_of_impl("Kokkos::all_of_iterator_api_default", ex, first, - last, predicate); + return Impl::all_of_exespace_impl("Kokkos::all_of_iterator_api_default", ex, + first, last, predicate); } -template +template < + typename ExecutionSpace, typename InputIterator, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool all_of(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, Predicate predicate) { - return Impl::all_of_impl(label, ex, first, last, predicate); + return Impl::all_of_exespace_impl(label, ex, first, last, predicate); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool all_of(const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::all_of_impl("Kokkos::all_of_view_api_default", ex, KE::cbegin(v), - KE::cend(v), std::move(predicate)); + return Impl::all_of_exespace_impl("Kokkos::all_of_view_api_default", ex, + KE::cbegin(v), KE::cend(v), + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool all_of(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::all_of_impl(label, ex, KE::cbegin(v), KE::cend(v), - std::move(predicate)); + return Impl::all_of_exespace_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION bool all_of(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + Predicate predicate) { + return Impl::all_of_team_impl(teamHandle, first, last, predicate); +} + +template , int> = 0> +KOKKOS_FUNCTION bool all_of(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::all_of_team_impl(teamHandle, KE::cbegin(v), KE::cend(v), + std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp index 019c466c6d..82356e6598 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp @@ -23,41 +23,79 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool any_of(const ExecutionSpace& ex, InputIterator first, InputIterator last, Predicate predicate) { - return Impl::any_of_impl("Kokkos::any_of_view_api_default", ex, first, last, - predicate); + return Impl::any_of_exespace_impl("Kokkos::any_of_view_api_default", ex, + first, last, predicate); } -template +template < + typename ExecutionSpace, typename InputIterator, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool any_of(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, Predicate predicate) { - return Impl::any_of_impl(label, ex, first, last, predicate); + return Impl::any_of_exespace_impl(label, ex, first, last, predicate); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool any_of(const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::any_of_impl("Kokkos::any_of_view_api_default", ex, KE::cbegin(v), - KE::cend(v), std::move(predicate)); + return Impl::any_of_exespace_impl("Kokkos::any_of_view_api_default", ex, + KE::cbegin(v), KE::cend(v), + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool any_of(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::any_of_impl(label, ex, KE::cbegin(v), KE::cend(v), - std::move(predicate)); + return Impl::any_of_exespace_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION bool any_of(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + Predicate predicate) { + return Impl::any_of_team_impl(teamHandle, first, last, predicate); +} + +template , int> = 0> +KOKKOS_FUNCTION bool any_of(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::any_of_team_impl(teamHandle, KE::cbegin(v), KE::cend(v), + std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp index 028f3b66b2..b7ce1ba5ed 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp @@ -23,22 +23,31 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator copy(const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::copy_impl("Kokkos::copy_iterator_api_default", ex, first, last, - d_first); + return Impl::copy_exespace_impl("Kokkos::copy_iterator_api_default", ex, + first, last, d_first); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator copy(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::copy_impl(label, ex, first, last, d_first); + return Impl::copy_exespace_impl(label, ex, first, last, d_first); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { @@ -46,12 +55,15 @@ auto copy(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); namespace KE = ::Kokkos::Experimental; - return Impl::copy_impl("Kokkos::copy_view_api_default", ex, - KE::cbegin(source), KE::cend(source), KE::begin(dest)); + return Impl::copy_exespace_impl("Kokkos::copy_view_api_default", ex, + KE::cbegin(source), KE::cend(source), + KE::begin(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { @@ -59,8 +71,35 @@ auto copy(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); namespace KE = ::Kokkos::Experimental; - return Impl::copy_impl(label, ex, KE::cbegin(source), KE::cend(source), - KE::begin(dest)); + return Impl::copy_exespace_impl(label, ex, KE::cbegin(source), + KE::cend(source), KE::begin(dest)); +} + +// +// overload set accepting team handle +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator copy(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + OutputIterator d_first) { + return Impl::copy_team_impl(teamHandle, first, last, d_first); +} + +template , int> = 0> +KOKKOS_FUNCTION auto copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_team_impl(teamHandle, KE::cbegin(source), KE::cend(source), + KE::begin(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp index deff6baf9a..8f9e0f19b8 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp @@ -23,42 +23,81 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType2 copy_backward(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 d_last) { - return Impl::copy_backward_impl("Kokkos::copy_backward_iterator_api_default", - ex, first, last, d_last); + return Impl::copy_backward_exespace_impl( + "Kokkos::copy_backward_iterator_api_default", ex, first, last, d_last); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType2 copy_backward(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 d_last) { - return Impl::copy_backward_impl(label, ex, first, last, d_last); + return Impl::copy_backward_exespace_impl(label, ex, first, last, d_last); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy_backward(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::copy_backward_impl("Kokkos::copy_backward_view_api_default", ex, - cbegin(source), cend(source), end(dest)); + return Impl::copy_backward_exespace_impl( + "Kokkos::copy_backward_view_api_default", ex, cbegin(source), + cend(source), end(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy_backward(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::copy_backward_impl(label, ex, cbegin(source), cend(source), - end(dest)); + return Impl::copy_backward_exespace_impl(label, ex, cbegin(source), + cend(source), end(dest)); +} + +// +// overload set accepting team handle +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType2 copy_backward(const TeamHandleType& teamHandle, + IteratorType1 first, + IteratorType1 last, + IteratorType2 d_last) { + return Impl::copy_backward_team_impl(teamHandle, first, last, d_last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto copy_backward( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_backward_team_impl(teamHandle, cbegin(source), cend(source), + end(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp index 3db2fc074f..ba18bc76b9 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp @@ -23,46 +23,85 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator copy_if(const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first, Predicate pred) { - return Impl::copy_if_impl("Kokkos::copy_if_iterator_api_default", ex, first, - last, d_first, std::move(pred)); + return Impl::copy_if_exespace_impl("Kokkos::copy_if_iterator_api_default", ex, + first, last, d_first, std::move(pred)); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator copy_if(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first, Predicate pred) { - return Impl::copy_if_impl(label, ex, first, last, d_first, std::move(pred)); + return Impl::copy_if_exespace_impl(label, ex, first, last, d_first, + std::move(pred)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy_if(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest, Predicate pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::copy_if_impl("Kokkos::copy_if_view_api_default", ex, - cbegin(source), cend(source), begin(dest), - std::move(pred)); + return Impl::copy_if_exespace_impl("Kokkos::copy_if_view_api_default", ex, + cbegin(source), cend(source), begin(dest), + std::move(pred)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest, Predicate pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::copy_if_impl(label, ex, cbegin(source), cend(source), - begin(dest), std::move(pred)); + return Impl::copy_if_exespace_impl(label, ex, cbegin(source), cend(source), + begin(dest), std::move(pred)); +} + +// +// overload set accepting team handle +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator copy_if(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + OutputIterator d_first, Predicate pred) { + return Impl::copy_if_team_impl(teamHandle, first, last, d_first, + std::move(pred)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto copy_if( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest, Predicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_if_team_impl(teamHandle, cbegin(source), cend(source), + begin(dest), std::move(pred)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp index a64f99b5c0..43c9120483 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp @@ -23,23 +23,32 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename Size, + typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator copy_n(const ExecutionSpace& ex, InputIterator first, Size count, OutputIterator result) { - return Impl::copy_n_impl("Kokkos::copy_n_iterator_api_default", ex, first, - count, result); + return Impl::copy_n_exespace_impl("Kokkos::copy_n_iterator_api_default", ex, + first, count, result); } -template +template < + typename ExecutionSpace, typename InputIterator, typename Size, + typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator copy_n(const std::string& label, const ExecutionSpace& ex, InputIterator first, Size count, OutputIterator result) { - return Impl::copy_n_impl(label, ex, first, count, result); + return Impl::copy_n_exespace_impl(label, ex, first, count, result); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename Size, typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy_n(const ExecutionSpace& ex, const ::Kokkos::View& source, Size count, ::Kokkos::View& dest) { @@ -47,12 +56,14 @@ auto copy_n(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); namespace KE = ::Kokkos::Experimental; - return Impl::copy_n_impl("Kokkos::copy_n_view_api_default", ex, - KE::cbegin(source), count, KE::begin(dest)); + return Impl::copy_n_exespace_impl("Kokkos::copy_n_view_api_default", ex, + KE::cbegin(source), count, KE::begin(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename Size, typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto copy_n(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, Size count, ::Kokkos::View& dest) { @@ -60,8 +71,35 @@ auto copy_n(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); namespace KE = ::Kokkos::Experimental; - return Impl::copy_n_impl(label, ex, KE::cbegin(source), count, - KE::begin(dest)); + return Impl::copy_n_exespace_impl(label, ex, KE::cbegin(source), count, + KE::begin(dest)); +} + +// +// overload set accepting team handle +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator copy_n(const TeamHandleType& teamHandle, + InputIterator first, Size count, + OutputIterator result) { + return Impl::copy_n_team_impl(teamHandle, first, count, result); +} + +template , int> = 0> +KOKKOS_FUNCTION auto copy_n( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, Size count, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_n_team_impl(teamHandle, KE::cbegin(source), count, + KE::begin(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp index 3ac63467ec..f179e88bab 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp @@ -23,41 +23,81 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> typename IteratorType::difference_type count(const ExecutionSpace& ex, IteratorType first, IteratorType last, const T& value) { - return Impl::count_impl("Kokkos::count_iterator_api_default", ex, first, last, - value); + return Impl::count_exespace_impl("Kokkos::count_iterator_api_default", ex, + first, last, value); } -template +template < + typename ExecutionSpace, typename IteratorType, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> typename IteratorType::difference_type count(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, const T& value) { - return Impl::count_impl(label, ex, first, last, value); + return Impl::count_exespace_impl(label, ex, first, last, value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto count(const ExecutionSpace& ex, const ::Kokkos::View& v, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::count_impl("Kokkos::count_view_api_default", ex, KE::cbegin(v), - KE::cend(v), value); + return Impl::count_exespace_impl("Kokkos::count_view_api_default", ex, + KE::cbegin(v), KE::cend(v), value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto count(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::count_impl(label, ex, KE::cbegin(v), KE::cend(v), value); + return Impl::count_exespace_impl(label, ex, KE::cbegin(v), KE::cend(v), + value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +template , int> = 0> +KOKKOS_FUNCTION typename IteratorType::difference_type count( + const TeamHandleType& teamHandle, IteratorType first, IteratorType last, + const T& value) { + return Impl::count_team_impl(teamHandle, first, last, value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto count(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_team_impl(teamHandle, KE::cbegin(v), KE::cend(v), value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp index b9731d378a..967cf75e7a 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp @@ -23,46 +23,84 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> typename IteratorType::difference_type count_if(const ExecutionSpace& ex, IteratorType first, IteratorType last, Predicate predicate) { - return Impl::count_if_impl("Kokkos::count_if_iterator_api_default", ex, first, - last, std::move(predicate)); + return Impl::count_if_exespace_impl("Kokkos::count_if_iterator_api_default", + ex, first, last, std::move(predicate)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> typename IteratorType::difference_type count_if(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, Predicate predicate) { - return Impl::count_if_impl(label, ex, first, last, std::move(predicate)); + return Impl::count_if_exespace_impl(label, ex, first, last, + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto count_if(const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::count_if_impl("Kokkos::count_if_view_api_default", ex, - KE::cbegin(v), KE::cend(v), std::move(predicate)); + return Impl::count_if_exespace_impl("Kokkos::count_if_view_api_default", ex, + KE::cbegin(v), KE::cend(v), + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto count_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::count_if_impl(label, ex, KE::cbegin(v), KE::cend(v), - std::move(predicate)); + return Impl::count_if_exespace_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +// +// overload set accepting team handle +// +template , int> = 0> +KOKKOS_FUNCTION typename IteratorType::difference_type count_if( + const TeamHandleType& teamHandle, IteratorType first, IteratorType last, + Predicate predicate) { + return Impl::count_if_team_impl(teamHandle, first, last, + std::move(predicate)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto count_if(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_if_team_impl(teamHandle, KE::cbegin(v), KE::cend(v), + std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp index 37c0d75ef5..a72a49cc22 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp @@ -23,50 +23,61 @@ namespace Kokkos { namespace Experimental { -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2) { - return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, - last1, first2); +// +// overload set accepting execution space +// +template && + Kokkos::is_execution_space_v, + int> = 0> +bool equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2) { + return Impl::equal_exespace_impl("Kokkos::equal_iterator_api_default", ex, + first1, last1, first2); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, - IteratorType1 last1, IteratorType2 first2) { - return Impl::equal_impl(label, ex, first1, last1, first2); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, IteratorType2 first2) { + return Impl::equal_exespace_impl(label, ex, first1, last1, first2); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2, BinaryPredicateType predicate) { - return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, - last1, first2, std::move(predicate)); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, BinaryPredicateType predicate) { + return Impl::equal_exespace_impl("Kokkos::equal_iterator_api_default", ex, + first1, last1, first2, std::move(predicate)); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, - IteratorType1 last1, IteratorType2 first2, - BinaryPredicateType predicate) { - return Impl::equal_impl(label, ex, first1, last1, first2, - std::move(predicate)); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, + BinaryPredicateType predicate) { + return Impl::equal_exespace_impl(label, ex, first1, last1, first2, + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool equal(const ExecutionSpace& ex, const ::Kokkos::View& view1, ::Kokkos::View& view2) { @@ -74,13 +85,15 @@ bool equal(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::equal_impl("Kokkos::equal_view_api_default", ex, - KE::cbegin(view1), KE::cend(view1), - KE::cbegin(view2)); + return Impl::equal_exespace_impl("Kokkos::equal_view_api_default", ex, + KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool equal(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view1, ::Kokkos::View& view2) { @@ -88,12 +101,14 @@ bool equal(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::equal_impl(label, ex, KE::cbegin(view1), KE::cend(view1), - KE::cbegin(view2)); + return Impl::equal_exespace_impl(label, ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool equal(const ExecutionSpace& ex, const ::Kokkos::View& view1, ::Kokkos::View& view2, @@ -102,13 +117,15 @@ bool equal(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::equal_impl("Kokkos::equal_view_api_default", ex, - KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), - std::move(predicate)); + return Impl::equal_exespace_impl("Kokkos::equal_view_api_default", ex, + KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2), std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool equal(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view1, ::Kokkos::View& view2, @@ -117,51 +134,149 @@ bool equal(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::equal_impl(label, ex, KE::cbegin(view1), KE::cend(view1), - KE::cbegin(view2), std::move(predicate)); + return Impl::equal_exespace_impl(label, ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), + std::move(predicate)); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2, IteratorType2 last2) { - return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, - last1, first2, last2); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::equal_exespace_impl("Kokkos::equal_iterator_api_default", ex, + first1, last1, first2, last2); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, - IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { - return Impl::equal_impl(label, ex, first1, last1, first2, last2); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, + IteratorType2 last2) { + return Impl::equal_exespace_impl(label, ex, first1, last1, first2, last2); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2, IteratorType2 last2, - BinaryPredicateType predicate) { - return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, - last1, first2, last2, std::move(predicate)); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + return Impl::equal_exespace_impl("Kokkos::equal_iterator_api_default", ex, + first1, last1, first2, last2, + std::move(predicate)); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - IteratorType1, IteratorType2>::value, - bool> -equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, - IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, - BinaryPredicateType predicate) { - return Impl::equal_impl(label, ex, first1, last1, first2, last2, - std::move(predicate)); +template && ::Kokkos:: + is_execution_space_v, + int> = 0> +bool equal(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, + IteratorType2 last2, BinaryPredicateType predicate) { + return Impl::equal_exespace_impl(label, ex, first1, last1, first2, last2, + std::move(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template && ::Kokkos:: + is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION bool equal(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2) { + return Impl::equal_team_impl(teamHandle, first1, last1, first2); +} + +template && ::Kokkos:: + is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION bool equal(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, + BinaryPredicateType predicate) { + return Impl::equal_team_impl(teamHandle, first1, last1, first2, + std::move(predicate)); +} + +template , int> = 0> +KOKKOS_FUNCTION bool equal( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_team_impl(teamHandle, KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2)); +} + +template , int> = 0> +KOKKOS_FUNCTION bool equal( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, + BinaryPredicateType predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_team_impl(teamHandle, KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2), std::move(predicate)); +} + +template && ::Kokkos:: + is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION bool equal(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::equal_team_impl(teamHandle, first1, last1, first2, last2); +} + +template && ::Kokkos:: + is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION bool equal(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + return Impl::equal_team_impl(teamHandle, first1, last1, first2, last2, + std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp index 4e05676c2c..ee3a105126 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp @@ -23,105 +23,130 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1 -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - ValueType init_value) { - static_assert(std::is_move_constructible::value, +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType exclusive_scan(const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + ValueType init_value) { + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); - return Impl::exclusive_scan_default_op_impl( + return Impl::exclusive_scan_default_op_exespace_impl( "Kokkos::exclusive_scan_default_functors_iterator_api", ex, first, last, - first_dest, init_value); + first_dest, std::move(init_value)); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -exclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, ValueType init_value) { - static_assert(std::is_move_constructible::value, +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType exclusive_scan(const std::string& label, + const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + ValueType init_value) { + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); - return Impl::exclusive_scan_default_op_impl(label, ex, first, last, - first_dest, init_value); + return Impl::exclusive_scan_default_op_exespace_impl( + label, ex, first, last, first_dest, std::move(init_value)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto exclusive_scan(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, ValueType init_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); namespace KE = ::Kokkos::Experimental; - return Impl::exclusive_scan_default_op_impl( + return Impl::exclusive_scan_default_op_exespace_impl( "Kokkos::exclusive_scan_default_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), - init_value); + std::move(init_value)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, ValueType init_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); namespace KE = ::Kokkos::Experimental; - return Impl::exclusive_scan_default_op_impl(label, ex, KE::cbegin(view_from), - KE::cend(view_from), - KE::begin(view_dest), init_value); + return Impl::exclusive_scan_default_op_exespace_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), std::move(init_value)); } // overload set 2 -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - ValueType init_value, BinaryOpType bop) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType exclusive_scan(const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + ValueType init_value, BinaryOpType bop) { Impl::static_assert_is_not_openmptarget(ex); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); - return Impl::exclusive_scan_custom_op_impl( + return Impl::exclusive_scan_custom_op_exespace_impl( "Kokkos::exclusive_scan_custom_functors_iterator_api", ex, first, last, - first_dest, init_value, bop); + first_dest, std::move(init_value), bop); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -exclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, ValueType init_value, - BinaryOpType bop) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType exclusive_scan(const std::string& label, + const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + ValueType init_value, BinaryOpType bop) { Impl::static_assert_is_not_openmptarget(ex); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); - return Impl::exclusive_scan_custom_op_impl(label, ex, first, last, first_dest, - init_value, bop); + return Impl::exclusive_scan_custom_op_exespace_impl( + label, ex, first, last, first_dest, std::move(init_value), bop); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + typename BinaryOpType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto exclusive_scan(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -129,18 +154,20 @@ auto exclusive_scan(const ExecutionSpace& ex, Impl::static_assert_is_not_openmptarget(ex); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); namespace KE = ::Kokkos::Experimental; - return Impl::exclusive_scan_custom_op_impl( + return Impl::exclusive_scan_custom_op_exespace_impl( "Kokkos::exclusive_scan_custom_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), - init_value, bop); + std::move(init_value), bop); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + typename BinaryOpType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -148,12 +175,92 @@ auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_not_openmptarget(ex); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); namespace KE = ::Kokkos::Experimental; - return Impl::exclusive_scan_custom_op_impl( + return Impl::exclusive_scan_custom_op_exespace_impl( label, ex, KE::cbegin(view_from), KE::cend(view_from), - KE::begin(view_dest), init_value, bop); + KE::begin(view_dest), std::move(init_value), bop); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1 +template && + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType +exclusive_scan(const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + ValueType init_value) { + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + return Impl::exclusive_scan_default_op_team_impl( + teamHandle, first, last, first_dest, std::move(init_value)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto exclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_default_op_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), std::move(init_value)); +} + +// overload set 2 +template && + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType +exclusive_scan(const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(teamHandle); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + return Impl::exclusive_scan_custom_op_team_impl( + teamHandle, first, last, first_dest, std::move(init_value), bop); +} + +template , int> = 0> +KOKKOS_FUNCTION auto exclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(teamHandle); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_custom_op_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), std::move(init_value), bop); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp index 1e300a4c20..6d805ba1be 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp @@ -23,33 +23,67 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void fill(const ExecutionSpace& ex, IteratorType first, IteratorType last, const T& value) { - Impl::fill_impl("Kokkos::fill_iterator_api_default", ex, first, last, value); + Impl::fill_exespace_impl("Kokkos::fill_iterator_api_default", ex, first, last, + value); } -template +template < + typename ExecutionSpace, typename IteratorType, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void fill(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, const T& value) { - Impl::fill_impl(label, ex, first, last, value); + Impl::fill_exespace_impl(label, ex, first, last, value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void fill(const ExecutionSpace& ex, const ::Kokkos::View& view, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - - Impl::fill_impl("Kokkos::fill_view_api_default", ex, begin(view), end(view), - value); + Impl::fill_exespace_impl("Kokkos::fill_view_api_default", ex, begin(view), + end(view), value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void fill(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::fill_exespace_impl(label, ex, begin(view), end(view), value); +} - Impl::fill_impl(label, ex, begin(view), end(view), value); +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION void fill(const TeamHandleType& th, IteratorType first, + IteratorType last, const T& value) { + Impl::fill_team_impl(th, first, last, value); +} + +template , int> = 0> +KOKKOS_FUNCTION void fill(const TeamHandleType& th, + const ::Kokkos::View& view, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::fill_team_impl(th, begin(view), end(view), value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp index 02503dfd14..66b8cd66cc 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp @@ -23,38 +23,72 @@ namespace Kokkos { namespace Experimental { -template +template < + typename ExecutionSpace, typename IteratorType, typename SizeType, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType fill_n(const ExecutionSpace& ex, IteratorType first, SizeType n, const T& value) { - return Impl::fill_n_impl("Kokkos::fill_n_iterator_api_default", ex, first, n, - value); + return Impl::fill_n_exespace_impl("Kokkos::fill_n_iterator_api_default", ex, + first, n, value); } -template +template < + typename ExecutionSpace, typename IteratorType, typename SizeType, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType fill_n(const std::string& label, const ExecutionSpace& ex, IteratorType first, SizeType n, const T& value) { - return Impl::fill_n_impl(label, ex, first, n, value); + return Impl::fill_n_exespace_impl(label, ex, first, n, value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename SizeType, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto fill_n(const ExecutionSpace& ex, const ::Kokkos::View& view, SizeType n, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::fill_n_impl("Kokkos::fill_n_view_api_default", ex, begin(view), - n, value); + return Impl::fill_n_exespace_impl("Kokkos::fill_n_view_api_default", ex, + begin(view), n, value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename SizeType, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto fill_n(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, SizeType n, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::fill_n_impl(label, ex, begin(view), n, value); + return Impl::fill_n_exespace_impl(label, ex, begin(view), n, value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType fill_n(const TeamHandleType& th, + IteratorType first, SizeType n, + const T& value) { + return Impl::fill_n_team_impl(th, first, n, value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto fill_n(const TeamHandleType& th, + const ::Kokkos::View& view, + SizeType n, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + return Impl::fill_n_team_impl(th, begin(view), n, value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp index 65b68cf931..e5e2b0e2b0 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp @@ -23,36 +23,76 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> InputIterator find(const ExecutionSpace& ex, InputIterator first, InputIterator last, const T& value) { - return Impl::find_impl("Kokkos::find_iterator_api_default", ex, first, last, - value); + return Impl::find_exespace_impl("Kokkos::find_iterator_api_default", ex, + first, last, value); } -template +template < + typename ExecutionSpace, typename InputIterator, typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> InputIterator find(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, const T& value) { - return Impl::find_impl(label, ex, first, last, value); + return Impl::find_exespace_impl(label, ex, first, last, value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find(const ExecutionSpace& ex, const ::Kokkos::View& view, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::find_impl("Kokkos::find_view_api_default", ex, KE::begin(view), - KE::end(view), value); + return Impl::find_exespace_impl("Kokkos::find_view_api_default", ex, + KE::begin(view), KE::end(view), value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename T, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const T& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::find_impl(label, ex, KE::begin(view), KE::end(view), value); + return Impl::find_exespace_impl(label, ex, KE::begin(view), KE::end(view), + value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION InputIterator find(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + const T& value) { + return Impl::find_team_impl(teamHandle, first, last, value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto find(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_team_impl(teamHandle, KE::begin(view), KE::end(view), + value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp index f6a38855eb..a4ec735fd5 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp @@ -24,24 +24,34 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1: no binary predicate passed -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_end(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { - return Impl::find_end_impl("Kokkos::find_end_iterator_api_default", ex, first, - last, s_first, s_last); + return Impl::find_end_exespace_impl("Kokkos::find_end_iterator_api_default", + ex, first, last, s_first, s_last); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_end(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { - return Impl::find_end_impl(label, ex, first, last, s_first, s_last); + return Impl::find_end_exespace_impl(label, ex, first, last, s_first, s_last); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_end(const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view) { @@ -49,13 +59,15 @@ auto find_end(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_end_impl("Kokkos::find_end_view_api_default", ex, - KE::begin(view), KE::end(view), KE::begin(s_view), - KE::end(s_view)); + return Impl::find_end_exespace_impl("Kokkos::find_end_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_end(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view) { @@ -63,31 +75,38 @@ auto find_end(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_end_impl(label, ex, KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view)); + return Impl::find_end_exespace_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); } // overload set 2: binary predicate passed -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_end(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, const BinaryPredicateType& pred) { - return Impl::find_end_impl("Kokkos::find_end_iterator_api_default", ex, first, - last, s_first, s_last, pred); + return Impl::find_end_exespace_impl("Kokkos::find_end_iterator_api_default", + ex, first, last, s_first, s_last, pred); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_end(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, const BinaryPredicateType& pred) { - return Impl::find_end_impl(label, ex, first, last, s_first, s_last, pred); + return Impl::find_end_exespace_impl(label, ex, first, last, s_first, s_last, + pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_end(const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view, @@ -96,13 +115,15 @@ auto find_end(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_end_impl("Kokkos::find_end_view_api_default", ex, - KE::begin(view), KE::end(view), KE::begin(s_view), - KE::end(s_view), pred); + return Impl::find_end_exespace_impl("Kokkos::find_end_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_end(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view, @@ -111,8 +132,71 @@ auto find_end(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_end_impl(label, ex, KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view), pred); + return Impl::find_end_exespace_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1: no binary predicate passed +template , int> = 0> +KOKKOS_FUNCTION IteratorType1 find_end(const TeamHandleType& teamHandle, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::find_end_team_impl(teamHandle, first, last, s_first, s_last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto find_end( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_team_impl(teamHandle, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template , int> = 0> + +KOKKOS_FUNCTION IteratorType1 find_end(const TeamHandleType& teamHandle, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_end_team_impl(teamHandle, first, last, s_first, s_last, + pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto find_end( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_team_impl(teamHandle, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp index 6b0e4993ee..341a70e2f2 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp @@ -23,24 +23,36 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1: no binary predicate passed -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_first_of(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { - return Impl::find_first_of_impl("Kokkos::find_first_of_iterator_api_default", - ex, first, last, s_first, s_last); + return Impl::find_first_of_exespace_impl( + "Kokkos::find_first_of_iterator_api_default", ex, first, last, s_first, + s_last); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_first_of(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { - return Impl::find_first_of_impl(label, ex, first, last, s_first, s_last); + return Impl::find_first_of_exespace_impl(label, ex, first, last, s_first, + s_last); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_first_of(const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view) { @@ -48,13 +60,15 @@ auto find_first_of(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_first_of_impl("Kokkos::find_first_of_view_api_default", ex, - KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view)); + return Impl::find_first_of_exespace_impl( + "Kokkos::find_first_of_view_api_default", ex, KE::begin(view), + KE::end(view), KE::begin(s_view), KE::end(s_view)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_first_of(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view) { @@ -62,33 +76,41 @@ auto find_first_of(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_first_of_impl(label, ex, KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view)); + return Impl::find_first_of_exespace_impl(label, ex, KE::begin(view), + KE::end(view), KE::begin(s_view), + KE::end(s_view)); } // overload set 2: binary predicate passed -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_first_of(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, const BinaryPredicateType& pred) { - return Impl::find_first_of_impl("Kokkos::find_first_of_iterator_api_default", - ex, first, last, s_first, s_last, pred); + return Impl::find_first_of_exespace_impl( + "Kokkos::find_first_of_iterator_api_default", ex, first, last, s_first, + s_last, pred); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 find_first_of(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, const BinaryPredicateType& pred) { - return Impl::find_first_of_impl(label, ex, first, last, s_first, s_last, - pred); + return Impl::find_first_of_exespace_impl(label, ex, first, last, s_first, + s_last, pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_first_of(const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view, @@ -97,13 +119,15 @@ auto find_first_of(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_first_of_impl("Kokkos::find_first_of_view_api_default", ex, - KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view), pred); + return Impl::find_first_of_exespace_impl( + "Kokkos::find_first_of_view_api_default", ex, KE::begin(view), + KE::end(view), KE::begin(s_view), KE::end(s_view), pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto find_first_of(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view, @@ -112,8 +136,77 @@ auto find_first_of(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::find_first_of_impl(label, ex, KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view), pred); + return Impl::find_first_of_exespace_impl(label, ex, KE::begin(view), + KE::end(view), KE::begin(s_view), + KE::end(s_view), pred); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1: no binary predicate passed +template , int> = 0> +KOKKOS_FUNCTION IteratorType1 find_first_of(const TeamHandleType& teamHandle, + IteratorType1 first, + IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::find_first_of_team_impl(teamHandle, first, last, s_first, + s_last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto find_first_of( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_team_impl(teamHandle, KE::begin(view), + KE::end(view), KE::begin(s_view), + KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template , int> = 0> + +KOKKOS_FUNCTION IteratorType1 find_first_of(const TeamHandleType& teamHandle, + IteratorType1 first, + IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_first_of_team_impl(teamHandle, first, last, s_first, s_last, + pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto find_first_of( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_team_impl(teamHandle, KE::begin(view), + KE::end(view), KE::begin(s_view), + KE::end(s_view), pred); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp index 911316a668..283fab7617 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp @@ -23,42 +23,82 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType find_if(const ExecutionSpace& ex, IteratorType first, IteratorType last, PredicateType predicate) { - return Impl::find_if_or_not_impl("Kokkos::find_if_iterator_api_default", - ex, first, last, std::move(predicate)); + return Impl::find_if_or_not_exespace_impl( + "Kokkos::find_if_iterator_api_default", ex, first, last, + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType find_if(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, PredicateType predicate) { - return Impl::find_if_or_not_impl(label, ex, first, last, - std::move(predicate)); + return Impl::find_if_or_not_exespace_impl(label, ex, first, last, + std::move(predicate)); } -template +template ::value, + int> = 0> auto find_if(const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::find_if_or_not_impl("Kokkos::find_if_view_api_default", ex, - KE::begin(v), KE::end(v), - std::move(predicate)); + return Impl::find_if_or_not_exespace_impl( + "Kokkos::find_if_view_api_default", ex, KE::begin(v), KE::end(v), + std::move(predicate)); } -template +template ::value, + int> = 0> auto find_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::find_if_or_not_impl(label, ex, KE::begin(v), KE::end(v), - std::move(predicate)); + return Impl::find_if_or_not_exespace_impl( + label, ex, KE::begin(v), KE::end(v), std::move(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType find_if(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + PredicateType predicate) { + return Impl::find_if_or_not_team_impl(teamHandle, first, last, + std::move(predicate)); +} + +template < + typename TeamHandleType, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto find_if(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_team_impl(teamHandle, KE::begin(v), + KE::end(v), std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp index 18294d7b7d..5e17a6f539 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp @@ -23,45 +23,84 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType find_if_not(const ExecutionSpace& ex, IteratorType first, IteratorType last, Predicate predicate) { - return Impl::find_if_or_not_impl( + return Impl::find_if_or_not_exespace_impl( "Kokkos::find_if_not_iterator_api_default", ex, first, last, std::move(predicate)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType find_if_not(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, Predicate predicate) { - return Impl::find_if_or_not_impl(label, ex, first, last, - std::move(predicate)); + return Impl::find_if_or_not_exespace_impl(label, ex, first, last, + std::move(predicate)); } -template +template ::value, + int> = 0> auto find_if_not(const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::find_if_or_not_impl( + return Impl::find_if_or_not_exespace_impl( "Kokkos::find_if_not_view_api_default", ex, KE::begin(v), KE::end(v), std::move(predicate)); } -template +template ::value, + int> = 0> auto find_if_not(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::find_if_or_not_impl(label, ex, KE::begin(v), KE::end(v), - std::move(predicate)); + return Impl::find_if_or_not_exespace_impl( + label, ex, KE::begin(v), KE::end(v), std::move(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType find_if_not(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + Predicate predicate) { + return Impl::find_if_or_not_team_impl(teamHandle, first, last, + std::move(predicate)); +} + +template < + typename TeamHandleType, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto find_if_not( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_team_impl( + teamHandle, KE::begin(v), KE::end(v), std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp index d7b08e4842..6215b325af 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp @@ -23,42 +23,83 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + class ExecutionSpace, class IteratorType, class UnaryFunctorType, + std::enable_if_t, int> = 0> UnaryFunctorType for_each(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, UnaryFunctorType functor) { - return Impl::for_each_impl(label, ex, first, last, std::move(functor)); + return Impl::for_each_exespace_impl(label, ex, first, last, + std::move(functor)); } -template +template < + class ExecutionSpace, class IteratorType, class UnaryFunctorType, + std::enable_if_t, int> = 0> UnaryFunctorType for_each(const ExecutionSpace& ex, IteratorType first, IteratorType last, UnaryFunctorType functor) { - return Impl::for_each_impl("Kokkos::for_each_iterator_api_default", ex, first, - last, std::move(functor)); + return Impl::for_each_exespace_impl("Kokkos::for_each_iterator_api_default", + ex, first, last, std::move(functor)); } -template +template < + class ExecutionSpace, class DataType, class... Properties, + class UnaryFunctorType, + std::enable_if_t, int> = 0> UnaryFunctorType for_each(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, UnaryFunctorType functor) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::for_each_impl(label, ex, KE::begin(v), KE::end(v), - std::move(functor)); + return Impl::for_each_exespace_impl(label, ex, KE::begin(v), KE::end(v), + std::move(functor)); } -template +template < + class ExecutionSpace, class DataType, class... Properties, + class UnaryFunctorType, + std::enable_if_t, int> = 0> UnaryFunctorType for_each(const ExecutionSpace& ex, const ::Kokkos::View& v, UnaryFunctorType functor) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::for_each_impl("Kokkos::for_each_view_api_default", ex, - KE::begin(v), KE::end(v), std::move(functor)); + return Impl::for_each_exespace_impl("Kokkos::for_each_view_api_default", ex, + KE::begin(v), KE::end(v), + std::move(functor)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +template , int> = 0> +KOKKOS_FUNCTION UnaryFunctorType for_each(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + UnaryFunctorType functor) { + return Impl::for_each_team_impl(teamHandle, first, last, std::move(functor)); +} + +template , int> = 0> +KOKKOS_FUNCTION UnaryFunctorType +for_each(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_team_impl(teamHandle, KE::begin(v), KE::end(v), + std::move(functor)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp index f1769da05b..e6fbcad891 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp @@ -23,43 +23,87 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + class ExecutionSpace, class IteratorType, class SizeType, + class UnaryFunctorType, + std::enable_if_t, int> = 0> IteratorType for_each_n(const std::string& label, const ExecutionSpace& ex, IteratorType first, SizeType n, UnaryFunctorType functor) { - return Impl::for_each_n_impl(label, ex, first, n, std::move(functor)); + return Impl::for_each_n_exespace_impl(label, ex, first, n, + std::move(functor)); } -template +template < + class ExecutionSpace, class IteratorType, class SizeType, + class UnaryFunctorType, + std::enable_if_t, int> = 0> IteratorType for_each_n(const ExecutionSpace& ex, IteratorType first, SizeType n, UnaryFunctorType functor) { - return Impl::for_each_n_impl("Kokkos::for_each_n_iterator_api_default", ex, - first, n, std::move(functor)); + return Impl::for_each_n_exespace_impl( + "Kokkos::for_each_n_iterator_api_default", ex, first, n, + std::move(functor)); } -template +template < + class ExecutionSpace, class DataType, class... Properties, class SizeType, + class UnaryFunctorType, + std::enable_if_t, int> = 0> auto for_each_n(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, SizeType n, UnaryFunctorType functor) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::for_each_n_impl(label, ex, KE::begin(v), n, std::move(functor)); + return Impl::for_each_n_exespace_impl(label, ex, KE::begin(v), n, + std::move(functor)); } -template +template < + class ExecutionSpace, class DataType, class... Properties, class SizeType, + class UnaryFunctorType, + std::enable_if_t, int> = 0> auto for_each_n(const ExecutionSpace& ex, const ::Kokkos::View& v, SizeType n, UnaryFunctorType functor) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::for_each_n_impl("Kokkos::for_each_n_view_api_default", ex, - KE::begin(v), n, std::move(functor)); + return Impl::for_each_n_exespace_impl("Kokkos::for_each_n_view_api_default", + ex, KE::begin(v), n, + std::move(functor)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +template , int> = 0> +KOKKOS_FUNCTION IteratorType for_each_n(const TeamHandleType& teamHandle, + IteratorType first, SizeType n, + UnaryFunctorType functor) { + return Impl::for_each_n_team_impl(teamHandle, first, n, std::move(functor)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto for_each_n( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, SizeType n, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_n_team_impl(teamHandle, KE::begin(v), n, + std::move(functor)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp index 13e12783e0..a3295084ee 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp @@ -23,38 +23,68 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template , int> = 0> void generate(const ExecutionSpace& ex, IteratorType first, IteratorType last, Generator g) { - Impl::generate_impl("Kokkos::generate_iterator_api_default", ex, first, last, - std::move(g)); + Impl::generate_exespace_impl("Kokkos::generate_iterator_api_default", ex, + first, last, std::move(g)); } -template +template , int> = 0> void generate(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, Generator g) { - Impl::generate_impl(label, ex, first, last, std::move(g)); + Impl::generate_exespace_impl(label, ex, first, last, std::move(g)); } -template +template , int> = 0> void generate(const ExecutionSpace& ex, const ::Kokkos::View& view, Generator g) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - Impl::generate_impl("Kokkos::generate_view_api_default", ex, begin(view), - end(view), std::move(g)); + Impl::generate_exespace_impl("Kokkos::generate_view_api_default", ex, + begin(view), end(view), std::move(g)); } -template +template , int> = 0> void generate(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, Generator g) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - Impl::generate_impl(label, ex, begin(view), end(view), std::move(g)); + Impl::generate_exespace_impl(label, ex, begin(view), end(view), std::move(g)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION void generate(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + Generator g) { + Impl::generate_team_impl(teamHandle, first, last, std::move(g)); +} + +template , int> = 0> +KOKKOS_FUNCTION void generate( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::generate_team_impl(teamHandle, begin(view), end(view), std::move(g)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp index 4d17512228..e480062c23 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp @@ -23,40 +23,75 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template , int> = 0> IteratorType generate_n(const ExecutionSpace& ex, IteratorType first, Size count, Generator g) { - Impl::generate_n_impl("Kokkos::generate_n_iterator_api_default", ex, first, - count, std::move(g)); - return first + count; + return Impl::generate_n_exespace_impl( + "Kokkos::generate_n_iterator_api_default", ex, first, count, + std::move(g)); } -template +template , int> = 0> IteratorType generate_n(const std::string& label, const ExecutionSpace& ex, IteratorType first, Size count, Generator g) { - Impl::generate_n_impl(label, ex, first, count, std::move(g)); - return first + count; + return Impl::generate_n_exespace_impl(label, ex, first, count, std::move(g)); } -template +template , int> = 0> auto generate_n(const ExecutionSpace& ex, const ::Kokkos::View& view, Size count, Generator g) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::generate_n_impl("Kokkos::generate_n_view_api_default", ex, - begin(view), count, std::move(g)); + return Impl::generate_n_exespace_impl("Kokkos::generate_n_view_api_default", + ex, begin(view), count, std::move(g)); } -template +template , int> = 0> auto generate_n(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, Size count, Generator g) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::generate_n_impl(label, ex, begin(view), count, std::move(g)); + return Impl::generate_n_exespace_impl(label, ex, begin(view), count, + std::move(g)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType generate_n(const TeamHandleType& teamHandle, + IteratorType first, Size count, + Generator g) { + return Impl::generate_n_team_impl(teamHandle, first, count, std::move(g)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto generate_n( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, Size count, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + return Impl::generate_n_team_impl(teamHandle, begin(view), count, + std::move(g)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp index bcd731b850..a0e540b5e7 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp @@ -23,33 +23,45 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1 -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest) { - return Impl::inclusive_scan_default_op_impl( +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType inclusive_scan(const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_exespace_impl( "Kokkos::inclusive_scan_default_functors_iterator_api", ex, first, last, first_dest); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -inclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest) { - return Impl::inclusive_scan_default_op_impl(label, ex, first, last, - first_dest); +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType inclusive_scan(const std::string& label, + const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_exespace_impl(label, ex, first, last, + first_dest); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto inclusive_scan( const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -57,13 +69,15 @@ auto inclusive_scan( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::inclusive_scan_default_op_impl( + return Impl::inclusive_scan_default_op_exespace_impl( "Kokkos::inclusive_scan_default_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto inclusive_scan( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -71,39 +85,45 @@ auto inclusive_scan( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::inclusive_scan_default_op_impl(label, ex, KE::cbegin(view_from), - KE::cend(view_from), - KE::begin(view_dest)); + return Impl::inclusive_scan_default_op_exespace_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest)); } // overload set 2 (accepting custom binary op) -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - BinaryOp binary_op) { - return Impl::inclusive_scan_custom_binary_op_impl( +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType inclusive_scan(const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_exespace_impl( "Kokkos::inclusive_scan_custom_functors_iterator_api", ex, first, last, first_dest, binary_op); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -inclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, BinaryOp binary_op) { - return Impl::inclusive_scan_custom_binary_op_impl(label, ex, first, last, - first_dest, binary_op); +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType inclusive_scan( + const std::string& label, const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_exespace_impl( + label, ex, first, last, first_dest, binary_op); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOp, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto inclusive_scan(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -111,14 +131,16 @@ auto inclusive_scan(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::inclusive_scan_custom_binary_op_impl( + return Impl::inclusive_scan_custom_binary_op_exespace_impl( "Kokkos::inclusive_scan_custom_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), binary_op); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOp, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -126,67 +148,192 @@ auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::inclusive_scan_custom_binary_op_impl( + return Impl::inclusive_scan_custom_binary_op_exespace_impl( label, ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), binary_op); } // overload set 3 -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - BinaryOp binary_op, ValueType init_value) { - return Impl::inclusive_scan_custom_binary_op_impl( +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType inclusive_scan(const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + BinaryOp binary_op, ValueType init_value) { + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + return Impl::inclusive_scan_custom_binary_op_exespace_impl( "Kokkos::inclusive_scan_custom_functors_iterator_api", ex, first, last, - first_dest, binary_op, init_value); + first_dest, binary_op, std::move(init_value)); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -inclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, BinaryOp binary_op, - ValueType init_value) { - return Impl::inclusive_scan_custom_binary_op_impl( - label, ex, first, last, first_dest, binary_op, init_value); +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType inclusive_scan(const std::string& label, + const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + BinaryOp binary_op, ValueType init_value) { + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + return Impl::inclusive_scan_custom_binary_op_exespace_impl( + label, ex, first, last, first_dest, binary_op, std::move(init_value)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOp, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto inclusive_scan(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, BinaryOp binary_op, ValueType init_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; - return Impl::inclusive_scan_custom_binary_op_impl( + return Impl::inclusive_scan_custom_binary_op_exespace_impl( "Kokkos::inclusive_scan_custom_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), - binary_op, init_value); + binary_op, std::move(init_value)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOp, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, BinaryOp binary_op, ValueType init_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; - return Impl::inclusive_scan_custom_binary_op_impl( + return Impl::inclusive_scan_custom_binary_op_exespace_impl( label, ex, KE::cbegin(view_from), KE::cend(view_from), - KE::begin(view_dest), binary_op, init_value); + KE::begin(view_dest), binary_op, std::move(init_value)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1 +template && :: + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType +inclusive_scan(const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_team_impl(teamHandle, first, last, + first_dest); +} + +template , int> = 0> +KOKKOS_FUNCTION auto inclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_default_op_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest)); +} + +// overload set 2 (accepting custom binary op) +template && :: + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType inclusive_scan( + const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_team_impl( + teamHandle, first, last, first_dest, binary_op); +} + +template , int> = 0> +KOKKOS_FUNCTION auto inclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op); +} + +// overload set 3 +template && :: + Kokkos::is_team_handle_v, + int> = 0> + +KOKKOS_FUNCTION OutputIteratorType +inclusive_scan(const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOp binary_op, ValueType init_value) { + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + return Impl::inclusive_scan_custom_binary_op_team_impl( + teamHandle, first, last, first_dest, binary_op, std::move(init_value)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto inclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op, ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op, std::move(init_value)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp index 29d6be9e8b..42f20bc4ec 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp @@ -23,39 +23,78 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_partitioned(const ExecutionSpace& ex, IteratorType first, IteratorType last, PredicateType p) { - return Impl::is_partitioned_impl( + return Impl::is_partitioned_exespace_impl( "Kokkos::is_partitioned_iterator_api_default", ex, first, last, std::move(p)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_partitioned(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, PredicateType p) { - return Impl::is_partitioned_impl(label, ex, first, last, std::move(p)); + return Impl::is_partitioned_exespace_impl(label, ex, first, last, + std::move(p)); } -template +template < + typename ExecutionSpace, typename PredicateType, typename DataType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_partitioned(const ExecutionSpace& ex, const ::Kokkos::View& v, PredicateType p) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::is_partitioned_impl("Kokkos::is_partitioned_view_api_default", - ex, cbegin(v), cend(v), std::move(p)); + return Impl::is_partitioned_exespace_impl( + "Kokkos::is_partitioned_view_api_default", ex, cbegin(v), cend(v), + std::move(p)); } -template +template < + typename ExecutionSpace, typename PredicateType, typename DataType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_partitioned(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, PredicateType p) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::is_partitioned_impl(label, ex, cbegin(v), cend(v), std::move(p)); + return Impl::is_partitioned_exespace_impl(label, ex, cbegin(v), cend(v), + std::move(p)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION bool is_partitioned(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + PredicateType p) { + return Impl::is_partitioned_team_impl(teamHandle, first, last, std::move(p)); +} + +template , int> = 0> +KOKKOS_FUNCTION bool is_partitioned( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, PredicateType p) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + return Impl::is_partitioned_team_impl(teamHandle, cbegin(v), cend(v), + std::move(p)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp index f036254a02..2c676c3ff3 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp @@ -23,55 +23,73 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::is_sorted_impl("Kokkos::is_sorted_iterator_api_default", ex, - first, last); + return Impl::is_sorted_exespace_impl("Kokkos::is_sorted_iterator_api_default", + ex, first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::is_sorted_impl(label, ex, first, last); + return Impl::is_sorted_exespace_impl(label, ex, first, last); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_impl("Kokkos::is_sorted_view_api_default", ex, - KE::cbegin(view), KE::cend(view)); + return Impl::is_sorted_exespace_impl("Kokkos::is_sorted_view_api_default", ex, + KE::cbegin(view), KE::cend(view)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_impl(label, ex, KE::cbegin(view), KE::cend(view)); + return Impl::is_sorted_exespace_impl(label, ex, KE::cbegin(view), + KE::cend(view)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::is_sorted_impl("Kokkos::is_sorted_iterator_api_default", ex, - first, last, std::move(comp)); + return Impl::is_sorted_exespace_impl("Kokkos::is_sorted_iterator_api_default", + ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::is_sorted_impl(label, ex, first, last, std::move(comp)); + return Impl::is_sorted_exespace_impl(label, ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const ExecutionSpace& ex, const ::Kokkos::View& view, ComparatorType comp) { @@ -79,13 +97,15 @@ bool is_sorted(const ExecutionSpace& ex, Impl::static_assert_is_not_openmptarget(ex); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_impl("Kokkos::is_sorted_view_api_default", ex, - KE::cbegin(view), KE::cend(view), - std::move(comp)); + return Impl::is_sorted_exespace_impl("Kokkos::is_sorted_view_api_default", ex, + KE::cbegin(view), KE::cend(view), + std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool is_sorted(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, ComparatorType comp) { @@ -93,8 +113,56 @@ bool is_sorted(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_not_openmptarget(ex); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_impl(label, ex, KE::cbegin(view), KE::cend(view), - std::move(comp)); + return Impl::is_sorted_exespace_impl(label, ex, KE::cbegin(view), + KE::cend(view), std::move(comp)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION bool is_sorted(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last) { + return Impl::is_sorted_team_impl(teamHandle, first, last); +} + +template , int> = 0> +KOKKOS_FUNCTION bool is_sorted( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_team_impl(teamHandle, KE::cbegin(view), + KE::cend(view)); +} + +template , int> = 0> +KOKKOS_FUNCTION bool is_sorted(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(teamHandle); + return Impl::is_sorted_team_impl(teamHandle, first, last, std::move(comp)); +} + +template , int> = 0> +KOKKOS_FUNCTION bool is_sorted( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(teamHandle); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_team_impl(teamHandle, KE::cbegin(view), KE::cend(view), + std::move(comp)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp index 276b3bb884..96a17b6785 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp @@ -23,58 +23,78 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType is_sorted_until(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::is_sorted_until_impl( + return Impl::is_sorted_until_exespace_impl( "Kokkos::is_sorted_until_iterator_api_default", ex, first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType is_sorted_until(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::is_sorted_until_impl(label, ex, first, last); + return Impl::is_sorted_until_exespace_impl(label, ex, first, last); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto is_sorted_until(const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_until_impl("Kokkos::is_sorted_until_view_api_default", - ex, KE::begin(view), KE::end(view)); + return Impl::is_sorted_until_exespace_impl( + "Kokkos::is_sorted_until_view_api_default", ex, KE::begin(view), + KE::end(view)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_until_impl(label, ex, KE::begin(view), KE::end(view)); + return Impl::is_sorted_until_exespace_impl(label, ex, KE::begin(view), + KE::end(view)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType is_sorted_until(const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::is_sorted_until_impl( + return Impl::is_sorted_until_exespace_impl( "Kokkos::is_sorted_until_iterator_api_default", ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType is_sorted_until(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::is_sorted_until_impl(label, ex, first, last, std::move(comp)); + return Impl::is_sorted_until_exespace_impl(label, ex, first, last, + std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto is_sorted_until(const ExecutionSpace& ex, const ::Kokkos::View& view, ComparatorType comp) { @@ -82,13 +102,15 @@ auto is_sorted_until(const ExecutionSpace& ex, Impl::static_assert_is_not_openmptarget(ex); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_until_impl("Kokkos::is_sorted_until_view_api_default", - ex, KE::begin(view), KE::end(view), - std::move(comp)); + return Impl::is_sorted_until_exespace_impl( + "Kokkos::is_sorted_until_view_api_default", ex, KE::begin(view), + KE::end(view), std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, ComparatorType comp) { @@ -96,8 +118,57 @@ auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_not_openmptarget(ex); namespace KE = ::Kokkos::Experimental; - return Impl::is_sorted_until_impl(label, ex, KE::begin(view), KE::end(view), - std::move(comp)); + return Impl::is_sorted_until_exespace_impl(label, ex, KE::begin(view), + KE::end(view), std::move(comp)); +} + +// +// overload set accepting team handle +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType is_sorted_until(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last) { + return Impl::is_sorted_until_team_impl(teamHandle, first, last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto is_sorted_until( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_team_impl(teamHandle, KE::begin(view), + KE::end(view)); +} + +template , int> = 0> +KOKKOS_FUNCTION IteratorType is_sorted_until(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(teamHandle); + return Impl::is_sorted_until_team_impl(teamHandle, first, last, + std::move(comp)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto is_sorted_until( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(teamHandle); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_team_impl(teamHandle, KE::begin(view), + KE::end(view), std::move(comp)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp index 0a77ef629f..4b5c69df45 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp @@ -23,25 +23,34 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + std::enable_if_t, int> = 0> bool lexicographical_compare(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { - return Impl::lexicographical_compare_impl( + return Impl::lexicographical_compare_exespace_impl( "Kokkos::lexicographical_compare_iterator_api_default", ex, first1, last1, first2, last2); } -template +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + std::enable_if_t, int> = 0> bool lexicographical_compare(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { - return Impl::lexicographical_compare_impl(label, ex, first1, last1, first2, - last2); + return Impl::lexicographical_compare_exespace_impl(label, ex, first1, last1, + first2, last2); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, + std::enable_if_t, int> = 0> bool lexicographical_compare( const ExecutionSpace& ex, const ::Kokkos::View& view1, @@ -50,13 +59,15 @@ bool lexicographical_compare( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::lexicographical_compare_impl( + return Impl::lexicographical_compare_exespace_impl( "Kokkos::lexicographical_compare_view_api_default", ex, KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), KE::cend(view2)); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, + std::enable_if_t, int> = 0> bool lexicographical_compare( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view1, @@ -65,33 +76,39 @@ bool lexicographical_compare( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::lexicographical_compare_impl(label, ex, KE::cbegin(view1), - KE::cend(view1), KE::cbegin(view2), - KE::cend(view2)); + return Impl::lexicographical_compare_exespace_impl( + label, ex, KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), + KE::cend(view2)); } -template +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + class ComparatorType, + std::enable_if_t, int> = 0> bool lexicographical_compare(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, ComparatorType comp) { - return Impl::lexicographical_compare_impl( + return Impl::lexicographical_compare_exespace_impl( "Kokkos::lexicographical_compare_iterator_api_default", ex, first1, last1, first2, last2, comp); } -template +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + class ComparatorType, + std::enable_if_t, int> = 0> bool lexicographical_compare(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, ComparatorType comp) { - return Impl::lexicographical_compare_impl(label, ex, first1, last1, first2, - last2, comp); + return Impl::lexicographical_compare_exespace_impl(label, ex, first1, last1, + first2, last2, comp); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, class ComparatorType, + std::enable_if_t, int> = 0> bool lexicographical_compare( const ExecutionSpace& ex, const ::Kokkos::View& view1, @@ -100,13 +117,15 @@ bool lexicographical_compare( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::lexicographical_compare_impl( + return Impl::lexicographical_compare_exespace_impl( "Kokkos::lexicographical_compare_view_api_default", ex, KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), KE::cend(view2), comp); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, class ComparatorType, + std::enable_if_t, int> = 0> bool lexicographical_compare( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view1, @@ -115,9 +134,67 @@ bool lexicographical_compare( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::lexicographical_compare_impl(label, ex, KE::cbegin(view1), - KE::cend(view1), KE::cbegin(view2), - KE::cend(view2), comp); + return Impl::lexicographical_compare_exespace_impl( + label, ex, KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), + KE::cend(view2), comp); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION bool lexicographical_compare(const TeamHandleType& teamHandle, + IteratorType1 first1, + IteratorType1 last1, + IteratorType2 first2, + IteratorType2 last2) { + return Impl::lexicographical_compare_team_impl(teamHandle, first1, last1, + first2, last2); +} + +template , int> = 0> +KOKKOS_FUNCTION bool lexicographical_compare( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_team_impl( + teamHandle, KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), + KE::cend(view2)); +} + +template , int> = 0> +KOKKOS_FUNCTION bool lexicographical_compare( + const TeamHandleType& teamHandle, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, ComparatorType comp) { + return Impl::lexicographical_compare_team_impl(teamHandle, first1, last1, + first2, last2, comp); +} + +template , int> = 0> +KOKKOS_FUNCTION bool lexicographical_compare( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_team_impl( + teamHandle, KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), + KE::cend(view2), comp); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp index 2c1374f700..d16bac5bfc 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp @@ -23,81 +23,148 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::max_element_iterator_api_default", ex, first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::min_or_max_element_impl(label, ex, first, last); + return Impl::min_or_max_element_exespace_impl(label, ex, first, + last); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::max_element_iterator_api_default", ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( label, ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::max_element_view_api_default", ex, begin(v), end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::min_or_max_element_impl(label, ex, begin(v), - end(v)); + return Impl::min_or_max_element_exespace_impl(label, ex, + begin(v), end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename ComparatorType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const ExecutionSpace& ex, const ::Kokkos::View& v, ComparatorType comp) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::max_element_view_api_default", ex, begin(v), end(v), std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename ComparatorType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto max_element(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, ComparatorType comp) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( label, ex, begin(v), end(v), std::move(comp)); } +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION auto max_element(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last) { + return Impl::min_or_max_element_team_impl(teamHandle, first, + last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto max_element( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_team_impl(teamHandle, begin(v), + end(v)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto max_element(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(teamHandle); + return Impl::min_or_max_element_team_impl( + teamHandle, first, last, std::move(comp)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto max_element( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(teamHandle); + return Impl::min_or_max_element_team_impl( + teamHandle, begin(v), end(v), std::move(comp)); +} + } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp index 1d03b7c962..2a53fce3e2 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp @@ -23,81 +23,148 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::min_element_iterator_api_default", ex, first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::min_or_max_element_impl(label, ex, first, last); + return Impl::min_or_max_element_exespace_impl(label, ex, first, + last); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::min_element_iterator_api_default", ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( label, ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::min_element_view_api_default", ex, begin(v), end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename ComparatorType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const ExecutionSpace& ex, const ::Kokkos::View& v, ComparatorType comp) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( "Kokkos::min_element_view_api_default", ex, begin(v), end(v), std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::min_or_max_element_impl(label, ex, begin(v), - end(v)); + return Impl::min_or_max_element_exespace_impl(label, ex, + begin(v), end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename ComparatorType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto min_element(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, ComparatorType comp) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); Impl::static_assert_is_not_openmptarget(ex); - return Impl::min_or_max_element_impl( + return Impl::min_or_max_element_exespace_impl( label, ex, begin(v), end(v), std::move(comp)); } +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION auto min_element(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last) { + return Impl::min_or_max_element_team_impl(teamHandle, first, + last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto min_element( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_team_impl(teamHandle, begin(v), + end(v)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto min_element(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(teamHandle); + return Impl::min_or_max_element_team_impl( + teamHandle, first, last, std::move(comp)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto min_element( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(teamHandle); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + return Impl::min_or_max_element_team_impl( + teamHandle, begin(v), end(v), std::move(comp)); +} + } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp index d481b499cc..c3a1f73ef6 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp @@ -23,82 +23,151 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::minmax_element_impl( + return Impl::minmax_element_exespace_impl( "Kokkos::minmax_element_iterator_api_default", ex, first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::minmax_element_impl(label, ex, first, last); + return Impl::minmax_element_exespace_impl(label, ex, + first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::minmax_element_impl( + return Impl::minmax_element_exespace_impl( "Kokkos::minmax_element_iterator_api_default", ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename ComparatorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ComparatorType comp) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::minmax_element_impl( + return Impl::minmax_element_exespace_impl( label, ex, first, last, std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::minmax_element_impl( + return Impl::minmax_element_exespace_impl( "Kokkos::minmax_element_view_api_default", ex, begin(v), end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::minmax_element_impl(label, ex, begin(v), - end(v)); + return Impl::minmax_element_exespace_impl( + label, ex, begin(v), end(v)); } -template +template < + typename ExecutionSpace, typename DataType, typename ComparatorType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const ExecutionSpace& ex, const ::Kokkos::View& v, ComparatorType comp) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); Impl::static_assert_is_not_openmptarget(ex); - return Impl::minmax_element_impl( + return Impl::minmax_element_exespace_impl( "Kokkos::minmax_element_view_api_default", ex, begin(v), end(v), std::move(comp)); } -template +template < + typename ExecutionSpace, typename DataType, typename ComparatorType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto minmax_element(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, ComparatorType comp) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); Impl::static_assert_is_not_openmptarget(ex); - return Impl::minmax_element_impl( + return Impl::minmax_element_exespace_impl( label, ex, begin(v), end(v), std::move(comp)); } +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION auto minmax_element(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last) { + return Impl::minmax_element_team_impl(teamHandle, first, + last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto minmax_element(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(teamHandle); + + return Impl::minmax_element_team_impl( + teamHandle, first, last, std::move(comp)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto minmax_element( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::minmax_element_team_impl(teamHandle, + begin(v), end(v)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto minmax_element( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(teamHandle); + + return Impl::minmax_element_team_impl( + teamHandle, begin(v), end(v), std::move(comp)); +} + } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Mismatch.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Mismatch.hpp index 13c994ca90..090afe69e3 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Mismatch.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Mismatch.hpp @@ -30,46 +30,60 @@ namespace Experimental { // // makes API ambiguous (with the overload accepting views). -template +// +// overload set accepting execution space +// +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + std::enable_if_t, int> = 0> ::Kokkos::pair mismatch(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { - return Impl::mismatch_impl("Kokkos::mismatch_iterator_api_default", ex, - first1, last1, first2, last2); + return Impl::mismatch_exespace_impl("Kokkos::mismatch_iterator_api_default", + ex, first1, last1, first2, last2); } -template +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + class BinaryPredicateType, + std::enable_if_t, int> = 0> ::Kokkos::pair mismatch( const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, BinaryPredicateType&& predicate) { - return Impl::mismatch_impl("Kokkos::mismatch_iterator_api_default", ex, - first1, last1, first2, last2, - std::forward(predicate)); + return Impl::mismatch_exespace_impl( + "Kokkos::mismatch_iterator_api_default", ex, first1, last1, first2, last2, + std::forward(predicate)); } -template +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + std::enable_if_t, int> = 0> ::Kokkos::pair mismatch( const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { - return Impl::mismatch_impl(label, ex, first1, last1, first2, last2); + return Impl::mismatch_exespace_impl(label, ex, first1, last1, first2, last2); } -template +template < + class ExecutionSpace, class IteratorType1, class IteratorType2, + class BinaryPredicateType, + std::enable_if_t, int> = 0> ::Kokkos::pair mismatch( const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, BinaryPredicateType&& predicate) { - return Impl::mismatch_impl(label, ex, first1, last1, first2, last2, - std::forward(predicate)); + return Impl::mismatch_exespace_impl( + label, ex, first1, last1, first2, last2, + std::forward(predicate)); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, + std::enable_if_t, int> = 0> auto mismatch(const ExecutionSpace& ex, const ::Kokkos::View& view1, const ::Kokkos::View& view2) { @@ -77,13 +91,15 @@ auto mismatch(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::mismatch_impl("Kokkos::mismatch_view_api_default", ex, - KE::begin(view1), KE::end(view1), KE::begin(view2), - KE::end(view2)); + return Impl::mismatch_exespace_impl("Kokkos::mismatch_view_api_default", ex, + KE::begin(view1), KE::end(view1), + KE::begin(view2), KE::end(view2)); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, class BinaryPredicateType, + std::enable_if_t, int> = 0> auto mismatch(const ExecutionSpace& ex, const ::Kokkos::View& view1, const ::Kokkos::View& view2, @@ -92,14 +108,16 @@ auto mismatch(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::mismatch_impl("Kokkos::mismatch_view_api_default", ex, - KE::begin(view1), KE::end(view1), KE::begin(view2), - KE::end(view2), - std::forward(predicate)); + return Impl::mismatch_exespace_impl( + "Kokkos::mismatch_view_api_default", ex, KE::begin(view1), KE::end(view1), + KE::begin(view2), KE::end(view2), + std::forward(predicate)); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, + std::enable_if_t, int> = 0> auto mismatch(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view1, const ::Kokkos::View& view2) { @@ -107,12 +125,15 @@ auto mismatch(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::mismatch_impl(label, ex, KE::begin(view1), KE::end(view1), - KE::begin(view2), KE::end(view2)); + return Impl::mismatch_exespace_impl(label, ex, KE::begin(view1), + KE::end(view1), KE::begin(view2), + KE::end(view2)); } -template +template < + class ExecutionSpace, class DataType1, class... Properties1, + class DataType2, class... Properties2, class BinaryPredicateType, + std::enable_if_t, int> = 0> auto mismatch(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view1, const ::Kokkos::View& view2, @@ -121,9 +142,65 @@ auto mismatch(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); namespace KE = ::Kokkos::Experimental; - return Impl::mismatch_impl(label, ex, KE::begin(view1), KE::end(view1), - KE::begin(view2), KE::end(view2), - std::forward(predicate)); + return Impl::mismatch_exespace_impl( + label, ex, KE::begin(view1), KE::end(view1), KE::begin(view2), + KE::end(view2), std::forward(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION ::Kokkos::pair mismatch( + const TeamHandleType& teamHandle, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::mismatch_team_impl(teamHandle, first1, last1, first2, last2); +} + +template , int> = 0> +KOKKOS_FUNCTION ::Kokkos::pair mismatch( + const TeamHandleType& teamHandle, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType&& predicate) { + return Impl::mismatch_team_impl(teamHandle, first1, last1, first2, last2, + std::forward(predicate)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto mismatch( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view1, + const ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::mismatch_team_impl(teamHandle, KE::begin(view1), KE::end(view1), + KE::begin(view2), KE::end(view2)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto mismatch( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view1, + const ::Kokkos::View& view2, + BinaryPredicateType&& predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::mismatch_team_impl(teamHandle, KE::begin(view1), KE::end(view1), + KE::begin(view2), KE::end(view2), + std::forward(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Move.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Move.hpp index d49acd9f70..f04ea12ba8 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Move.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Move.hpp @@ -23,41 +23,81 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator move(const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::move_impl("Kokkos::move_iterator_api_default", ex, first, last, - d_first); + return Impl::move_exespace_impl("Kokkos::move_iterator_api_default", ex, + first, last, d_first); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator move(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::move_impl(label, ex, first, last, d_first); + return Impl::move_exespace_impl(label, ex, first, last, d_first); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto move(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::move_impl("Kokkos::move_view_api_default", ex, begin(source), - end(source), begin(dest)); + return Impl::move_exespace_impl("Kokkos::move_view_api_default", ex, + begin(source), end(source), begin(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto move(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::move_impl(label, ex, begin(source), end(source), begin(dest)); + return Impl::move_exespace_impl(label, ex, begin(source), end(source), + begin(dest)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator move(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + OutputIterator d_first) { + return Impl::move_team_impl(teamHandle, first, last, d_first); +} + +template , int> = 0> +KOKKOS_FUNCTION auto move( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::move_team_impl(teamHandle, begin(source), end(source), + begin(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MoveBackward.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MoveBackward.hpp index 60d50fa881..375474ca57 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MoveBackward.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MoveBackward.hpp @@ -23,42 +23,83 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType2 move_backward(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 d_last) { - return Impl::move_backward_impl("Kokkos::move_backward_iterator_api_default", - ex, first, last, d_last); + return Impl::move_backward_exespace_impl( + "Kokkos::move_backward_iterator_api_default", ex, first, last, d_last); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto move_backward(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::move_backward_impl("Kokkos::move_backward_view_api_default", ex, - begin(source), end(source), end(dest)); + return Impl::move_backward_exespace_impl( + "Kokkos::move_backward_view_api_default", ex, begin(source), end(source), + end(dest)); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType2 move_backward(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 d_last) { - return Impl::move_backward_impl(label, ex, first, last, d_last); + return Impl::move_backward_exespace_impl(label, ex, first, last, d_last); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto move_backward(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::move_backward_impl(label, ex, begin(source), end(source), - end(dest)); + return Impl::move_backward_exespace_impl(label, ex, begin(source), + end(source), end(dest)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType2 move_backward(const TeamHandleType& teamHandle, + IteratorType1 first, + IteratorType1 last, + IteratorType2 d_last) { + return Impl::move_backward_team_impl(teamHandle, first, last, d_last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto move_backward( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::move_backward_team_impl(teamHandle, begin(source), end(source), + end(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_NoneOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_NoneOf.hpp index cf5de3b72b..f7baab3fc0 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_NoneOf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_NoneOf.hpp @@ -23,41 +23,80 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool none_of(const ExecutionSpace& ex, IteratorType first, IteratorType last, Predicate predicate) { - return Impl::none_of_impl("Kokkos::none_of_iterator_api_default", ex, first, - last, predicate); + return Impl::none_of_exespace_impl("Kokkos::none_of_iterator_api_default", ex, + first, last, predicate); } -template +template < + typename ExecutionSpace, typename IteratorType, typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool none_of(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, Predicate predicate) { - return Impl::none_of_impl(label, ex, first, last, predicate); + return Impl::none_of_exespace_impl(label, ex, first, last, predicate); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool none_of(const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::none_of_impl("Kokkos::none_of_view_api_default", ex, - KE::cbegin(v), KE::cend(v), std::move(predicate)); + return Impl::none_of_exespace_impl("Kokkos::none_of_view_api_default", ex, + KE::cbegin(v), KE::cend(v), + std::move(predicate)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename Predicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> bool none_of(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, Predicate predicate) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); namespace KE = ::Kokkos::Experimental; - return Impl::none_of_impl(label, ex, KE::cbegin(v), KE::cend(v), - std::move(predicate)); + return Impl::none_of_exespace_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template +KOKKOS_FUNCTION + std::enable_if_t<::Kokkos::is_team_handle::value, bool> + none_of(const TeamHandleType& teamHandle, IteratorType first, + IteratorType last, Predicate predicate) { + return Impl::none_of_team_impl(teamHandle, first, last, predicate); +} + +template +KOKKOS_FUNCTION + std::enable_if_t<::Kokkos::is_team_handle::value, bool> + none_of(const TeamHandleType& teamHandle, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::none_of_team_impl(teamHandle, KE::cbegin(v), KE::cend(v), + std::move(predicate)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionCopy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionCopy.hpp index 38c0a35b62..a1feee8d6d 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionCopy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionCopy.hpp @@ -23,57 +23,103 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIteratorType, + typename OutputIteratorTrueType, typename OutputIteratorFalseType, + typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> ::Kokkos::pair partition_copy( const ExecutionSpace& ex, InputIteratorType from_first, InputIteratorType from_last, OutputIteratorTrueType to_first_true, OutputIteratorFalseType to_first_false, PredicateType p) { - return Impl::partition_copy_impl( + return Impl::partition_copy_exespace_impl( "Kokkos::partition_copy_iterator_api_default", ex, from_first, from_last, to_first_true, to_first_false, std::move(p)); } -template +template < + typename ExecutionSpace, typename InputIteratorType, + typename OutputIteratorTrueType, typename OutputIteratorFalseType, + typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> ::Kokkos::pair partition_copy( const std::string& label, const ExecutionSpace& ex, InputIteratorType from_first, InputIteratorType from_last, OutputIteratorTrueType to_first_true, OutputIteratorFalseType to_first_false, PredicateType p) { - return Impl::partition_copy_impl(label, ex, from_first, from_last, - to_first_true, to_first_false, std::move(p)); + return Impl::partition_copy_exespace_impl(label, ex, from_first, from_last, + to_first_true, to_first_false, + std::move(p)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename DataType3, + typename... Properties3, typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto partition_copy( const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest_true, const ::Kokkos::View& view_dest_false, PredicateType p) { - return Impl::partition_copy_impl("Kokkos::partition_copy_view_api_default", - ex, cbegin(view_from), cend(view_from), - begin(view_dest_true), - begin(view_dest_false), std::move(p)); + return Impl::partition_copy_exespace_impl( + "Kokkos::partition_copy_view_api_default", ex, cbegin(view_from), + cend(view_from), begin(view_dest_true), begin(view_dest_false), + std::move(p)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename DataType3, + typename... Properties3, typename PredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto partition_copy( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest_true, const ::Kokkos::View& view_dest_false, PredicateType p) { - return Impl::partition_copy_impl(label, ex, cbegin(view_from), - cend(view_from), begin(view_dest_true), - begin(view_dest_false), std::move(p)); + return Impl::partition_copy_exespace_impl( + label, ex, cbegin(view_from), cend(view_from), begin(view_dest_true), + begin(view_dest_false), std::move(p)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION ::Kokkos::pair +partition_copy(const TeamHandleType& teamHandle, InputIteratorType from_first, + InputIteratorType from_last, + OutputIteratorTrueType to_first_true, + OutputIteratorFalseType to_first_false, PredicateType p) { + return Impl::partition_copy_team_impl(teamHandle, from_first, from_last, + to_first_true, to_first_false, + std::move(p)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto partition_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest_true, + const ::Kokkos::View& view_dest_false, + PredicateType p) { + return Impl::partition_copy_team_impl(teamHandle, cbegin(view_from), + cend(view_from), begin(view_dest_true), + begin(view_dest_false), std::move(p)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionPoint.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionPoint.hpp index 24798e377e..60cbeeda87 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionPoint.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionPoint.hpp @@ -23,38 +23,78 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType partition_point(const ExecutionSpace& ex, IteratorType first, IteratorType last, UnaryPredicate p) { - return Impl::partition_point_impl( + return Impl::partition_point_exespace_impl( "Kokkos::partitioned_point_iterator_api_default", ex, first, last, std::move(p)); } -template +template < + typename ExecutionSpace, typename IteratorType, typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType partition_point(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, UnaryPredicate p) { - return Impl::partition_point_impl(label, ex, first, last, std::move(p)); + return Impl::partition_point_exespace_impl(label, ex, first, last, + std::move(p)); } -template +template < + typename ExecutionSpace, typename UnaryPredicate, typename DataType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto partition_point(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& v, UnaryPredicate p) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::partition_point_impl(label, ex, begin(v), end(v), std::move(p)); + return Impl::partition_point_exespace_impl(label, ex, begin(v), end(v), + std::move(p)); } -template +template < + typename ExecutionSpace, typename UnaryPredicate, typename DataType, + typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto partition_point(const ExecutionSpace& ex, const ::Kokkos::View& v, UnaryPredicate p) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); - return Impl::partition_point_impl("Kokkos::partition_point_view_api_default", - ex, begin(v), end(v), std::move(p)); + return Impl::partition_point_exespace_impl( + "Kokkos::partition_point_view_api_default", ex, begin(v), end(v), + std::move(p)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType partition_point(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last, + UnaryPredicate p) { + return Impl::partition_point_team_impl(teamHandle, first, last, std::move(p)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto partition_point( + const TeamHandleType& teamHandle, + const ::Kokkos::View& v, UnaryPredicate p) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + return Impl::partition_point_team_impl(teamHandle, begin(v), end(v), + std::move(p)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reduce.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reduce.hpp index a31fa1497a..b84f00f8bb 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reduce.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reduce.hpp @@ -23,28 +23,38 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // // overload set 1 // -template +template ::value, + int> = 0> typename IteratorType::value_type reduce(const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::reduce_default_functors_impl( + return Impl::reduce_default_functors_exespace_impl( "Kokkos::reduce_default_functors_iterator_api", ex, first, last, typename IteratorType::value_type()); } -template +template ::value, + int> = 0> typename IteratorType::value_type reduce(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::reduce_default_functors_impl( + return Impl::reduce_default_functors_exespace_impl( label, ex, first, last, typename IteratorType::value_type()); } -template +template ::value, + int> = 0> auto reduce(const ExecutionSpace& ex, const ::Kokkos::View& view) { namespace KE = ::Kokkos::Experimental; @@ -53,12 +63,14 @@ auto reduce(const ExecutionSpace& ex, using view_type = ::Kokkos::View; using value_type = typename view_type::value_type; - return Impl::reduce_default_functors_impl( + return Impl::reduce_default_functors_exespace_impl( "Kokkos::reduce_default_functors_view_api", ex, KE::cbegin(view), KE::cend(view), value_type()); } -template +template ::value, + int> = 0> auto reduce(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view) { namespace KE = ::Kokkos::Experimental; @@ -67,37 +79,43 @@ auto reduce(const std::string& label, const ExecutionSpace& ex, using view_type = ::Kokkos::View; using value_type = typename view_type::value_type; - return Impl::reduce_default_functors_impl(label, ex, KE::cbegin(view), - KE::cend(view), value_type()); + return Impl::reduce_default_functors_exespace_impl( + label, ex, KE::cbegin(view), KE::cend(view), value_type()); } // // overload set2: // -template +template ::value, + int> = 0> ValueType reduce(const ExecutionSpace& ex, IteratorType first, IteratorType last, ValueType init_reduction_value) { static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::reduce_default_functors_impl( + return Impl::reduce_default_functors_exespace_impl( "Kokkos::reduce_default_functors_iterator_api", ex, first, last, init_reduction_value); } -template +template ::value, + int> = 0> ValueType reduce(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ValueType init_reduction_value) { static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::reduce_default_functors_impl(label, ex, first, last, - init_reduction_value); + return Impl::reduce_default_functors_exespace_impl(label, ex, first, last, + init_reduction_value); } -template +template ::value, + int> = 0> ValueType reduce(const ExecutionSpace& ex, const ::Kokkos::View& view, ValueType init_reduction_value) { @@ -107,13 +125,15 @@ ValueType reduce(const ExecutionSpace& ex, namespace KE = ::Kokkos::Experimental; Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::reduce_default_functors_impl( + return Impl::reduce_default_functors_exespace_impl( "Kokkos::reduce_default_functors_view_api", ex, KE::cbegin(view), KE::cend(view), init_reduction_value); } -template +template ::value, + int> = 0> ValueType reduce(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, ValueType init_reduction_value) { @@ -123,40 +143,46 @@ ValueType reduce(const std::string& label, const ExecutionSpace& ex, namespace KE = ::Kokkos::Experimental; Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::reduce_default_functors_impl( + return Impl::reduce_default_functors_exespace_impl( label, ex, KE::cbegin(view), KE::cend(view), init_reduction_value); } // // overload set 3 // -template +template ::value, + int> = 0> ValueType reduce(const ExecutionSpace& ex, IteratorType first, IteratorType last, ValueType init_reduction_value, BinaryOp joiner) { static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::reduce_custom_functors_impl( + return Impl::reduce_custom_functors_exespace_impl( "Kokkos::reduce_default_functors_iterator_api", ex, first, last, init_reduction_value, joiner); } -template +template ::value, + int> = 0> ValueType reduce(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, ValueType init_reduction_value, BinaryOp joiner) { static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::reduce_custom_functors_impl(label, ex, first, last, - init_reduction_value, joiner); + return Impl::reduce_custom_functors_exespace_impl( + label, ex, first, last, init_reduction_value, joiner); } -template +template ::value, + int> = 0> ValueType reduce(const ExecutionSpace& ex, const ::Kokkos::View& view, ValueType init_reduction_value, BinaryOp joiner) { @@ -166,13 +192,15 @@ ValueType reduce(const ExecutionSpace& ex, namespace KE = ::Kokkos::Experimental; Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::reduce_custom_functors_impl( + return Impl::reduce_custom_functors_exespace_impl( "Kokkos::reduce_custom_functors_view_api", ex, KE::cbegin(view), KE::cend(view), init_reduction_value, joiner); } -template +template ::value, + int> = 0> ValueType reduce(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, ValueType init_reduction_value, BinaryOp joiner) { @@ -182,9 +210,114 @@ ValueType reduce(const std::string& label, const ExecutionSpace& ex, namespace KE = ::Kokkos::Experimental; Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::reduce_custom_functors_impl(label, ex, KE::cbegin(view), - KE::cend(view), init_reduction_value, - joiner); + return Impl::reduce_custom_functors_exespace_impl( + label, ex, KE::cbegin(view), KE::cend(view), init_reduction_value, + joiner); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// +// overload set 1 +// +template < + typename TeamHandleType, typename IteratorType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION typename IteratorType::value_type reduce( + const TeamHandleType& teamHandle, IteratorType first, IteratorType last) { + return Impl::reduce_default_functors_team_impl( + teamHandle, first, last, typename IteratorType::value_type()); +} + +template < + typename TeamHandleType, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto reduce( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view) { + namespace KE = ::Kokkos::Experimental; + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + using view_type = ::Kokkos::View; + using value_type = typename view_type::value_type; + + return Impl::reduce_default_functors_team_impl(teamHandle, KE::cbegin(view), + KE::cend(view), value_type()); +} + +// +// overload set2: +// +template < + typename TeamHandleType, typename IteratorType, typename ValueType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType reduce(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ValueType init_reduction_value) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + return Impl::reduce_default_functors_team_impl(teamHandle, first, last, + init_reduction_value); +} + +template < + typename TeamHandleType, typename DataType, typename... Properties, + typename ValueType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType +reduce(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + ValueType init_reduction_value) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + namespace KE = ::Kokkos::Experimental; + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::reduce_default_functors_team_impl( + teamHandle, KE::cbegin(view), KE::cend(view), init_reduction_value); +} + +// +// overload set 3 +// +template < + typename TeamHandleType, typename IteratorType, typename ValueType, + typename BinaryOp, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType reduce(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ValueType init_reduction_value, + BinaryOp joiner) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + return Impl::reduce_custom_functors_team_impl(teamHandle, first, last, + init_reduction_value, joiner); +} + +template < + typename TeamHandleType, typename DataType, typename... Properties, + typename ValueType, typename BinaryOp, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType +reduce(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + ValueType init_reduction_value, BinaryOp joiner) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + namespace KE = ::Kokkos::Experimental; + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::reduce_custom_functors_team_impl(teamHandle, KE::cbegin(view), + KE::cend(view), + init_reduction_value, joiner); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Remove.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Remove.hpp index c8602d2f53..8a429d8d51 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Remove.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Remove.hpp @@ -23,38 +23,74 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename Iterator, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> Iterator remove(const ExecutionSpace& ex, Iterator first, Iterator last, const ValueType& value) { - return Impl::remove_impl("Kokkos::remove_iterator_api_default", ex, first, - last, value); + return Impl::remove_exespace_impl("Kokkos::remove_iterator_api_default", ex, + first, last, value); } -template +template < + typename ExecutionSpace, typename Iterator, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> Iterator remove(const std::string& label, const ExecutionSpace& ex, Iterator first, Iterator last, const ValueType& value) { - return Impl::remove_impl(label, ex, first, last, value); + return Impl::remove_exespace_impl(label, ex, first, last, value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove(const ExecutionSpace& ex, const ::Kokkos::View& view, const ValueType& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::remove_impl("Kokkos::remove_iterator_api_default", ex, - ::Kokkos::Experimental::begin(view), - ::Kokkos::Experimental::end(view), value); + return Impl::remove_exespace_impl("Kokkos::remove_iterator_api_default", ex, + ::Kokkos::Experimental::begin(view), + ::Kokkos::Experimental::end(view), value); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ValueType& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::remove_impl(label, ex, ::Kokkos::Experimental::begin(view), - ::Kokkos::Experimental::end(view), value); + return Impl::remove_exespace_impl(label, ex, + ::Kokkos::Experimental::begin(view), + ::Kokkos::Experimental::end(view), value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION Iterator remove(const TeamHandleType& teamHandle, + Iterator first, Iterator last, + const ValueType& value) { + return Impl::remove_team_impl(teamHandle, first, last, value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto remove(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ValueType& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + return Impl::remove_team_impl(teamHandle, ::Kokkos::Experimental::begin(view), + ::Kokkos::Experimental::end(view), value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopy.hpp index c2c06f6202..4b8fa9fe07 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopy.hpp @@ -23,26 +23,36 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator remove_copy(const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, const ValueType& value) { - return Impl::remove_copy_impl("Kokkos::remove_copy_iterator_api_default", ex, - first_from, last_from, first_dest, value); + return Impl::remove_copy_exespace_impl( + "Kokkos::remove_copy_iterator_api_default", ex, first_from, last_from, + first_dest, value); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator remove_copy(const std::string& label, const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, const ValueType& value) { - return Impl::remove_copy_impl(label, ex, first_from, last_from, first_dest, - value); + return Impl::remove_copy_exespace_impl(label, ex, first_from, last_from, + first_dest, value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove_copy(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -50,15 +60,17 @@ auto remove_copy(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - return Impl::remove_copy_impl("Kokkos::remove_copy_iterator_api_default", ex, - ::Kokkos::Experimental::cbegin(view_from), - ::Kokkos::Experimental::cend(view_from), - ::Kokkos::Experimental::begin(view_dest), - value); + return Impl::remove_copy_exespace_impl( + "Kokkos::remove_copy_iterator_api_default", ex, + ::Kokkos::Experimental::cbegin(view_from), + ::Kokkos::Experimental::cend(view_from), + ::Kokkos::Experimental::begin(view_dest), value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove_copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -66,12 +78,46 @@ auto remove_copy(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - return Impl::remove_copy_impl( + return Impl::remove_copy_exespace_impl( label, ex, ::Kokkos::Experimental::cbegin(view_from), ::Kokkos::Experimental::cend(view_from), ::Kokkos::Experimental::begin(view_dest), value); } +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator remove_copy(const TeamHandleType& teamHandle, + InputIterator first_from, + InputIterator last_from, + OutputIterator first_dest, + const ValueType& value) { + return Impl::remove_copy_team_impl(teamHandle, first_from, last_from, + first_dest, value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto remove_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + const ValueType& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + + return Impl::remove_copy_team_impl( + teamHandle, ::Kokkos::Experimental::cbegin(view_from), + ::Kokkos::Experimental::cend(view_from), + ::Kokkos::Experimental::begin(view_dest), value); +} + } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopyIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopyIf.hpp index 6d642ed6f0..45e2b54bb6 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopyIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopyIf.hpp @@ -23,30 +23,39 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator remove_copy_if(const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, const UnaryPredicate& pred) { - return Impl::remove_copy_if_impl( + return Impl::remove_copy_if_exespace_impl( "Kokkos::remove_copy_if_iterator_api_default", ex, first_from, last_from, first_dest, pred); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator remove_copy_if(const std::string& label, const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, const UnaryPredicate& pred) { - return Impl::remove_copy_if_impl(label, ex, first_from, last_from, first_dest, - pred); + return Impl::remove_copy_if_exespace_impl(label, ex, first_from, last_from, + first_dest, pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove_copy_if(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -54,15 +63,17 @@ auto remove_copy_if(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - return Impl::remove_copy_if_impl( + return Impl::remove_copy_if_exespace_impl( "Kokkos::remove_copy_if_iterator_api_default", ex, ::Kokkos::Experimental::cbegin(view_from), ::Kokkos::Experimental::cend(view_from), ::Kokkos::Experimental::begin(view_dest), pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove_copy_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -70,12 +81,46 @@ auto remove_copy_if(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - return Impl::remove_copy_if_impl( + return Impl::remove_copy_if_exespace_impl( label, ex, ::Kokkos::Experimental::cbegin(view_from), ::Kokkos::Experimental::cend(view_from), ::Kokkos::Experimental::begin(view_dest), pred); } +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator remove_copy_if(const TeamHandleType& teamHandle, + InputIterator first_from, + InputIterator last_from, + OutputIterator first_dest, + const UnaryPredicate& pred) { + return Impl::remove_copy_if_team_impl(teamHandle, first_from, last_from, + first_dest, pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto remove_copy_if( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + const UnaryPredicate& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + + return Impl::remove_copy_if_team_impl( + teamHandle, ::Kokkos::Experimental::cbegin(view_from), + ::Kokkos::Experimental::cend(view_from), + ::Kokkos::Experimental::begin(view_dest), pred); +} + } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveIf.hpp index 4062e8d373..38461a37f2 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveIf.hpp @@ -23,39 +23,77 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename Iterator, typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> Iterator remove_if(const ExecutionSpace& ex, Iterator first, Iterator last, UnaryPredicate pred) { - return Impl::remove_if_impl("Kokkos::remove_if_iterator_api_default", ex, - first, last, pred); + return Impl::remove_if_exespace_impl("Kokkos::remove_if_iterator_api_default", + ex, first, last, pred); } -template +template < + typename ExecutionSpace, typename Iterator, typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> Iterator remove_if(const std::string& label, const ExecutionSpace& ex, Iterator first, Iterator last, UnaryPredicate pred) { - return Impl::remove_if_impl(label, ex, first, last, pred); + return Impl::remove_if_exespace_impl(label, ex, first, last, pred); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove_if(const ExecutionSpace& ex, const ::Kokkos::View& view, UnaryPredicate pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::remove_if_impl("Kokkos::remove_if_iterator_api_default", ex, - ::Kokkos::Experimental::begin(view), - ::Kokkos::Experimental::end(view), pred); + return Impl::remove_if_exespace_impl("Kokkos::remove_if_iterator_api_default", + ex, ::Kokkos::Experimental::begin(view), + ::Kokkos::Experimental::end(view), pred); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename UnaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto remove_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, UnaryPredicate pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::remove_if_impl(label, ex, ::Kokkos::Experimental::begin(view), - ::Kokkos::Experimental::end(view), pred); + return Impl::remove_if_exespace_impl(label, ex, + ::Kokkos::Experimental::begin(view), + ::Kokkos::Experimental::end(view), pred); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION Iterator remove_if(const TeamHandleType& teamHandle, + Iterator first, Iterator last, + UnaryPredicate pred) { + return Impl::remove_if_team_impl(teamHandle, first, last, pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto remove_if( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, UnaryPredicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::remove_if_team_impl(teamHandle, + ::Kokkos::Experimental::begin(view), + ::Kokkos::Experimental::end(view), pred); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Replace.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Replace.hpp index 4d1490ded0..29afc4f0c2 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Replace.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Replace.hpp @@ -23,40 +23,77 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename Iterator, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace(const ExecutionSpace& ex, Iterator first, Iterator last, const ValueType& old_value, const ValueType& new_value) { - return Impl::replace_impl("Kokkos::replace_iterator_api", ex, first, last, - old_value, new_value); + Impl::replace_exespace_impl("Kokkos::replace_iterator_api", ex, first, last, + old_value, new_value); } -template +template < + typename ExecutionSpace, typename Iterator, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace(const std::string& label, const ExecutionSpace& ex, Iterator first, Iterator last, const ValueType& old_value, const ValueType& new_value) { - return Impl::replace_impl(label, ex, first, last, old_value, new_value); + Impl::replace_exespace_impl(label, ex, first, last, old_value, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace(const ExecutionSpace& ex, const ::Kokkos::View& view, const ValueType& old_value, const ValueType& new_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::replace_impl("Kokkos::replace_view_api", ex, KE::begin(view), - KE::end(view), old_value, new_value); + Impl::replace_exespace_impl("Kokkos::replace_view_api", ex, KE::begin(view), + KE::end(view), old_value, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ValueType& old_value, const ValueType& new_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::replace_impl(label, ex, KE::begin(view), KE::end(view), - old_value, new_value); + Impl::replace_exespace_impl(label, ex, KE::begin(view), KE::end(view), + old_value, new_value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION void replace(const TeamHandleType& teamHandle, Iterator first, + Iterator last, const ValueType& old_value, + const ValueType& new_value) { + Impl::replace_team_impl(teamHandle, first, last, old_value, new_value); +} + +template , int> = 0> +KOKKOS_FUNCTION void replace( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ValueType& old_value, const ValueType& new_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + namespace KE = ::Kokkos::Experimental; + Impl::replace_team_impl(teamHandle, KE::begin(view), KE::end(view), old_value, + new_value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopy.hpp index e7f464e4bd..04d5767e89 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopy.hpp @@ -23,30 +23,39 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator replace_copy(const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, const ValueType& old_value, const ValueType& new_value) { - return Impl::replace_copy_impl("Kokkos::replace_copy_iterator_api", ex, - first_from, last_from, first_dest, old_value, - new_value); + return Impl::replace_copy_exespace_impl("Kokkos::replace_copy_iterator_api", + ex, first_from, last_from, first_dest, + old_value, new_value); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator replace_copy(const std::string& label, const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, const ValueType& old_value, const ValueType& new_value) { - return Impl::replace_copy_impl(label, ex, first_from, last_from, first_dest, - old_value, new_value); + return Impl::replace_copy_exespace_impl(label, ex, first_from, last_from, + first_dest, old_value, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto replace_copy(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -54,13 +63,15 @@ auto replace_copy(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::replace_copy_impl("Kokkos::replace_copy_view_api", ex, - KE::cbegin(view_from), KE::cend(view_from), - KE::begin(view_dest), old_value, new_value); + return Impl::replace_copy_exespace_impl( + "Kokkos::replace_copy_view_api", ex, KE::cbegin(view_from), + KE::cend(view_from), KE::begin(view_dest), old_value, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto replace_copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -68,9 +79,43 @@ auto replace_copy(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::replace_copy_impl(label, ex, KE::cbegin(view_from), - KE::cend(view_from), KE::begin(view_dest), - old_value, new_value); + return Impl::replace_copy_exespace_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), old_value, new_value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator replace_copy(const TeamHandleType& teamHandle, + InputIterator first_from, + InputIterator last_from, + OutputIterator first_dest, + const ValueType& old_value, + const ValueType& new_value) { + return Impl::replace_copy_team_impl(teamHandle, first_from, last_from, + first_dest, old_value, new_value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto replace_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + const ValueType& old_value, const ValueType& new_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::replace_copy_team_impl(teamHandle, KE::cbegin(view_from), + KE::cend(view_from), KE::begin(view_dest), + old_value, new_value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopyIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopyIf.hpp index 71ae8f8452..b87163f194 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopyIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopyIf.hpp @@ -23,33 +23,42 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename PredicateType, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator replace_copy_if(const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, PredicateType pred, const ValueType& new_value) { - return Impl::replace_copy_if_impl("Kokkos::replace_copy_if_iterator_api", ex, - first_from, last_from, first_dest, pred, - new_value); + return Impl::replace_copy_if_exespace_impl( + "Kokkos::replace_copy_if_iterator_api", ex, first_from, last_from, + first_dest, pred, new_value); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename PredicateType, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator replace_copy_if(const std::string& label, const ExecutionSpace& ex, InputIterator first_from, InputIterator last_from, OutputIterator first_dest, PredicateType pred, const ValueType& new_value) { - return Impl::replace_copy_if_impl(label, ex, first_from, last_from, - first_dest, pred, new_value); + return Impl::replace_copy_if_exespace_impl(label, ex, first_from, last_from, + first_dest, pred, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename PredicateType, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto replace_copy_if(const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -57,14 +66,16 @@ auto replace_copy_if(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::replace_copy_if_impl("Kokkos::replace_copy_if_view_api", ex, - KE::cbegin(view_from), KE::cend(view_from), - KE::begin(view_dest), pred, new_value); + return Impl::replace_copy_if_exespace_impl( + "Kokkos::replace_copy_if_view_api", ex, KE::cbegin(view_from), + KE::cend(view_from), KE::begin(view_dest), pred, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename PredicateType, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto replace_copy_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, const ::Kokkos::View& view_dest, @@ -72,9 +83,44 @@ auto replace_copy_if(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::replace_copy_if_impl(label, ex, KE::cbegin(view_from), - KE::cend(view_from), KE::begin(view_dest), - pred, new_value); + return Impl::replace_copy_if_exespace_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), pred, new_value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator replace_copy_if(const TeamHandleType& teamHandle, + InputIterator first_from, + InputIterator last_from, + OutputIterator first_dest, + PredicateType pred, + const ValueType& new_value) { + return Impl::replace_copy_if_team_impl(teamHandle, first_from, last_from, + first_dest, pred, new_value); +} + +template , int> = 0> +KOKKOS_FUNCTION auto replace_copy_if( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + PredicateType pred, const ValueType& new_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::replace_copy_if_team_impl(teamHandle, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest), pred, new_value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceIf.hpp index 7f06540e06..73af1f16f0 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceIf.hpp @@ -23,43 +23,82 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename Predicate, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace_if(const ExecutionSpace& ex, InputIterator first, InputIterator last, Predicate pred, const ValueType& new_value) { - return Impl::replace_if_impl("Kokkos::replace_if_iterator_api", ex, first, - last, pred, new_value); + Impl::replace_if_exespace_impl("Kokkos::replace_if_iterator_api", ex, first, + last, pred, new_value); } -template +template < + typename ExecutionSpace, typename InputIterator, typename Predicate, + typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace_if(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, Predicate pred, const ValueType& new_value) { - return Impl::replace_if_impl(label, ex, first, last, pred, new_value); + Impl::replace_if_exespace_impl(label, ex, first, last, pred, new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename Predicate, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace_if(const ExecutionSpace& ex, const ::Kokkos::View& view, Predicate pred, const ValueType& new_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::replace_if_impl("Kokkos::replace_if_view_api", ex, - KE::begin(view), KE::end(view), pred, new_value); + Impl::replace_if_exespace_impl("Kokkos::replace_if_view_api", ex, + KE::begin(view), KE::end(view), pred, + new_value); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename Predicate, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void replace_if(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, Predicate pred, const ValueType& new_value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::replace_if_impl(label, ex, KE::begin(view), KE::end(view), pred, - new_value); + Impl::replace_if_exespace_impl(label, ex, KE::begin(view), KE::end(view), + pred, new_value); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION void replace_if(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + Predicate pred, const ValueType& new_value) { + Impl::replace_if_team_impl(teamHandle, first, last, pred, new_value); +} + +template , int> = 0> +KOKKOS_FUNCTION void replace_if( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, Predicate pred, + const ValueType& new_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + namespace KE = ::Kokkos::Experimental; + Impl::replace_if_team_impl(teamHandle, KE::begin(view), KE::end(view), pred, + new_value); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reverse.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reverse.hpp index 9f2fc5f3cc..a0786d3a2e 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reverse.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reverse.hpp @@ -23,34 +23,67 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void reverse(const ExecutionSpace& ex, InputIterator first, InputIterator last) { - return Impl::reverse_impl("Kokkos::reverse_iterator_api_default", ex, first, - last); + return Impl::reverse_exespace_impl("Kokkos::reverse_iterator_api_default", ex, + first, last); } -template +template < + typename ExecutionSpace, typename InputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void reverse(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last) { - return Impl::reverse_impl(label, ex, first, last); + return Impl::reverse_exespace_impl(label, ex, first, last); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void reverse(const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::reverse_impl("Kokkos::reverse_view_api_default", ex, - KE::begin(view), KE::end(view)); + return Impl::reverse_exespace_impl("Kokkos::reverse_view_api_default", ex, + KE::begin(view), KE::end(view)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> void reverse(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::reverse_impl(label, ex, KE::begin(view), KE::end(view)); + return Impl::reverse_exespace_impl(label, ex, KE::begin(view), KE::end(view)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION void reverse(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last) { + return Impl::reverse_team_impl(teamHandle, first, last); +} + +template , int> = 0> +KOKKOS_FUNCTION void reverse( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + namespace KE = ::Kokkos::Experimental; + return Impl::reverse_team_impl(teamHandle, KE::begin(view), KE::end(view)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReverseCopy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReverseCopy.hpp index 279bb22086..37336c983a 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReverseCopy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReverseCopy.hpp @@ -23,42 +23,83 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator reverse_copy(const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::reverse_copy_impl("Kokkos::reverse_copy_iterator_api_default", - ex, first, last, d_first); + return Impl::reverse_copy_exespace_impl( + "Kokkos::reverse_copy_iterator_api_default", ex, first, last, d_first); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator reverse_copy(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::reverse_copy_impl(label, ex, first, last, d_first); + return Impl::reverse_copy_exespace_impl(label, ex, first, last, d_first); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto reverse_copy(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::reverse_copy_impl("Kokkos::reverse_copy_view_api_default", ex, - cbegin(source), cend(source), begin(dest)); + return Impl::reverse_copy_exespace_impl( + "Kokkos::reverse_copy_view_api_default", ex, cbegin(source), cend(source), + begin(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto reverse_copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::reverse_copy_impl(label, ex, cbegin(source), cend(source), - begin(dest)); + return Impl::reverse_copy_exespace_impl(label, ex, cbegin(source), + cend(source), begin(dest)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator reverse_copy(const TeamHandleType& teamHandle, + InputIterator first, + InputIterator last, + OutputIterator d_first) { + return Impl::reverse_copy_team_impl(teamHandle, first, last, d_first); +} + +template , int> = 0> +KOKKOS_FUNCTION auto reverse_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::reverse_copy_team_impl(teamHandle, cbegin(source), cend(source), + begin(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Rotate.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Rotate.hpp index 738e9bf137..aff04b47d6 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Rotate.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Rotate.hpp @@ -23,36 +23,71 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType rotate(const ExecutionSpace& ex, IteratorType first, IteratorType n_first, IteratorType last) { - return Impl::rotate_impl("Kokkos::rotate_iterator_api_default", ex, first, - n_first, last); + return Impl::rotate_exespace_impl("Kokkos::rotate_iterator_api_default", ex, + first, n_first, last); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType rotate(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType n_first, IteratorType last) { - return Impl::rotate_impl(label, ex, first, n_first, last); + return Impl::rotate_exespace_impl(label, ex, first, n_first, last); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto rotate(const ExecutionSpace& ex, const ::Kokkos::View& view, std::size_t n_location) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::rotate_impl("Kokkos::rotate_view_api_default", ex, begin(view), - begin(view) + n_location, end(view)); + return Impl::rotate_exespace_impl("Kokkos::rotate_view_api_default", ex, + begin(view), begin(view) + n_location, + end(view)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto rotate(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, std::size_t n_location) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::rotate_impl(label, ex, begin(view), begin(view) + n_location, - end(view)); + return Impl::rotate_exespace_impl(label, ex, begin(view), + begin(view) + n_location, end(view)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType rotate(const TeamHandleType& teamHandle, + IteratorType first, IteratorType n_first, + IteratorType last) { + return Impl::rotate_team_impl(teamHandle, first, n_first, last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto rotate(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + std::size_t n_location) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + return Impl::rotate_team_impl(teamHandle, begin(view), + begin(view) + n_location, end(view)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RotateCopy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RotateCopy.hpp index f5d826c4bb..cce37fccfa 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RotateCopy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_RotateCopy.hpp @@ -23,23 +23,34 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator rotate_copy(const ExecutionSpace& ex, InputIterator first, InputIterator n_first, InputIterator last, OutputIterator d_first) { - return Impl::rotate_copy_impl("Kokkos::rotate_copy_iterator_api_default", ex, - first, n_first, last, d_first); + return Impl::rotate_copy_exespace_impl( + "Kokkos::rotate_copy_iterator_api_default", ex, first, n_first, last, + d_first); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator rotate_copy(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator n_first, InputIterator last, OutputIterator d_first) { - return Impl::rotate_copy_impl(label, ex, first, n_first, last, d_first); + return Impl::rotate_copy_exespace_impl(label, ex, first, n_first, last, + d_first); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto rotate_copy(const ExecutionSpace& ex, const ::Kokkos::View& source, std::size_t n_location, @@ -47,13 +58,15 @@ auto rotate_copy(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::rotate_copy_impl("Kokkos::rotate_copy_view_api_default", ex, - cbegin(source), cbegin(source) + n_location, - cend(source), begin(dest)); + return Impl::rotate_copy_exespace_impl( + "Kokkos::rotate_copy_view_api_default", ex, cbegin(source), + cbegin(source) + n_location, cend(source), begin(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto rotate_copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, std::size_t n_location, @@ -61,9 +74,41 @@ auto rotate_copy(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::rotate_copy_impl(label, ex, cbegin(source), - cbegin(source) + n_location, cend(source), - begin(dest)); + return Impl::rotate_copy_exespace_impl(label, ex, cbegin(source), + cbegin(source) + n_location, + cend(source), begin(dest)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator rotate_copy(const TeamHandleType& teamHandle, + InputIterator first, + InputIterator n_first, + InputIterator last, + OutputIterator d_first) { + return Impl::rotate_copy_team_impl(teamHandle, first, n_first, last, d_first); +} + +template , int> = 0> +KOKKOS_FUNCTION auto rotate_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + std::size_t n_location, + const ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::rotate_copy_team_impl(teamHandle, cbegin(source), + cbegin(source) + n_location, cend(source), + begin(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Search.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Search.hpp index b1154b297e..43258a484e 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Search.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Search.hpp @@ -23,24 +23,34 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1: no binary predicate passed -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 search(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { - return Impl::search_impl("Kokkos::search_iterator_api_default", ex, first, - last, s_first, s_last); + return Impl::search_exespace_impl("Kokkos::search_iterator_api_default", ex, + first, last, s_first, s_last); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 search(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { - return Impl::search_impl(label, ex, first, last, s_first, s_last); + return Impl::search_exespace_impl(label, ex, first, last, s_first, s_last); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto search(const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view) { @@ -48,13 +58,15 @@ auto search(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::search_impl("Kokkos::search_view_api_default", ex, - KE::begin(view), KE::end(view), KE::begin(s_view), - KE::end(s_view)); + return Impl::search_exespace_impl("Kokkos::search_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto search(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view) { @@ -62,31 +74,38 @@ auto search(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::search_impl(label, ex, KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view)); + return Impl::search_exespace_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); } // overload set 2: binary predicate passed -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 search(const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, const BinaryPredicateType& pred) { - return Impl::search_impl("Kokkos::search_iterator_api_default", ex, first, - last, s_first, s_last, pred); + return Impl::search_exespace_impl("Kokkos::search_iterator_api_default", ex, + first, last, s_first, s_last, pred); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType1 search(const std::string& label, const ExecutionSpace& ex, IteratorType1 first, IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, const BinaryPredicateType& pred) { - return Impl::search_impl(label, ex, first, last, s_first, s_last, pred); + return Impl::search_exespace_impl(label, ex, first, last, s_first, s_last, + pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto search(const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view, @@ -95,13 +114,15 @@ auto search(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::search_impl("Kokkos::search_view_api_default", ex, - KE::begin(view), KE::end(view), KE::begin(s_view), - KE::end(s_view), pred); + return Impl::search_exespace_impl("Kokkos::search_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto search(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, const ::Kokkos::View& s_view, @@ -110,8 +131,70 @@ auto search(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); namespace KE = ::Kokkos::Experimental; - return Impl::search_impl(label, ex, KE::begin(view), KE::end(view), - KE::begin(s_view), KE::end(s_view), pred); + return Impl::search_exespace_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1: no binary predicate passed +template , int> = 0> +KOKKOS_FUNCTION IteratorType1 search(const TeamHandleType& teamHandle, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::search_team_impl(teamHandle, first, last, s_first, s_last); +} + +template , int> = 0> +KOKKOS_FUNCTION auto search( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::search_team_impl(teamHandle, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template , int> = 0> + +KOKKOS_FUNCTION IteratorType1 search(const TeamHandleType& teamHandle, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::search_team_impl(teamHandle, first, last, s_first, s_last, pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto search( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::search_team_impl(teamHandle, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SearchN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SearchN.hpp index a649c8f205..0f8aa5f1c1 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SearchN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SearchN.hpp @@ -23,68 +23,86 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1: no binary predicate passed -template +template < + class ExecutionSpace, class IteratorType, class SizeType, class ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType search_n(const ExecutionSpace& ex, IteratorType first, IteratorType last, SizeType count, const ValueType& value) { - return Impl::search_n_impl("Kokkos::search_n_iterator_api_default", ex, first, - last, count, value); + return Impl::search_n_exespace_impl("Kokkos::search_n_iterator_api_default", + ex, first, last, count, value); } -template +template < + class ExecutionSpace, class IteratorType, class SizeType, class ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType search_n(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, SizeType count, const ValueType& value) { - return Impl::search_n_impl(label, ex, first, last, count, value); + return Impl::search_n_exespace_impl(label, ex, first, last, count, value); } template + class SizeType, class ValueType, + std::enable_if_t<::Kokkos::is_execution_space::value, + int> = 0> auto search_n(const ExecutionSpace& ex, const ::Kokkos::View& view, SizeType count, const ValueType& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::search_n_impl("Kokkos::search_n_view_api_default", ex, - KE::begin(view), KE::end(view), count, value); + return Impl::search_n_exespace_impl("Kokkos::search_n_view_api_default", ex, + KE::begin(view), KE::end(view), count, + value); } template + class SizeType, class ValueType, + std::enable_if_t<::Kokkos::is_execution_space::value, + int> = 0> auto search_n(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, SizeType count, const ValueType& value) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::search_n_impl(label, ex, KE::begin(view), KE::end(view), count, - value); + return Impl::search_n_exespace_impl(label, ex, KE::begin(view), KE::end(view), + count, value); } // overload set 2: binary predicate passed -template +template < + class ExecutionSpace, class IteratorType, class SizeType, class ValueType, + class BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType search_n(const ExecutionSpace& ex, IteratorType first, IteratorType last, SizeType count, const ValueType& value, const BinaryPredicateType& pred) { - return Impl::search_n_impl("Kokkos::search_n_iterator_api_default", ex, first, - last, count, value, pred); + return Impl::search_n_exespace_impl("Kokkos::search_n_iterator_api_default", + ex, first, last, count, value, pred); } -template +template < + class ExecutionSpace, class IteratorType, class SizeType, class ValueType, + class BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType search_n(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, SizeType count, const ValueType& value, const BinaryPredicateType& pred) { - return Impl::search_n_impl(label, ex, first, last, count, value, pred); + return Impl::search_n_exespace_impl(label, ex, first, last, count, value, + pred); } template + class SizeType, class ValueType, class BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space::value, + int> = 0> auto search_n(const ExecutionSpace& ex, const ::Kokkos::View& view, SizeType count, const ValueType& value, @@ -92,13 +110,15 @@ auto search_n(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::search_n_impl("Kokkos::search_n_view_api_default", ex, - KE::begin(view), KE::end(view), count, value, - pred); + return Impl::search_n_exespace_impl("Kokkos::search_n_view_api_default", ex, + KE::begin(view), KE::end(view), count, + value, pred); } template + class SizeType, class ValueType, class BinaryPredicateType, + std::enable_if_t<::Kokkos::is_execution_space::value, + int> = 0> auto search_n(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, SizeType count, const ValueType& value, @@ -106,8 +126,65 @@ auto search_n(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); namespace KE = ::Kokkos::Experimental; - return Impl::search_n_impl(label, ex, KE::begin(view), KE::end(view), count, - value, pred); + return Impl::search_n_exespace_impl(label, ex, KE::begin(view), KE::end(view), + count, value, pred); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1: no binary predicate passed +template , int> = 0> +KOKKOS_FUNCTION IteratorType search_n(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + SizeType count, const ValueType& value) { + return Impl::search_n_team_impl(teamHandle, first, last, count, value); +} + +template < + class TeamHandleType, class DataType, class... Properties, class SizeType, + class ValueType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto search_n( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, SizeType count, + const ValueType& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::search_n_team_impl(teamHandle, KE::begin(view), KE::end(view), + count, value); +} + +// overload set 2: binary predicate passed +template , int> = 0> +KOKKOS_FUNCTION IteratorType search_n(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + SizeType count, const ValueType& value, + const BinaryPredicateType& pred) { + return Impl::search_n_team_impl(teamHandle, first, last, count, value, pred); +} + +template < + class TeamHandleType, class DataType, class... Properties, class SizeType, + class ValueType, class BinaryPredicateType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION auto search_n( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, SizeType count, + const ValueType& value, const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::search_n_team_impl(teamHandle, KE::begin(view), KE::end(view), + count, value, pred); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftLeft.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftLeft.hpp index 4b91a17ab8..b3e04a3b97 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftLeft.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftLeft.hpp @@ -23,36 +23,70 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType shift_left(const ExecutionSpace& ex, IteratorType first, IteratorType last, typename IteratorType::difference_type n) { - return Impl::shift_left_impl("Kokkos::shift_left_iterator_api_default", ex, - first, last, n); + return Impl::shift_left_exespace_impl( + "Kokkos::shift_left_iterator_api_default", ex, first, last, n); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType shift_left(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, typename IteratorType::difference_type n) { - return Impl::shift_left_impl(label, ex, first, last, n); + return Impl::shift_left_exespace_impl(label, ex, first, last, n); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto shift_left(const ExecutionSpace& ex, const ::Kokkos::View& view, typename decltype(begin(view))::difference_type n) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::shift_left_impl("Kokkos::shift_left_view_api_default", ex, - begin(view), end(view), n); + return Impl::shift_left_exespace_impl("Kokkos::shift_left_view_api_default", + ex, begin(view), end(view), n); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto shift_left(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, typename decltype(begin(view))::difference_type n) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::shift_left_impl(label, ex, begin(view), end(view), n); + return Impl::shift_left_exespace_impl(label, ex, begin(view), end(view), n); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType +shift_left(const TeamHandleType& teamHandle, IteratorType first, + IteratorType last, typename IteratorType::difference_type n) { + return Impl::shift_left_team_impl(teamHandle, first, last, n); +} + +template , int> = 0> +KOKKOS_FUNCTION auto shift_left( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + typename decltype(begin(view))::difference_type n) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + return Impl::shift_left_team_impl(teamHandle, begin(view), end(view), n); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftRight.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftRight.hpp index 2ea50fd74e..0f7ed53948 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftRight.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftRight.hpp @@ -23,36 +23,70 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType shift_right(const ExecutionSpace& ex, IteratorType first, IteratorType last, typename IteratorType::difference_type n) { - return Impl::shift_right_impl("Kokkos::shift_right_iterator_api_default", ex, - first, last, n); + return Impl::shift_right_exespace_impl( + "Kokkos::shift_right_iterator_api_default", ex, first, last, n); } -template +template < + typename ExecutionSpace, typename IteratorType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> IteratorType shift_right(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, typename IteratorType::difference_type n) { - return Impl::shift_right_impl(label, ex, first, last, n); + return Impl::shift_right_exespace_impl(label, ex, first, last, n); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto shift_right(const ExecutionSpace& ex, const ::Kokkos::View& view, typename decltype(begin(view))::difference_type n) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::shift_right_impl("Kokkos::shift_right_view_api_default", ex, - begin(view), end(view), n); + return Impl::shift_right_exespace_impl("Kokkos::shift_right_view_api_default", + ex, begin(view), end(view), n); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto shift_right(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, typename decltype(begin(view))::difference_type n) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::shift_right_impl(label, ex, begin(view), end(view), n); + return Impl::shift_right_exespace_impl(label, ex, begin(view), end(view), n); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType +shift_right(const TeamHandleType& teamHandle, IteratorType first, + IteratorType last, typename IteratorType::difference_type n) { + return Impl::shift_right_team_impl(teamHandle, first, last, n); +} + +template , int> = 0> +KOKKOS_FUNCTION auto shift_right( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + typename decltype(begin(view))::difference_type n) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + return Impl::shift_right_team_impl(teamHandle, begin(view), end(view), n); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SwapRanges.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SwapRanges.hpp index 5fbf045318..39f33b6487 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SwapRanges.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_SwapRanges.hpp @@ -23,15 +23,21 @@ namespace Kokkos { namespace Experimental { -template +// +// overload set accepting execution space +// +template , int> = 0> IteratorType2 swap_ranges(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2) { - return Impl::swap_ranges_impl("Kokkos::swap_ranges_iterator_api_default", ex, - first1, last1, first2); + return Impl::swap_ranges_exespace_impl( + "Kokkos::swap_ranges_iterator_api_default", ex, first1, last1, first2); } -template +template , int> = 0> auto swap_ranges(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { @@ -39,19 +45,23 @@ auto swap_ranges(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); assert(source.extent(0) == dest.extent(0)); - return Impl::swap_ranges_impl("Kokkos::swap_ranges_view_api_default", ex, - begin(source), end(source), begin(dest)); + return Impl::swap_ranges_exespace_impl("Kokkos::swap_ranges_view_api_default", + ex, begin(source), end(source), + begin(dest)); } -template +template , int> = 0> IteratorType2 swap_ranges(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2) { - return Impl::swap_ranges_impl(label, ex, first1, last1, first2); + return Impl::swap_ranges_exespace_impl(label, ex, first1, last1, first2); } -template +template , int> = 0> auto swap_ranges(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest) { @@ -59,8 +69,38 @@ auto swap_ranges(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); assert(source.extent(0) == dest.extent(0)); - return Impl::swap_ranges_impl(label, ex, begin(source), end(source), - begin(dest)); + return Impl::swap_ranges_exespace_impl(label, ex, begin(source), end(source), + begin(dest)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION IteratorType2 swap_ranges(const TeamHandleType& teamHandle, + IteratorType1 first1, + IteratorType1 last1, + IteratorType2 first2) { + return Impl::swap_ranges_team_impl(teamHandle, first1, last1, first2); +} + +template , int> = 0> +KOKKOS_FUNCTION auto swap_ranges( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + assert(source.extent(0) == dest.extent(0)); + return Impl::swap_ranges_team_impl(teamHandle, begin(source), end(source), + begin(dest)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Transform.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Transform.hpp index 27dee30426..838c9169e2 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Transform.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Transform.hpp @@ -23,31 +23,39 @@ namespace Kokkos { namespace Experimental { -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - InputIterator, OutputIterator>::value, - OutputIterator> -transform(const ExecutionSpace& ex, InputIterator first1, InputIterator last1, - OutputIterator d_first, UnaryOperation unary_op) { - return Impl::transform_impl("Kokkos::transform_iterator_api_default", ex, - first1, last1, d_first, std::move(unary_op)); +// +// overload set accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename UnaryOperation, + std::enable_if_t && + is_execution_space_v, + int> = 0> +OutputIterator transform(const ExecutionSpace& ex, InputIterator first1, + InputIterator last1, OutputIterator d_first, + UnaryOperation unary_op) { + return Impl::transform_exespace_impl("Kokkos::transform_iterator_api_default", + ex, first1, last1, d_first, + std::move(unary_op)); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - InputIterator, OutputIterator>::value, - OutputIterator> -transform(const std::string& label, const ExecutionSpace& ex, - InputIterator first1, InputIterator last1, OutputIterator d_first, - UnaryOperation unary_op) { - return Impl::transform_impl(label, ex, first1, last1, d_first, - std::move(unary_op)); +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename UnaryOperation, + std::enable_if_t && + is_execution_space_v, + int> = 0> +OutputIterator transform(const std::string& label, const ExecutionSpace& ex, + InputIterator first1, InputIterator last1, + OutputIterator d_first, UnaryOperation unary_op) { + return Impl::transform_exespace_impl(label, ex, first1, last1, d_first, + std::move(unary_op)); } -template +template , int> = 0> auto transform(const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest, @@ -55,13 +63,14 @@ auto transform(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::transform_impl("Kokkos::transform_view_api_default", ex, - begin(source), end(source), begin(dest), - std::move(unary_op)); + return Impl::transform_exespace_impl("Kokkos::transform_view_api_default", ex, + begin(source), end(source), begin(dest), + std::move(unary_op)); } -template +template , int> = 0> auto transform(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, ::Kokkos::View& dest, @@ -69,38 +78,44 @@ auto transform(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::transform_impl(label, ex, begin(source), end(source), - begin(dest), std::move(unary_op)); + return Impl::transform_exespace_impl(label, ex, begin(source), end(source), + begin(dest), std::move(unary_op)); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - InputIterator1, InputIterator2, OutputIterator>::value, - OutputIterator> -transform(const ExecutionSpace& ex, InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, OutputIterator d_first, - BinaryOperation binary_op) { - return Impl::transform_impl("Kokkos::transform_iterator_api_default", ex, - first1, last1, first2, d_first, - std::move(binary_op)); +template < + typename ExecutionSpace, typename InputIterator1, typename InputIterator2, + typename OutputIterator, typename BinaryOperation, + std::enable_if_t< + Impl::are_iterators_v && + is_execution_space_v, + int> = 0> +OutputIterator transform(const ExecutionSpace& ex, InputIterator1 first1, + InputIterator1 last1, InputIterator2 first2, + OutputIterator d_first, BinaryOperation binary_op) { + return Impl::transform_exespace_impl("Kokkos::transform_iterator_api_default", + ex, first1, last1, first2, d_first, + std::move(binary_op)); } -template -std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< - InputIterator1, InputIterator2, OutputIterator>::value, - OutputIterator> -transform(const std::string& label, const ExecutionSpace& ex, - InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - OutputIterator d_first, BinaryOperation binary_op) { - return Impl::transform_impl(label, ex, first1, last1, first2, d_first, - std::move(binary_op)); +template < + typename ExecutionSpace, typename InputIterator1, typename InputIterator2, + typename OutputIterator, typename BinaryOperation, + std::enable_if_t< + Impl::are_iterators_v && + is_execution_space_v, + int> = 0> +OutputIterator transform(const std::string& label, const ExecutionSpace& ex, + InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, OutputIterator d_first, + BinaryOperation binary_op) { + return Impl::transform_exespace_impl(label, ex, first1, last1, first2, + d_first, std::move(binary_op)); } -template +template , int> = 0> auto transform(const ExecutionSpace& ex, const ::Kokkos::View& source1, const ::Kokkos::View& source2, @@ -110,14 +125,15 @@ auto transform(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source2); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::transform_impl("Kokkos::transform_view_api_default", ex, - begin(source1), end(source1), begin(source2), - begin(dest), std::move(binary_op)); + return Impl::transform_exespace_impl( + "Kokkos::transform_view_api_default", ex, begin(source1), end(source1), + begin(source2), begin(dest), std::move(binary_op)); } -template +template , int> = 0> auto transform(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source1, const ::Kokkos::View& source2, @@ -127,9 +143,79 @@ auto transform(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source2); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::transform_impl(label, ex, begin(source1), end(source1), - begin(source2), begin(dest), - std::move(binary_op)); + return Impl::transform_exespace_impl(label, ex, begin(source1), end(source1), + begin(source2), begin(dest), + std::move(binary_op)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template < + typename TeamHandleType, typename InputIterator, typename OutputIterator, + typename UnaryOperation, + std::enable_if_t && + is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIterator transform(const TeamHandleType& teamHandle, + InputIterator first1, + InputIterator last1, + OutputIterator d_first, + UnaryOperation unary_op) { + return Impl::transform_team_impl(teamHandle, first1, last1, d_first, + std::move(unary_op)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto transform( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + ::Kokkos::View& dest, UnaryOperation unary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::transform_team_impl(teamHandle, begin(source), end(source), + begin(dest), std::move(unary_op)); +} + +template < + typename TeamHandleType, typename InputIterator1, typename InputIterator2, + typename OutputIterator, typename BinaryOperation, + std::enable_if_t< + Impl::are_iterators_v && + is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIterator transform(const TeamHandleType& teamHandle, + InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + OutputIterator d_first, + BinaryOperation binary_op) { + return Impl::transform_team_impl(teamHandle, first1, last1, first2, d_first, + std::move(binary_op)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto transform( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source1, + const ::Kokkos::View& source2, + ::Kokkos::View& dest, + BinaryOperation binary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source2); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::transform_team_impl(teamHandle, begin(source1), end(source1), + begin(source2), begin(dest), + std::move(binary_op)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformExclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformExclusiveScan.hpp index 9d85aee06f..37fc0f860e 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformExclusiveScan.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformExclusiveScan.hpp @@ -23,44 +23,52 @@ namespace Kokkos { namespace Experimental { -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -transform_exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - ValueType init_value, BinaryOpType binary_op, - UnaryOpType unary_op) { +// +// overload set accepting execution space +// +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType transform_exclusive_scan( + const ExecutionSpace& ex, InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, ValueType init_value, BinaryOpType binary_op, + UnaryOpType unary_op) { Impl::static_assert_is_not_openmptarget(ex); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); - return Impl::transform_exclusive_scan_impl( + return Impl::transform_exclusive_scan_exespace_impl( "Kokkos::transform_exclusive_scan_custom_functors_iterator_api", ex, - first, last, first_dest, init_value, binary_op, unary_op); + first, last, first_dest, std::move(init_value), binary_op, unary_op); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -transform_exclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, ValueType init_value, - BinaryOpType binary_op, UnaryOpType unary_op) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType transform_exclusive_scan( + const std::string& label, const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, ValueType init_value, + BinaryOpType binary_op, UnaryOpType unary_op) { Impl::static_assert_is_not_openmptarget(ex); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); - return Impl::transform_exclusive_scan_impl(label, ex, first, last, first_dest, - init_value, binary_op, unary_op); + return Impl::transform_exclusive_scan_exespace_impl( + label, ex, first, last, first_dest, std::move(init_value), binary_op, + unary_op); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + typename BinaryOpType, typename UnaryOpType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto transform_exclusive_scan( const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -69,18 +77,20 @@ auto transform_exclusive_scan( Impl::static_assert_is_not_openmptarget(ex); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); namespace KE = ::Kokkos::Experimental; - return Impl::transform_exclusive_scan_impl( + return Impl::transform_exclusive_scan_exespace_impl( "Kokkos::transform_exclusive_scan_custom_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), - init_value, binary_op, unary_op); + std::move(init_value), binary_op, unary_op); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + typename BinaryOpType, typename UnaryOpType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto transform_exclusive_scan( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -89,12 +99,56 @@ auto transform_exclusive_scan( Impl::static_assert_is_not_openmptarget(ex); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); - static_assert(std::is_move_constructible::value, + static_assert(std::is_move_constructible_v, "ValueType must be move constructible."); namespace KE = ::Kokkos::Experimental; - return Impl::transform_exclusive_scan_impl( + return Impl::transform_exclusive_scan_exespace_impl( label, ex, KE::cbegin(view_from), KE::cend(view_from), - KE::begin(view_dest), init_value, binary_op, unary_op); + KE::begin(view_dest), std::move(init_value), binary_op, unary_op); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template && :: + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType transform_exclusive_scan( + const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, ValueType init_value, + BinaryOpType binary_op, UnaryOpType unary_op) { + Impl::static_assert_is_not_openmptarget(teamHandle); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + return Impl::transform_exclusive_scan_team_impl( + teamHandle, first, last, first_dest, std::move(init_value), binary_op, + unary_op); +} + +template , int> = 0> +KOKKOS_FUNCTION auto transform_exclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value, BinaryOpType binary_op, UnaryOpType unary_op) { + Impl::static_assert_is_not_openmptarget(teamHandle); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::transform_exclusive_scan_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), std::move(init_value), binary_op, unary_op); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformInclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformInclusiveScan.hpp index 7489af7e37..5f694dbfd9 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformInclusiveScan.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformInclusiveScan.hpp @@ -23,40 +23,53 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // overload set 1 (no init value) -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -transform_inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - BinaryOpType binary_op, UnaryOpType unary_op) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType transform_inclusive_scan(const ExecutionSpace& ex, + InputIteratorType first, + InputIteratorType last, + OutputIteratorType first_dest, + BinaryOpType binary_op, + UnaryOpType unary_op) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::transform_inclusive_scan_impl( + return Impl::transform_inclusive_scan_exespace_impl( "Kokkos::transform_inclusive_scan_custom_functors_iterator_api", ex, first, last, first_dest, binary_op, unary_op); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -transform_inclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, BinaryOpType binary_op, - UnaryOpType unary_op) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType transform_inclusive_scan( + const std::string& label, const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOpType binary_op, UnaryOpType unary_op) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::transform_inclusive_scan_impl(label, ex, first, last, first_dest, - binary_op, unary_op); + return Impl::transform_inclusive_scan_exespace_impl( + label, ex, first, last, first_dest, binary_op, unary_op); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOpType, + typename UnaryOpType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto transform_inclusive_scan( const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -66,15 +79,17 @@ auto transform_inclusive_scan( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::transform_inclusive_scan_impl( + return Impl::transform_inclusive_scan_exespace_impl( "Kokkos::transform_inclusive_scan_custom_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), binary_op, unary_op); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOpType, + typename UnaryOpType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto transform_inclusive_scan( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -84,46 +99,59 @@ auto transform_inclusive_scan( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); namespace KE = ::Kokkos::Experimental; - return Impl::transform_inclusive_scan_impl( + return Impl::transform_inclusive_scan_exespace_impl( label, ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), binary_op, unary_op); } // overload set 2 (init value) -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -transform_inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, - InputIteratorType last, OutputIteratorType first_dest, - BinaryOpType binary_op, UnaryOpType unary_op, - ValueType init_value) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType transform_inclusive_scan( + const ExecutionSpace& ex, InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, BinaryOpType binary_op, UnaryOpType unary_op, + ValueType init_value) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::transform_inclusive_scan_impl( + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + return Impl::transform_inclusive_scan_exespace_impl( "Kokkos::transform_inclusive_scan_custom_functors_iterator_api", ex, - first, last, first_dest, binary_op, unary_op, init_value); + first, last, first_dest, binary_op, unary_op, std::move(init_value)); } -template -std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< - InputIteratorType, OutputIteratorType>::value, - OutputIteratorType> -transform_inclusive_scan(const std::string& label, const ExecutionSpace& ex, - InputIteratorType first, InputIteratorType last, - OutputIteratorType first_dest, BinaryOpType binary_op, - UnaryOpType unary_op, ValueType init_value) { +template && :: + Kokkos::is_execution_space_v, + int> = 0> +OutputIteratorType transform_inclusive_scan( + const std::string& label, const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOpType binary_op, UnaryOpType unary_op, ValueType init_value) { Impl::static_assert_is_not_openmptarget(ex); - return Impl::transform_inclusive_scan_impl(label, ex, first, last, first_dest, - binary_op, unary_op, init_value); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + return Impl::transform_inclusive_scan_exespace_impl( + label, ex, first, last, first_dest, binary_op, unary_op, + std::move(init_value)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOpType, + typename UnaryOpType, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto transform_inclusive_scan( const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -132,16 +160,21 @@ auto transform_inclusive_scan( Impl::static_assert_is_not_openmptarget(ex); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; - return Impl::transform_inclusive_scan_impl( + return Impl::transform_inclusive_scan_exespace_impl( "Kokkos::transform_inclusive_scan_custom_functors_view_api", ex, KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), - binary_op, unary_op, init_value); + binary_op, unary_op, std::move(init_value)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryOpType, + typename UnaryOpType, typename ValueType, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto transform_inclusive_scan( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view_from, @@ -150,10 +183,97 @@ auto transform_inclusive_scan( Impl::static_assert_is_not_openmptarget(ex); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; - return Impl::transform_inclusive_scan_impl( + return Impl::transform_inclusive_scan_exespace_impl( label, ex, KE::cbegin(view_from), KE::cend(view_from), - KE::begin(view_dest), binary_op, unary_op, init_value); + KE::begin(view_dest), binary_op, unary_op, std::move(init_value)); +} + +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// overload set 1 (no init value) +template && + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType transform_inclusive_scan( + const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOpType binary_op, UnaryOpType unary_op) { + Impl::static_assert_is_not_openmptarget(teamHandle); + + return Impl::transform_inclusive_scan_team_impl( + teamHandle, first, last, first_dest, binary_op, unary_op); +} + +template , int> = 0> +KOKKOS_FUNCTION auto transform_inclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOpType binary_op, UnaryOpType unary_op) { + Impl::static_assert_is_not_openmptarget(teamHandle); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::transform_inclusive_scan_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op, unary_op); +} + +// overload set 2 (init value) +template && + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIteratorType transform_inclusive_scan( + const TeamHandleType& teamHandle, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOpType binary_op, UnaryOpType unary_op, ValueType init_value) { + Impl::static_assert_is_not_openmptarget(teamHandle); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + return Impl::transform_inclusive_scan_team_impl( + teamHandle, first, last, first_dest, binary_op, unary_op, + std::move(init_value)); +} + +template , int> = 0> +KOKKOS_FUNCTION auto transform_inclusive_scan( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOpType binary_op, UnaryOpType unary_op, ValueType init_value) { + Impl::static_assert_is_not_openmptarget(teamHandle); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible_v, + "ValueType must be move constructible."); + + namespace KE = ::Kokkos::Experimental; + return Impl::transform_inclusive_scan_team_impl( + teamHandle, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op, unary_op, std::move(init_value)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformReduce.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformReduce.hpp index b5ec9066d2..101f5113f6 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformReduce.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformReduce.hpp @@ -23,34 +23,44 @@ namespace Kokkos { namespace Experimental { +// +// overload set accepting execution space +// + // ---------------------------- // overload set1: // no custom functors passed, so equivalent to // transform_reduce(first1, last1, first2, init, plus<>(), multiplies<>()); // ---------------------------- -template +template ::value, + int> = 0> ValueType transform_reduce(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, ValueType init_reduction_value) { - return Impl::transform_reduce_default_functors_impl( + return Impl::transform_reduce_default_functors_exespace_impl( "Kokkos::transform_reduce_default_functors_iterator_api", ex, first1, last1, first2, std::move(init_reduction_value)); } -template +template ::value, + int> = 0> ValueType transform_reduce(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, ValueType init_reduction_value) { - return Impl::transform_reduce_default_functors_impl( + return Impl::transform_reduce_default_functors_exespace_impl( label, ex, first1, last1, first2, std::move(init_reduction_value)); } // overload1 accepting views -template +template ::value, + int> = 0> ValueType transform_reduce( const ExecutionSpace& ex, const ::Kokkos::View& first_view, @@ -60,14 +70,16 @@ ValueType transform_reduce( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(first_view); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(second_view); - return Impl::transform_reduce_default_functors_impl( + return Impl::transform_reduce_default_functors_exespace_impl( "Kokkos::transform_reduce_default_functors_iterator_api", ex, KE::cbegin(first_view), KE::cend(first_view), KE::cbegin(second_view), std::move(init_reduction_value)); } -template +template ::value, + int> = 0> ValueType transform_reduce( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& first_view, @@ -77,7 +89,7 @@ ValueType transform_reduce( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(first_view); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(second_view); - return Impl::transform_reduce_default_functors_impl( + return Impl::transform_reduce_default_functors_exespace_impl( label, ex, KE::cbegin(first_view), KE::cend(first_view), KE::cbegin(second_view), std::move(init_reduction_value)); } @@ -95,8 +107,11 @@ ValueType transform_reduce( // https://en.cppreference.com/w/cpp/algorithm/transform_reduce // api accepting iterators -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename ValueType, typename BinaryJoinerType, typename BinaryTransform, + std::enable_if_t<::Kokkos::is_execution_space::value, int> = + 0> ValueType transform_reduce(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, ValueType init_reduction_value, @@ -105,14 +120,17 @@ ValueType transform_reduce(const ExecutionSpace& ex, IteratorType1 first1, static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( "Kokkos::transform_reduce_custom_functors_iterator_api", ex, first1, last1, first2, std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } -template +template < + typename ExecutionSpace, typename IteratorType1, typename IteratorType2, + typename ValueType, typename BinaryJoinerType, typename BinaryTransform, + std::enable_if_t<::Kokkos::is_execution_space::value, int> = + 0> ValueType transform_reduce(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, ValueType init_reduction_value, @@ -121,15 +139,17 @@ ValueType transform_reduce(const std::string& label, const ExecutionSpace& ex, static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( label, ex, first1, last1, first2, std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } // accepting views -template +template ::value, + int> = 0> ValueType transform_reduce( const ExecutionSpace& ex, const ::Kokkos::View& first_view, @@ -143,16 +163,18 @@ ValueType transform_reduce( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(first_view); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(second_view); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( "Kokkos::transform_reduce_custom_functors_view_api", ex, KE::cbegin(first_view), KE::cend(first_view), KE::cbegin(second_view), std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } -template +template ::value, + int> = 0> ValueType transform_reduce( const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& first_view, @@ -166,7 +188,7 @@ ValueType transform_reduce( Impl::static_assert_is_admissible_to_kokkos_std_algorithms(first_view); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(second_view); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( label, ex, KE::cbegin(first_view), KE::cend(first_view), KE::cbegin(second_view), std::move(init_reduction_value), std::move(joiner), std::move(transformer)); @@ -176,43 +198,50 @@ ValueType transform_reduce( // overload set3: // // accepting iterators -template -// need this to avoid ambiguous call -std::enable_if_t< - ::Kokkos::Experimental::Impl::are_iterators::value, ValueType> -transform_reduce(const ExecutionSpace& ex, IteratorType first1, - IteratorType last1, ValueType init_reduction_value, - BinaryJoinerType joiner, UnaryTransform transformer) { +template ::value && + is_execution_space::value, + int> = 0> +ValueType transform_reduce(const ExecutionSpace& ex, IteratorType first1, + IteratorType last1, ValueType init_reduction_value, + BinaryJoinerType joiner, + UnaryTransform transformer) { static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( "Kokkos::transform_reduce_custom_functors_iterator_api", ex, first1, last1, std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } -template -// need this to avoid ambiguous call -std::enable_if_t< - ::Kokkos::Experimental::Impl::are_iterators::value, ValueType> -transform_reduce(const std::string& label, const ExecutionSpace& ex, - IteratorType first1, IteratorType last1, - ValueType init_reduction_value, BinaryJoinerType joiner, - UnaryTransform transformer) { +template ::value && + is_execution_space::value, + int> = 0> +ValueType transform_reduce(const std::string& label, const ExecutionSpace& ex, + IteratorType first1, IteratorType last1, + ValueType init_reduction_value, + BinaryJoinerType joiner, + UnaryTransform transformer) { static_assert(std::is_move_constructible::value, "ValueType must be move constructible."); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( label, ex, first1, last1, std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } // accepting views -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ValueType, typename BinaryJoinerType, typename UnaryTransform, + std::enable_if_t<::Kokkos::is_execution_space::value, int> = + 0> ValueType transform_reduce(const ExecutionSpace& ex, const ::Kokkos::View& view, ValueType init_reduction_value, @@ -224,14 +253,17 @@ ValueType transform_reduce(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( "Kokkos::transform_reduce_custom_functors_view_api", ex, KE::cbegin(view), KE::cend(view), std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } -template +template < + typename ExecutionSpace, typename DataType, typename... Properties, + typename ValueType, typename BinaryJoinerType, typename UnaryTransform, + std::enable_if_t<::Kokkos::is_execution_space::value, int> = + 0> ValueType transform_reduce(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, ValueType init_reduction_value, @@ -243,12 +275,154 @@ ValueType transform_reduce(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::transform_reduce_custom_functors_impl( + return Impl::transform_reduce_custom_functors_exespace_impl( label, ex, KE::cbegin(view), KE::cend(view), std::move(init_reduction_value), std::move(joiner), std::move(transformer)); } +// +// overload set accepting a team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// + +// ---------------------------- +// overload set1: +// no custom functors passed, so equivalent to +// transform_reduce(first1, last1, first2, init, plus<>(), multiplies<>()); +// ---------------------------- +template < + typename TeamHandleType, typename IteratorType1, typename IteratorType2, + typename ValueType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType transform_reduce(const TeamHandleType& teamHandle, + IteratorType1 first1, + IteratorType1 last1, + IteratorType2 first2, + ValueType init_reduction_value) { + return Impl::transform_reduce_default_functors_team_impl( + teamHandle, first1, last1, first2, std::move(init_reduction_value)); +} + +// overload1 accepting views +template < + typename TeamHandleType, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType +transform_reduce(const TeamHandleType& teamHandle, + const ::Kokkos::View& first_view, + const ::Kokkos::View& second_view, + ValueType init_reduction_value) { + namespace KE = ::Kokkos::Experimental; + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(first_view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(second_view); + + return Impl::transform_reduce_default_functors_team_impl( + teamHandle, KE::cbegin(first_view), KE::cend(first_view), + KE::cbegin(second_view), std::move(init_reduction_value)); +} + +// +// overload set2: +// accepts a custom transform and joiner functor +// + +// Note the std refers to the arg BinaryReductionOp +// but in the Kokkos naming convention, it corresponds +// to a "joiner" that knows how to join two values +// NOTE: "joiner/transformer" need to be commutative. + +// https://en.cppreference.com/w/cpp/algorithm/transform_reduce + +// api accepting iterators +template < + typename TeamHandleType, typename IteratorType1, typename IteratorType2, + typename ValueType, typename BinaryJoinerType, typename BinaryTransform, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType transform_reduce( + const TeamHandleType& teamHandle, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, ValueType init_reduction_value, + BinaryJoinerType joiner, BinaryTransform transformer) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + return Impl::transform_reduce_custom_functors_team_impl( + teamHandle, first1, last1, first2, std::move(init_reduction_value), + std::move(joiner), std::move(transformer)); +} + +// accepting views +template < + typename TeamHandleType, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename ValueType, + typename BinaryJoinerType, typename BinaryTransform, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType +transform_reduce(const TeamHandleType& teamHandle, + const ::Kokkos::View& first_view, + const ::Kokkos::View& second_view, + ValueType init_reduction_value, BinaryJoinerType joiner, + BinaryTransform transformer) { + namespace KE = ::Kokkos::Experimental; + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(first_view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(second_view); + + return Impl::transform_reduce_custom_functors_team_impl( + teamHandle, KE::cbegin(first_view), KE::cend(first_view), + KE::cbegin(second_view), std::move(init_reduction_value), + std::move(joiner), std::move(transformer)); +} + +// +// overload set3: +// +// accepting iterators +template ::value && + is_team_handle::value, + int> = 0> +KOKKOS_FUNCTION ValueType transform_reduce(const TeamHandleType& teamHandle, + IteratorType first1, + IteratorType last1, + ValueType init_reduction_value, + BinaryJoinerType joiner, + UnaryTransform transformer) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + return Impl::transform_reduce_custom_functors_team_impl( + teamHandle, first1, last1, std::move(init_reduction_value), + std::move(joiner), std::move(transformer)); +} + +// accepting views +template < + typename TeamHandleType, typename DataType, typename... Properties, + typename ValueType, typename BinaryJoinerType, typename UnaryTransform, + std::enable_if_t<::Kokkos::is_team_handle::value, int> = 0> +KOKKOS_FUNCTION ValueType +transform_reduce(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + ValueType init_reduction_value, BinaryJoinerType joiner, + UnaryTransform transformer) { + namespace KE = ::Kokkos::Experimental; + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::transform_reduce_custom_functors_team_impl( + teamHandle, KE::cbegin(view), KE::cend(view), + std::move(init_reduction_value), std::move(joiner), + std::move(transformer)); +} + } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Unique.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Unique.hpp index b47ecffb20..2d56315f61 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Unique.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Unique.hpp @@ -23,71 +23,132 @@ namespace Kokkos { namespace Experimental { -// note: the enable_if below is to avoid "call to ... is ambiguous" -// for example in the unit test when using a variadic function - -// overload set1 -template -std::enable_if_t::value, IteratorType> unique( - const ExecutionSpace& ex, IteratorType first, IteratorType last) { - return Impl::unique_impl("Kokkos::unique_iterator_api_default", ex, first, - last); +// +// overload set1: default predicate, accepting execution space +// +template && + is_execution_space::value, + int> = 0> +IteratorType unique(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::unique_exespace_impl("Kokkos::unique_iterator_api_default", ex, + first, last); } -template -std::enable_if_t::value, IteratorType> unique( - const std::string& label, const ExecutionSpace& ex, IteratorType first, - IteratorType last) { - return Impl::unique_impl(label, ex, first, last); +template && + is_execution_space::value, + int> = 0> +IteratorType unique(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::unique_exespace_impl(label, ex, first, last); } -template +template ::value, int> = 0> auto unique(const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return ::Kokkos::Experimental::unique("Kokkos::unique_view_api_default", ex, - begin(view), end(view)); + return Impl::unique_exespace_impl("Kokkos::unique_view_api_default", ex, + begin(view), end(view)); } -template +template ::value, int> = 0> auto unique(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return ::Kokkos::Experimental::unique(label, ex, begin(view), end(view)); + return Impl::unique_exespace_impl(label, ex, begin(view), end(view)); } -// overload set2 -template +// +// overload set2: custom predicate, accepting execution space +// +template ::value, int> = 0> IteratorType unique(const ExecutionSpace& ex, IteratorType first, IteratorType last, BinaryPredicate pred) { - return Impl::unique_impl("Kokkos::unique_iterator_api_default", ex, first, - last, pred); + return Impl::unique_exespace_impl("Kokkos::unique_iterator_api_default", ex, + first, last, pred); } -template +template ::value, int> = 0> IteratorType unique(const std::string& label, const ExecutionSpace& ex, IteratorType first, IteratorType last, BinaryPredicate pred) { - return Impl::unique_impl(label, ex, first, last, pred); + return Impl::unique_exespace_impl(label, ex, first, last, pred); } -template +template ::value, int> = 0> auto unique(const ExecutionSpace& ex, const ::Kokkos::View& view, BinaryPredicate pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::unique_impl("Kokkos::unique_view_api_default", ex, begin(view), - end(view), std::move(pred)); + return Impl::unique_exespace_impl("Kokkos::unique_view_api_default", ex, + begin(view), end(view), std::move(pred)); } -template +template ::value, int> = 0> auto unique(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& view, BinaryPredicate pred) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); - return Impl::unique_impl(label, ex, begin(view), end(view), std::move(pred)); + return Impl::unique_exespace_impl(label, ex, begin(view), end(view), + std::move(pred)); +} + +// +// overload set3: default predicate, accepting team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template && + is_team_handle::value, + int> = 0> +KOKKOS_FUNCTION IteratorType unique(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last) { + return Impl::unique_team_impl(teamHandle, first, last); +} + +template ::value, int> = 0> +KOKKOS_FUNCTION auto unique( + const TeamHandleType& teamHandle, + const ::Kokkos::View& view) { + return Impl::unique_team_impl(teamHandle, begin(view), end(view)); +} + +// +// overload set4: custom predicate, accepting team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template ::value, int> = 0> +KOKKOS_FUNCTION IteratorType unique(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + BinaryPredicate pred) { + return Impl::unique_team_impl(teamHandle, first, last, std::move(pred)); +} + +template ::value, int> = 0> +KOKKOS_FUNCTION auto unique(const TeamHandleType& teamHandle, + const ::Kokkos::View& view, + BinaryPredicate pred) { + return Impl::unique_team_impl(teamHandle, begin(view), end(view), + std::move(pred)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_UniqueCopy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_UniqueCopy.hpp index bd2451c220..4a32d7e095 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_UniqueCopy.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_UniqueCopy.hpp @@ -23,67 +23,90 @@ namespace Kokkos { namespace Experimental { -// overload set1 -template -std::enable_if_t::value, OutputIterator> -unique_copy(const ExecutionSpace& ex, InputIterator first, InputIterator last, - OutputIterator d_first) { - return Impl::unique_copy_impl("Kokkos::unique_copy_iterator_api_default", ex, - first, last, d_first); +// +// overload set1: default predicate, accepting execution space +// +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t && + is_execution_space_v, + int> = 0> +OutputIterator unique_copy(const ExecutionSpace& ex, InputIterator first, + InputIterator last, OutputIterator d_first) { + return Impl::unique_copy_exespace_impl( + "Kokkos::unique_copy_iterator_api_default", ex, first, last, d_first); } -template -std::enable_if_t::value, OutputIterator> -unique_copy(const std::string& label, const ExecutionSpace& ex, - InputIterator first, InputIterator last, OutputIterator d_first) { - return Impl::unique_copy_impl(label, ex, first, last, d_first); +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + std::enable_if_t && + is_execution_space_v, + int> = 0> +OutputIterator unique_copy(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + OutputIterator d_first) { + return Impl::unique_copy_exespace_impl(label, ex, first, last, d_first); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto unique_copy(const ExecutionSpace& ex, const ::Kokkos::View& source, const ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return ::Kokkos::Experimental::unique_copy( - "Kokkos::unique_copy_view_api_default", ex, cbegin(source), cend(source), - begin(dest)); + return Impl::unique_copy_exespace_impl("Kokkos::unique_copy_view_api_default", + ex, cbegin(source), cend(source), + begin(dest)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto unique_copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, const ::Kokkos::View& dest) { Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return ::Kokkos::Experimental::unique_copy(label, ex, cbegin(source), - cend(source), begin(dest)); + return Impl::unique_copy_exespace_impl(label, ex, cbegin(source), + cend(source), begin(dest)); } -// overload set2 -template +// +// overload set2: custom predicate, accepting execution space +// + +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename BinaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator unique_copy(const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first, BinaryPredicate pred) { - return Impl::unique_copy_impl("Kokkos::unique_copy_iterator_api_default", ex, - first, last, d_first, pred); + return Impl::unique_copy_exespace_impl( + "Kokkos::unique_copy_iterator_api_default", ex, first, last, d_first, + pred); } -template +template < + typename ExecutionSpace, typename InputIterator, typename OutputIterator, + typename BinaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> OutputIterator unique_copy(const std::string& label, const ExecutionSpace& ex, InputIterator first, InputIterator last, OutputIterator d_first, BinaryPredicate pred) { - return Impl::unique_copy_impl(label, ex, first, last, d_first, pred); + return Impl::unique_copy_exespace_impl(label, ex, first, last, d_first, pred); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto unique_copy(const ExecutionSpace& ex, const ::Kokkos::View& source, const ::Kokkos::View& dest, @@ -91,13 +114,15 @@ auto unique_copy(const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::unique_copy_impl("Kokkos::unique_copy_view_api_default", ex, - cbegin(source), cend(source), begin(dest), - std::move(pred)); + return Impl::unique_copy_exespace_impl("Kokkos::unique_copy_view_api_default", + ex, cbegin(source), cend(source), + begin(dest), std::move(pred)); } -template +template < + typename ExecutionSpace, typename DataType1, typename... Properties1, + typename DataType2, typename... Properties2, typename BinaryPredicate, + std::enable_if_t<::Kokkos::is_execution_space_v, int> = 0> auto unique_copy(const std::string& label, const ExecutionSpace& ex, const ::Kokkos::View& source, const ::Kokkos::View& dest, @@ -105,8 +130,70 @@ auto unique_copy(const std::string& label, const ExecutionSpace& ex, Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); - return Impl::unique_copy_impl(label, ex, cbegin(source), cend(source), - begin(dest), std::move(pred)); + return Impl::unique_copy_exespace_impl( + label, ex, cbegin(source), cend(source), begin(dest), std::move(pred)); +} + +// +// overload set3: default predicate, accepting team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template < + typename TeamHandleType, typename InputIterator, typename OutputIterator, + std::enable_if_t && + Kokkos::is_team_handle_v, + int> = 0> +KOKKOS_FUNCTION OutputIterator unique_copy(const TeamHandleType& teamHandle, + InputIterator first, + InputIterator last, + OutputIterator d_first) { + return Impl::unique_copy_team_impl(teamHandle, first, last, d_first); +} + +template , int> = 0> +KOKKOS_FUNCTION auto unique_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + const ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::unique_copy_team_impl(teamHandle, cbegin(source), cend(source), + begin(dest)); +} + +// +// overload set4: custom predicate, accepting team handle +// Note: for now omit the overloads accepting a label +// since they cause issues on device because of the string allocation. +// +template , int> = 0> +KOKKOS_FUNCTION OutputIterator unique_copy(const TeamHandleType& teamHandle, + InputIterator first, + InputIterator last, + OutputIterator d_first, + BinaryPredicate pred) { + return Impl::unique_copy_team_impl(teamHandle, first, last, d_first, pred); +} + +template , int> = 0> +KOKKOS_FUNCTION auto unique_copy( + const TeamHandleType& teamHandle, + const ::Kokkos::View& source, + const ::Kokkos::View& dest, + BinaryPredicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::unique_copy_team_impl(teamHandle, cbegin(source), cend(source), + begin(dest), std::move(pred)); } } // namespace Experimental diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentDifference.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentDifference.hpp index 8a474508d7..a8171fa068 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentDifference.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentDifference.hpp @@ -63,14 +63,15 @@ struct StdAdjacentDiffFunctor { m_op(std::move(op)) {} }; +// +// exespace impl +// template -OutputIteratorType adjacent_difference_impl(const std::string& label, - const ExecutionSpace& ex, - InputIteratorType first_from, - InputIteratorType last_from, - OutputIteratorType first_dest, - BinaryOp bin_op) { +OutputIteratorType adjacent_difference_exespace_impl( + const std::string& label, const ExecutionSpace& ex, + InputIteratorType first_from, InputIteratorType last_from, + OutputIteratorType first_dest, BinaryOp bin_op) { // checks Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); Impl::static_assert_iterators_have_matching_difference_type(first_from, @@ -81,20 +82,45 @@ OutputIteratorType adjacent_difference_impl(const std::string& label, return first_dest; } - // aliases - using value_type = typename OutputIteratorType::value_type; - using aux_view_type = ::Kokkos::View; - using functor_t = - StdAdjacentDiffFunctor; + // run + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + ::Kokkos::parallel_for( + label, RangePolicy(ex, 0, num_elements), + StdAdjacentDiffFunctor(first_from, first_dest, bin_op)); + ex.fence("Kokkos::adjacent_difference: fence after operation"); + + // return + return first_dest + num_elements; +} + +// +// team impl +// +template +KOKKOS_FUNCTION OutputIteratorType adjacent_difference_team_impl( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest, + BinaryOp bin_op) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + if (first_from == last_from) { + return first_dest; + } // run const auto num_elements = Kokkos::Experimental::distance(first_from, last_from); - aux_view_type aux_view("aux_view", num_elements); - ::Kokkos::parallel_for(label, - RangePolicy(ex, 0, num_elements), - functor_t(first_from, first_dest, bin_op)); - ex.fence("Kokkos::adjacent_difference: fence after operation"); + ::Kokkos::parallel_for( + TeamThreadRange(teamHandle, 0, num_elements), + StdAdjacentDiffFunctor(first_from, first_dest, bin_op)); + teamHandle.team_barrier(); // return return first_dest + num_elements; diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentFind.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentFind.hpp index dd785e603b..f30b7be06a 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentFind.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentFind.hpp @@ -27,9 +27,9 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template +template struct StdAdjacentFindFunctor { + using index_type = typename IteratorType::difference_type; using red_value_type = typename ReducerType::value_type; IteratorType m_first; @@ -37,13 +37,13 @@ struct StdAdjacentFindFunctor { PredicateType m_p; KOKKOS_FUNCTION - void operator()(const IndexType i, red_value_type& red_value) const { + void operator()(const index_type i, red_value_type& red_value) const { const auto& my_value = m_first[i]; const auto& next_value = m_first[i + 1]; const bool are_equal = m_p(my_value, next_value); // FIXME_NVHPC using a ternary operator causes problems - red_value_type value = {::Kokkos::reduction_identity::min()}; + red_value_type value = {::Kokkos::reduction_identity::min()}; if (are_equal) { value.min_loc_true = i; } @@ -59,10 +59,14 @@ struct StdAdjacentFindFunctor { m_p(std::move(p)) {} }; +// +// exespace impl +// template -IteratorType adjacent_find_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType first, - IteratorType last, PredicateType pred) { +IteratorType adjacent_find_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, IteratorType last, + PredicateType pred) { // checks Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); @@ -76,8 +80,6 @@ IteratorType adjacent_find_impl(const std::string& label, using index_type = typename IteratorType::difference_type; using reducer_type = FirstLoc; using reduction_value_type = typename reducer_type::value_type; - using func_t = StdAdjacentFindFunctor; reduction_value_type red_result; reducer_type reducer(red_result); @@ -86,7 +88,8 @@ IteratorType adjacent_find_impl(const std::string& label, // each index i in the reduction checks i and (i+1). ::Kokkos::parallel_reduce( label, RangePolicy(ex, 0, num_elements - 1), - func_t(first, reducer, pred), reducer); + // use CTAD + StdAdjacentFindFunctor(first, reducer, pred), reducer); // fence not needed because reducing into scalar if (red_result.min_loc_true == @@ -98,12 +101,62 @@ IteratorType adjacent_find_impl(const std::string& label, } template -IteratorType adjacent_find_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType first, - IteratorType last) { +IteratorType adjacent_find_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last) { using value_type = typename IteratorType::value_type; using default_pred_t = StdAlgoEqualBinaryPredicate; - return adjacent_find_impl(label, ex, first, last, default_pred_t()); + return adjacent_find_exespace_impl(label, ex, first, last, default_pred_t()); +} + +// +// team impl +// +template +KOKKOS_FUNCTION IteratorType +adjacent_find_team_impl(const TeamHandleType& teamHandle, IteratorType first, + IteratorType last, PredicateType pred) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + const auto num_elements = Kokkos::Experimental::distance(first, last); + + if (num_elements <= 1) { + return last; + } + + using index_type = typename IteratorType::difference_type; + using reducer_type = FirstLoc; + using reduction_value_type = typename reducer_type::value_type; + + reduction_value_type red_result; + reducer_type reducer(red_result); + + // note that we use below num_elements-1 because + // each index i in the reduction checks i and (i+1). + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, num_elements - 1), + // use CTAD + StdAdjacentFindFunctor(first, reducer, pred), + reducer); + + teamHandle.team_barrier(); + + if (red_result.min_loc_true == + ::Kokkos::reduction_identity::min()) { + return last; + } else { + return first + red_result.min_loc_true; + } +} + +template +KOKKOS_FUNCTION IteratorType adjacent_find_team_impl( + const TeamHandleType& teamHandle, IteratorType first, IteratorType last) { + using value_type = typename IteratorType::value_type; + using default_pred_t = StdAlgoEqualBinaryPredicate; + return adjacent_find_team_impl(teamHandle, first, last, default_pred_t()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AllOfAnyOfNoneOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AllOfAnyOfNoneOf.hpp index ad562070a0..bdc050f9c1 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AllOfAnyOfNoneOf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AllOfAnyOfNoneOf.hpp @@ -23,23 +23,58 @@ namespace Kokkos { namespace Experimental { namespace Impl { +// +// exespace impl +// template -bool all_of_impl(const std::string& label, const ExecutionSpace& ex, - InputIterator first, InputIterator last, Predicate predicate) { - return (find_if_or_not_impl(label, ex, first, last, predicate) == - last); +bool all_of_exespace_impl(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + Predicate predicate) { + return (find_if_or_not_exespace_impl(label, ex, first, last, + predicate) == last); } template -bool any_of_impl(const std::string& label, const ExecutionSpace& ex, - InputIterator first, InputIterator last, Predicate predicate) { - return (find_if_or_not_impl(label, ex, first, last, predicate) != last); +bool any_of_exespace_impl(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + Predicate predicate) { + return (find_if_or_not_exespace_impl(label, ex, first, last, + predicate) != last); } template -bool none_of_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last, Predicate predicate) { - return (find_if_or_not_impl(label, ex, first, last, predicate) == last); +bool none_of_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + Predicate predicate) { + return (find_if_or_not_exespace_impl(label, ex, first, last, + predicate) == last); +} + +// +// team impl +// +template +KOKKOS_FUNCTION bool all_of_team_impl(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + Predicate predicate) { + return (find_if_or_not_team_impl(teamHandle, first, last, predicate) == + last); +} + +template +KOKKOS_FUNCTION bool any_of_team_impl(const TeamHandleType& teamHandle, + InputIterator first, InputIterator last, + Predicate predicate) { + return (find_if_or_not_team_impl(teamHandle, first, last, predicate) != + last); +} + +template +KOKKOS_FUNCTION bool none_of_team_impl(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + Predicate predicate) { + return (find_if_or_not_team_impl(teamHandle, first, last, predicate) == + last); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Constraints.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Constraints.hpp index 0376100410..27ce5a6fad 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Constraints.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Constraints.hpp @@ -55,6 +55,9 @@ using iterator_category_t = typename T::iterator_category; template using is_iterator = Kokkos::is_detected; +template +inline constexpr bool is_iterator_v = is_iterator::value; + // // are_iterators // @@ -63,15 +66,18 @@ struct are_iterators; template struct are_iterators { - static constexpr bool value = is_iterator::value; + static constexpr bool value = is_iterator_v; }; template struct are_iterators { static constexpr bool value = - are_iterators::value && are_iterators::value; + are_iterators::value && (are_iterators::value && ... && true); }; +template +inline constexpr bool are_iterators_v = are_iterators::value; + // // are_random_access_iterators // @@ -81,17 +87,21 @@ struct are_random_access_iterators; template struct are_random_access_iterators { static constexpr bool value = - is_iterator::value && - std::is_base_of::value; + is_iterator_v && std::is_base_of::value; }; template struct are_random_access_iterators { - static constexpr bool value = are_random_access_iterators::value && - are_random_access_iterators::value; + static constexpr bool value = + are_random_access_iterators::value && + (are_random_access_iterators::value && ... && true); }; +template +inline constexpr bool are_random_access_iterators_v = + are_random_access_iterators::value; + // // iterators_are_accessible_from // @@ -113,16 +123,18 @@ struct iterators_are_accessible_from { iterators_are_accessible_from::value; }; -template +template KOKKOS_INLINE_FUNCTION constexpr void -static_assert_random_access_and_accessible(const ExecutionSpace& /* ex */, - IteratorTypes... /* iterators */) { +static_assert_random_access_and_accessible( + const ExecutionSpaceOrTeamHandleType& /* ex_or_th*/, + IteratorTypes... /* iterators */) { static_assert( are_random_access_iterators::value, "Currently, Kokkos standard algorithms require random access iterators."); - static_assert( - iterators_are_accessible_from::value, - "Incompatible view/iterator and execution space"); + static_assert(iterators_are_accessible_from< + typename ExecutionSpaceOrTeamHandleType::execution_space, + IteratorTypes...>::value, + "Incompatible view/iterator and execution space"); } // @@ -182,10 +194,10 @@ struct not_openmptarget { #endif }; -template +template KOKKOS_INLINE_FUNCTION constexpr void static_assert_is_not_openmptarget( - const ExecutionSpace&) { - static_assert(not_openmptarget::value, + const ExecutionSpaceOrTeamHandleType& /*ex_or_th*/) { + static_assert(not_openmptarget::value, "Currently, Kokkos standard algorithms do not support custom " "comparators in OpenMPTarget"); } @@ -194,7 +206,8 @@ KOKKOS_INLINE_FUNCTION constexpr void static_assert_is_not_openmptarget( // valid range // template -void expect_valid_range(IteratorType first, IteratorType last) { +KOKKOS_INLINE_FUNCTION void expect_valid_range(IteratorType first, + IteratorType last) { // this is a no-op for release KOKKOS_EXPECTS(last >= first); // avoid compiler complaining when KOKKOS_EXPECTS is no-op diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyBackward.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyBackward.hpp index b3adbc5e2d..0f68c9e978 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyBackward.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyBackward.hpp @@ -27,16 +27,18 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template +template struct StdCopyBackwardFunctor { - static_assert(std::is_signed::value, - "Kokkos: StdCopyBackwardFunctor requires signed index type"); + // we can use difference type from IteratorType1 since + // the calling functions below already static assert that + // the iterators have matching difference type + using index_type = typename IteratorType1::difference_type; IteratorType1 m_last; IteratorType2 m_dest_last; KOKKOS_FUNCTION - void operator()(IndexType i) const { m_dest_last[-i - 1] = m_last[-i - 1]; } + void operator()(index_type i) const { m_dest_last[-i - 1] = m_last[-i - 1]; } KOKKOS_FUNCTION StdCopyBackwardFunctor(IteratorType1 _last, IteratorType2 _dest_last) @@ -44,30 +46,51 @@ struct StdCopyBackwardFunctor { }; template -IteratorType2 copy_backward_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType1 first, - IteratorType1 last, IteratorType2 d_last) { +IteratorType2 copy_backward_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType1 first, + IteratorType1 last, + IteratorType2 d_last) { // checks Impl::static_assert_random_access_and_accessible(ex, first, d_last); Impl::static_assert_iterators_have_matching_difference_type(first, d_last); Impl::expect_valid_range(first, last); - // aliases - using index_type = typename IteratorType1::difference_type; - using func_t = - StdCopyBackwardFunctor; - // run const auto num_elements = Kokkos::Experimental::distance(first, last); ::Kokkos::parallel_for(label, RangePolicy(ex, 0, num_elements), - func_t(last, d_last)); + // use CTAD + StdCopyBackwardFunctor(last, d_last)); ex.fence("Kokkos::copy_backward: fence after operation"); // return return d_last - num_elements; } +// +// team-level impl +// +template +KOKKOS_FUNCTION IteratorType2 +copy_backward_team_impl(const TeamHandleType& teamHandle, IteratorType1 first, + IteratorType1 last, IteratorType2 d_last) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first, d_last); + Impl::static_assert_iterators_have_matching_difference_type(first, d_last); + Impl::expect_valid_range(first, last); + + // run + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_for(TeamThreadRange(teamHandle, 0, num_elements), + // use CTAD + StdCopyBackwardFunctor(last, d_last)); + teamHandle.team_barrier(); + + // return + return d_last - num_elements; +} + } // namespace Impl } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyCopyN.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyCopyN.hpp index 1b120c46d0..86e99ecbd0 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyCopyN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyCopyN.hpp @@ -27,13 +27,18 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template +template struct StdCopyFunctor { + // we can use difference type from InputIterator since + // the calling functions below already static assert that + // the iterators have matching difference type + using index_type = typename InputIterator::difference_type; + InputIterator m_first; OutputIterator m_dest_first; KOKKOS_FUNCTION - void operator()(IndexType i) const { m_dest_first[i] = m_first[i]; } + void operator()(index_type i) const { m_dest_first[i] = m_first[i]; } KOKKOS_FUNCTION StdCopyFunctor(InputIterator _first, OutputIterator _dest_first) @@ -41,23 +46,20 @@ struct StdCopyFunctor { }; template -OutputIterator copy_impl(const std::string& label, const ExecutionSpace& ex, - InputIterator first, InputIterator last, - OutputIterator d_first) { +OutputIterator copy_exespace_impl(const std::string& label, + const ExecutionSpace& ex, InputIterator first, + InputIterator last, OutputIterator d_first) { // checks Impl::static_assert_random_access_and_accessible(ex, first, d_first); Impl::static_assert_iterators_have_matching_difference_type(first, d_first); Impl::expect_valid_range(first, last); - // aliases - using index_type = typename InputIterator::difference_type; - using func_t = StdCopyFunctor; - // run const auto num_elements = Kokkos::Experimental::distance(first, last); ::Kokkos::parallel_for(label, RangePolicy(ex, 0, num_elements), - func_t(first, d_first)); + // use CTAD + StdCopyFunctor(first, d_first)); ex.fence("Kokkos::copy: fence after operation"); // return @@ -66,16 +68,61 @@ OutputIterator copy_impl(const std::string& label, const ExecutionSpace& ex, template -OutputIterator copy_n_impl(const std::string& label, const ExecutionSpace& ex, - InputIterator first_from, Size count, - OutputIterator first_dest) { +OutputIterator copy_n_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + InputIterator first_from, Size count, + OutputIterator first_dest) { // checks Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); Impl::static_assert_iterators_have_matching_difference_type(first_from, first_dest); if (count > 0) { - return copy_impl(label, ex, first_from, first_from + count, first_dest); + return copy_exespace_impl(label, ex, first_from, first_from + count, + first_dest); + } else { + return first_dest; + } +} + +// +// team-level impl +// +template +KOKKOS_FUNCTION OutputIterator copy_team_impl(const TeamHandleType& teamHandle, + InputIterator first, + InputIterator last, + OutputIterator d_first) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first, d_first); + Impl::static_assert_iterators_have_matching_difference_type(first, d_first); + Impl::expect_valid_range(first, last); + + // run + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_for(TeamThreadRange(teamHandle, 0, num_elements), + // use CTAD + StdCopyFunctor(first, d_first)); + teamHandle.team_barrier(); + + // return + return d_first + num_elements; +} + +template +KOKKOS_FUNCTION OutputIterator +copy_n_team_impl(const TeamHandleType& teamHandle, InputIterator first_from, + Size count, OutputIterator first_dest) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + + if (count > 0) { + return copy_team_impl(teamHandle, first_from, first_from + count, + first_dest); } else { return first_dest; } diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyIf.hpp index 3c0c4f7e9b..3c1e2474bc 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyIf.hpp @@ -20,6 +20,7 @@ #include #include "Kokkos_Constraints.hpp" #include "Kokkos_HelperPredicates.hpp" +#include "Kokkos_MustUseKokkosSingleInTeam.hpp" #include #include @@ -27,8 +28,10 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template +template struct StdCopyIfFunctor { + using index_type = typename FirstFrom::difference_type; + FirstFrom m_first_from; FirstDest m_first_dest; PredType m_pred; @@ -40,7 +43,7 @@ struct StdCopyIfFunctor { m_pred(std::move(pred)) {} KOKKOS_FUNCTION - void operator()(const IndexType i, IndexType& update, + void operator()(const index_type i, index_type& update, const bool final_pass) const { const auto& myval = m_first_from[i]; if (final_pass) { @@ -57,9 +60,11 @@ struct StdCopyIfFunctor { template -OutputIterator copy_if_impl(const std::string& label, const ExecutionSpace& ex, - InputIterator first, InputIterator last, - OutputIterator d_first, PredicateType pred) { +OutputIterator copy_if_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + InputIterator first, InputIterator last, + OutputIterator d_first, + PredicateType pred) { /* To explain the impl, suppose that our data is: @@ -90,23 +95,67 @@ OutputIterator copy_if_impl(const std::string& label, const ExecutionSpace& ex, if (first == last) { return d_first; } else { - // aliases - using index_type = typename InputIterator::difference_type; - using func_type = StdCopyIfFunctor; - // run const auto num_elements = Kokkos::Experimental::distance(first, last); - index_type count = 0; + + typename InputIterator::difference_type count = 0; ::Kokkos::parallel_scan(label, RangePolicy(ex, 0, num_elements), - func_type(first, d_first, pred), count); + // use CTAD + StdCopyIfFunctor(first, d_first, pred), count); // fence not needed because of the scan accumulating into count return d_first + count; } } +template +KOKKOS_FUNCTION OutputIterator copy_if_team_impl( + const TeamHandleType& teamHandle, InputIterator first, InputIterator last, + OutputIterator d_first, PredicateType pred) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first, d_first); + Impl::static_assert_iterators_have_matching_difference_type(first, d_first); + Impl::expect_valid_range(first, last); + + if (first == last) { + return d_first; + } + + const std::size_t num_elements = Kokkos::Experimental::distance(first, last); + if constexpr (stdalgo_must_use_kokkos_single_for_team_scan_v< + typename TeamHandleType::execution_space>) { + std::size_t count = 0; + Kokkos::single( + Kokkos::PerTeam(teamHandle), + [=](std::size_t& lcount) { + lcount = 0; + for (std::size_t i = 0; i < num_elements; ++i) { + const auto& myval = first[i]; + if (pred(myval)) { + d_first[lcount++] = myval; + } + } + }, + count); + // no barrier needed since single above broadcasts to all members + return d_first + count; + + } else { + typename InputIterator::difference_type count = 0; + ::Kokkos::parallel_scan(TeamThreadRange(teamHandle, 0, num_elements), + StdCopyIfFunctor(first, d_first, pred), count); + // no barrier needed because of the scan accumulating into count + return d_first + count; + } + +#if defined KOKKOS_COMPILER_INTEL || \ + (defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130) + __builtin_unreachable(); +#endif +} + } // namespace Impl } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CountCountIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CountCountIf.hpp index 18b8c46359..9b6b403aa4 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CountCountIf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CountCountIf.hpp @@ -46,37 +46,65 @@ struct StdCountIfFunctor { }; template -typename IteratorType::difference_type count_if_impl(const std::string& label, - const ExecutionSpace& ex, - IteratorType first, - IteratorType last, - Predicate predicate) { +typename IteratorType::difference_type count_if_exespace_impl( + const std::string& label, const ExecutionSpace& ex, IteratorType first, + IteratorType last, Predicate predicate) { // checks Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); - // aliases - using func_t = StdCountIfFunctor; - // run const auto num_elements = Kokkos::Experimental::distance(first, last); typename IteratorType::difference_type count = 0; ::Kokkos::parallel_reduce(label, RangePolicy(ex, 0, num_elements), - func_t(first, predicate), count); + // use CTAD + StdCountIfFunctor(first, predicate), count); ex.fence("Kokkos::count_if: fence after operation"); return count; } template -auto count_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last, const T& value) { - return count_if_impl( +auto count_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + const T& value) { + return count_if_exespace_impl( label, ex, first, last, ::Kokkos::Experimental::Impl::StdAlgoEqualsValUnaryPredicate(value)); } +// +// team-level impl +// +template +KOKKOS_FUNCTION typename IteratorType::difference_type count_if_team_impl( + const TeamHandleType& teamHandle, IteratorType first, IteratorType last, + Predicate predicate) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + // run + const auto num_elements = Kokkos::Experimental::distance(first, last); + typename IteratorType::difference_type count = 0; + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, num_elements), + // use CTAD + StdCountIfFunctor(first, predicate), count); + teamHandle.team_barrier(); + + return count; +} + +template +KOKKOS_FUNCTION auto count_team_impl(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + const T& value) { + return count_if_team_impl( + teamHandle, first, last, + ::Kokkos::Experimental::Impl::StdAlgoEqualsValUnaryPredicate(value)); +} + } // namespace Impl } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Equal.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Equal.hpp index e045080d4a..62b7d226f6 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Equal.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Equal.hpp @@ -27,15 +27,16 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template +template struct StdEqualFunctor { + using index_type = typename IteratorType1::difference_type; + IteratorType1 m_first1; IteratorType2 m_first2; BinaryPredicateType m_predicate; KOKKOS_FUNCTION - void operator()(IndexType i, std::size_t& lsum) const { + void operator()(index_type i, std::size_t& lsum) const { if (!m_predicate(m_first1[i], m_first2[i])) { lsum = 1; } @@ -49,67 +50,130 @@ struct StdEqualFunctor { m_predicate(std::move(_predicate)) {} }; +// +// exespace impl +// template -bool equal_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, - BinaryPredicateType predicate) { +bool equal_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, BinaryPredicateType predicate) { // checks Impl::static_assert_random_access_and_accessible(ex, first1, first2); Impl::static_assert_iterators_have_matching_difference_type(first1, first2); Impl::expect_valid_range(first1, last1); - // aliases - using index_type = typename IteratorType1::difference_type; - using func_t = StdEqualFunctor; - // run const auto num_elements = Kokkos::Experimental::distance(first1, last1); std::size_t different = 0; - ::Kokkos::parallel_reduce(label, - RangePolicy(ex, 0, num_elements), - func_t(first1, first2, predicate), different); + ::Kokkos::parallel_reduce( + label, RangePolicy(ex, 0, num_elements), + StdEqualFunctor(first1, first2, predicate), different); ex.fence("Kokkos::equal: fence after operation"); return !different; } template -bool equal_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2) { +bool equal_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2) { using value_type1 = typename IteratorType1::value_type; using value_type2 = typename IteratorType2::value_type; using pred_t = StdAlgoEqualBinaryPredicate; - return equal_impl(label, ex, first1, last1, first2, pred_t()); + return equal_exespace_impl(label, ex, first1, last1, first2, pred_t()); } template -bool equal_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, - IteratorType2 last2, BinaryPredicateType predicate) { +bool equal_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { const auto d1 = ::Kokkos::Experimental::distance(first1, last1); const auto d2 = ::Kokkos::Experimental::distance(first2, last2); if (d1 != d2) { return false; } - return equal_impl(label, ex, first1, last1, first2, predicate); + return equal_exespace_impl(label, ex, first1, last1, first2, predicate); } template -bool equal_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType1 first1, IteratorType1 last1, IteratorType2 first2, - IteratorType2 last2) { +bool equal_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { Impl::expect_valid_range(first1, last1); Impl::expect_valid_range(first2, last2); using value_type1 = typename IteratorType1::value_type; using value_type2 = typename IteratorType2::value_type; using pred_t = StdAlgoEqualBinaryPredicate; - return equal_impl(label, ex, first1, last1, first2, last2, pred_t()); + return equal_exespace_impl(label, ex, first1, last1, first2, last2, pred_t()); +} + +// +// team impl +// +template +KOKKOS_FUNCTION bool equal_team_impl(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, + BinaryPredicateType predicate) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first1, first2); + Impl::static_assert_iterators_have_matching_difference_type(first1, first2); + Impl::expect_valid_range(first1, last1); + + // run + const auto num_elements = Kokkos::Experimental::distance(first1, last1); + std::size_t different = 0; + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, num_elements), + StdEqualFunctor(first1, first2, predicate), + different); + teamHandle.team_barrier(); + + return !different; +} + +template +KOKKOS_FUNCTION bool equal_team_impl(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2) { + using value_type1 = typename IteratorType1::value_type; + using value_type2 = typename IteratorType2::value_type; + using pred_t = StdAlgoEqualBinaryPredicate; + return equal_team_impl(teamHandle, first1, last1, first2, pred_t()); +} + +template +KOKKOS_FUNCTION bool equal_team_impl(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + const auto d1 = ::Kokkos::Experimental::distance(first1, last1); + const auto d2 = ::Kokkos::Experimental::distance(first2, last2); + if (d1 != d2) { + return false; + } + + return equal_team_impl(teamHandle, first1, last1, first2, predicate); +} + +template +KOKKOS_FUNCTION bool equal_team_impl(const TeamHandleType& teamHandle, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, + IteratorType2 last2) { + Impl::expect_valid_range(first1, last1); + Impl::expect_valid_range(first2, last2); + + using value_type1 = typename IteratorType1::value_type; + using value_type2 = typename IteratorType2::value_type; + using pred_t = StdAlgoEqualBinaryPredicate; + return equal_team_impl(teamHandle, first1, last1, first2, last2, pred_t()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ExclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ExclusiveScan.hpp index 71f13e490a..6da992b4bb 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ExclusiveScan.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ExclusiveScan.hpp @@ -22,6 +22,7 @@ #include "Kokkos_HelperPredicates.hpp" #include "Kokkos_ValueWrapperForNoNeutralElement.hpp" #include "Kokkos_IdentityReferenceUnaryFunctor.hpp" +#include "Kokkos_FunctorsForExclusiveScan.hpp" #include #include #include @@ -30,127 +31,15 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template -struct ExclusiveScanDefaultFunctorForKnownNeutralElement { - using execution_space = ExeSpace; - - ValueType m_init_value; - FirstFrom m_first_from; - FirstDest m_first_dest; - - KOKKOS_FUNCTION - ExclusiveScanDefaultFunctorForKnownNeutralElement(ValueType init, - FirstFrom first_from, - FirstDest first_dest) - : m_init_value(std::move(init)), - m_first_from(std::move(first_from)), - m_first_dest(std::move(first_dest)) {} - - KOKKOS_FUNCTION - void operator()(const IndexType i, ValueType& update, - const bool final_pass) const { - if (final_pass) m_first_dest[i] = update + m_init_value; - update += m_first_from[i]; - } -}; - -template -struct ExclusiveScanDefaultFunctor { - using execution_space = ExeSpace; - using value_type = - ::Kokkos::Experimental::Impl::ValueWrapperForNoNeutralElement; - - ValueType m_init_value; - FirstFrom m_first_from; - FirstDest m_first_dest; - - KOKKOS_FUNCTION - ExclusiveScanDefaultFunctor(ValueType init, FirstFrom first_from, - FirstDest first_dest) - : m_init_value(std::move(init)), - m_first_from(std::move(first_from)), - m_first_dest(std::move(first_dest)) {} - - KOKKOS_FUNCTION - void operator()(const IndexType i, value_type& update, - const bool final_pass) const { - if (final_pass) { - if (i == 0) { - m_first_dest[i] = m_init_value; - } else { - m_first_dest[i] = update.val + m_init_value; - } - } - - const auto tmp = value_type{m_first_from[i], false}; - this->join(update, tmp); - } - - KOKKOS_FUNCTION - void init(value_type& update) const { - update.val = {}; - update.is_initial = true; - } - - KOKKOS_FUNCTION - void join(value_type& update, const value_type& input) const { - if (input.is_initial) return; - - if (update.is_initial) { - update.val = input.val; - update.is_initial = false; - } else { - update.val = update.val + input.val; - } - } -}; - -template -OutputIteratorType exclusive_scan_custom_op_impl( - const std::string& label, const ExecutionSpace& ex, - InputIteratorType first_from, InputIteratorType last_from, - OutputIteratorType first_dest, ValueType init_value, BinaryOpType bop) { - // checks - Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); - Impl::static_assert_iterators_have_matching_difference_type(first_from, - first_dest); - Impl::expect_valid_range(first_from, last_from); - - // aliases - using index_type = typename InputIteratorType::difference_type; - using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; - using func_type = - TransformExclusiveScanFunctor; - - // run - const auto num_elements = - Kokkos::Experimental::distance(first_from, last_from); - ::Kokkos::parallel_scan( - label, RangePolicy(ex, 0, num_elements), - func_type(init_value, first_from, first_dest, bop, unary_op_type())); - ex.fence("Kokkos::exclusive_scan_custom_op: fence after operation"); - - // return - return first_dest + num_elements; -} - -template -using ex_scan_has_reduction_identity_sum_t = - decltype(Kokkos::reduction_identity::sum()); - +// +// exespace impl +// template -OutputIteratorType exclusive_scan_default_op_impl(const std::string& label, - const ExecutionSpace& ex, - InputIteratorType first_from, - InputIteratorType last_from, - OutputIteratorType first_dest, - ValueType init_value) { +OutputIteratorType exclusive_scan_default_op_exespace_impl( + const std::string& label, const ExecutionSpace& ex, + InputIteratorType first_from, InputIteratorType last_from, + OutputIteratorType first_dest, ValueType init_value) { // checks Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); Impl::static_assert_iterators_have_matching_difference_type(first_from, @@ -184,17 +73,122 @@ OutputIteratorType exclusive_scan_default_op_impl(const std::string& label, ExclusiveScanDefaultFunctorForKnownNeutralElement< ExecutionSpace, index_type, ValueType, InputIteratorType, OutputIteratorType>, - ExclusiveScanDefaultFunctor>; + ExclusiveScanDefaultFunctorWithValueWrapper>; + + // run + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + ::Kokkos::parallel_scan( + label, RangePolicy(ex, 0, num_elements), + func_type(std::move(init_value), first_from, first_dest)); + + ex.fence("Kokkos::exclusive_scan_default_op: fence after operation"); + + return first_dest + num_elements; +} + +template +OutputIteratorType exclusive_scan_custom_op_exespace_impl( + const std::string& label, const ExecutionSpace& ex, + InputIteratorType first_from, InputIteratorType last_from, + OutputIteratorType first_dest, ValueType init_value, BinaryOpType bop) { + // checks + Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + // aliases + using index_type = typename InputIteratorType::difference_type; + using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; + using func_type = TransformExclusiveScanFunctorWithValueWrapper< + ExecutionSpace, index_type, ValueType, InputIteratorType, + OutputIteratorType, BinaryOpType, unary_op_type>; // run const auto num_elements = Kokkos::Experimental::distance(first_from, last_from); ::Kokkos::parallel_scan(label, RangePolicy(ex, 0, num_elements), - func_type(init_value, first_from, first_dest)); + func_type(std::move(init_value), first_from, + first_dest, bop, unary_op_type())); + ex.fence("Kokkos::exclusive_scan_custom_op: fence after operation"); - ex.fence("Kokkos::exclusive_scan_default_op: fence after operation"); + // return + return first_dest + num_elements; +} + +// +// team impl +// +template +KOKKOS_FUNCTION OutputIteratorType exclusive_scan_default_op_team_impl( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest, + ValueType init_value) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + static_assert( + ::Kokkos::is_detected_v, + "The team-level impl of Kokkos::Experimental::exclusive_scan currently " + "does not support types without reduction identity"); + + // aliases + using exe_space = typename TeamHandleType::execution_space; + using index_type = typename InputIteratorType::difference_type; + using func_type = ExclusiveScanDefaultFunctorForKnownNeutralElement< + exe_space, index_type, ValueType, InputIteratorType, OutputIteratorType>; + + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + ::Kokkos::parallel_scan( + TeamThreadRange(teamHandle, 0, num_elements), + func_type(std::move(init_value), first_from, first_dest)); + teamHandle.team_barrier(); + return first_dest + num_elements; +} + +template +KOKKOS_FUNCTION OutputIteratorType exclusive_scan_custom_op_team_impl( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest, + ValueType init_value, BinaryOpType bop) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + static_assert( + ::Kokkos::is_detected_v, + "The team-level impl of Kokkos::Experimental::exclusive_scan currently " + "does not support types without reduction identity"); + + // aliases + using exe_space = typename TeamHandleType::execution_space; + using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; + using index_type = typename InputIteratorType::difference_type; + using func_type = TransformExclusiveScanFunctorWithoutValueWrapper< + exe_space, index_type, ValueType, InputIteratorType, OutputIteratorType, + BinaryOpType, unary_op_type>; + + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + ::Kokkos::parallel_scan(TeamThreadRange(teamHandle, 0, num_elements), + func_type(std::move(init_value), first_from, + first_dest, bop, unary_op_type())); + teamHandle.team_barrier(); return first_dest + num_elements; } diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FillFillN.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FillFillN.hpp index 316d865f31..972e57f2cc 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FillFillN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FillFillN.hpp @@ -41,9 +41,12 @@ struct StdFillFunctor { : m_first(std::move(_first)), m_value(std::move(_value)) {} }; +// +// exespace impl +// template -void fill_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last, const T& value) { +void fill_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, const T& value) { // checks Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); @@ -52,13 +55,14 @@ void fill_impl(const std::string& label, const ExecutionSpace& ex, const auto num_elements = Kokkos::Experimental::distance(first, last); ::Kokkos::parallel_for(label, RangePolicy(ex, 0, num_elements), - StdFillFunctor(first, value)); + StdFillFunctor(first, value)); ex.fence("Kokkos::fill: fence after operation"); } template -IteratorType fill_n_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, SizeType n, const T& value) { +IteratorType fill_n_exespace_impl(const std::string& label, + const ExecutionSpace& ex, IteratorType first, + SizeType n, const T& value) { auto last = first + n; Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); @@ -67,7 +71,40 @@ IteratorType fill_n_impl(const std::string& label, const ExecutionSpace& ex, return first; } - fill_impl(label, ex, first, last, value); + fill_exespace_impl(label, ex, first, last, value); + return last; +} + +// +// team-level impl +// +template +KOKKOS_FUNCTION void fill_team_impl(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + const T& value) { + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_for(TeamThreadRange(teamHandle, 0, num_elements), + StdFillFunctor(first, value)); + + teamHandle.team_barrier(); +} + +template +KOKKOS_FUNCTION IteratorType fill_n_team_impl(const TeamHandleType& teamHandle, + IteratorType first, SizeType n, + const T& value) { + auto last = first + n; + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + if (n <= 0) { + return first; + } + + fill_team_impl(teamHandle, first, last, value); return last; } diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindEnd.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindEnd.hpp index 3ec64fa43d..1f1ec5e54f 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindEnd.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindEnd.hpp @@ -80,12 +80,17 @@ struct StdFindEndFunctor { m_p(std::move(p)) {} }; +// +// exespace impl +// template -IteratorType1 find_end_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType1 first, IteratorType1 last, - IteratorType2 s_first, IteratorType2 s_last, - const BinaryPredicateType& pred) { +IteratorType1 find_end_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last, + const BinaryPredicateType& pred) { // checks Impl::static_assert_random_access_and_accessible(ex, first, s_first); Impl::static_assert_iterators_have_matching_difference_type(first, s_first); @@ -97,7 +102,6 @@ IteratorType1 find_end_impl(const std::string& label, const ExecutionSpace& ex, const auto num_elements = KE::distance(first, last); const auto s_count = KE::distance(s_first, s_last); KOKKOS_EXPECTS(num_elements >= s_count); - (void)s_count; // needed when macro above is a no-op if (s_first == s_last) { return last; @@ -109,7 +113,8 @@ IteratorType1 find_end_impl(const std::string& label, const ExecutionSpace& ex, // special case where the two ranges have equal size if (num_elements == s_count) { - const auto equal_result = equal_impl(label, ex, first, last, s_first, pred); + const auto equal_result = + equal_exespace_impl(label, ex, first, last, s_first, pred); return (equal_result) ? first : last; } else { using index_type = typename IteratorType1::difference_type; @@ -148,14 +153,97 @@ IteratorType1 find_end_impl(const std::string& label, const ExecutionSpace& ex, } template -IteratorType1 find_end_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType1 first, IteratorType1 last, - IteratorType2 s_first, IteratorType2 s_last) { +IteratorType1 find_end_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, + IteratorType2 s_last) { using value_type1 = typename IteratorType1::value_type; using value_type2 = typename IteratorType2::value_type; using predicate_type = StdAlgoEqualBinaryPredicate; - return find_end_impl(label, ex, first, last, s_first, s_last, - predicate_type()); + return find_end_exespace_impl(label, ex, first, last, s_first, s_last, + predicate_type()); +} + +// +// team impl +// +template +KOKKOS_FUNCTION IteratorType1 +find_end_team_impl(const TeamHandleType& teamHandle, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last, const BinaryPredicateType& pred) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first, s_first); + Impl::static_assert_iterators_have_matching_difference_type(first, s_first); + Impl::expect_valid_range(first, last); + Impl::expect_valid_range(s_first, s_last); + + // the target sequence should not be larger than the range [first, last) + namespace KE = ::Kokkos::Experimental; + const auto num_elements = KE::distance(first, last); + const auto s_count = KE::distance(s_first, s_last); + KOKKOS_EXPECTS(num_elements >= s_count); + + if (s_first == s_last) { + return last; + } + + if (first == last) { + return last; + } + + // special case where the two ranges have equal size + if (num_elements == s_count) { + const auto equal_result = + equal_team_impl(teamHandle, first, last, s_first, pred); + return (equal_result) ? first : last; + } else { + using index_type = typename IteratorType1::difference_type; + using reducer_type = LastLoc; + using reduction_value_type = typename reducer_type::value_type; + using func_t = StdFindEndFunctor; + + // run + reduction_value_type red_result; + reducer_type reducer(red_result); + + // decide the size of the range policy of the par_red: + // note that the last feasible index to start looking is the index + // whose distance from the "last" is equal to the sequence count. + // the +1 is because we need to include that location too. + const auto range_size = num_elements - s_count + 1; + + // run par reduce + ::Kokkos::parallel_reduce( + TeamThreadRange(teamHandle, 0, range_size), + func_t(first, last, s_first, s_last, reducer, pred), reducer); + + teamHandle.team_barrier(); + + // decide and return + if (red_result.max_loc_true == + ::Kokkos::reduction_identity::max()) { + // if here, a subrange has not been found + return last; + } else { + // a location has been found + return first + red_result.max_loc_true; + } + } +} + +template +KOKKOS_FUNCTION IteratorType1 find_end_team_impl( + const TeamHandleType& teamHandle, IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last) { + using value_type1 = typename IteratorType1::value_type; + using value_type2 = typename IteratorType2::value_type; + using predicate_type = StdAlgoEqualBinaryPredicate; + return find_end_team_impl(teamHandle, first, last, s_first, s_last, + predicate_type()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindFirstOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindFirstOf.hpp index 5f22d2ad13..145e235b9d 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindFirstOf.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindFirstOf.hpp @@ -71,13 +71,15 @@ struct StdFindFirstOfFunctor { m_p(std::move(p)) {} }; +// +// exespace impl +// template -IteratorType1 find_first_of_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType1 first, - IteratorType1 last, IteratorType2 s_first, - IteratorType2 s_last, - const BinaryPredicateType& pred) { +IteratorType1 find_first_of_exespace_impl( + const std::string& label, const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last, + const BinaryPredicateType& pred) { // checks Impl::static_assert_random_access_and_accessible(ex, first, s_first); Impl::static_assert_iterators_have_matching_difference_type(first, s_first); @@ -116,15 +118,71 @@ IteratorType1 find_first_of_impl(const std::string& label, } template -IteratorType1 find_first_of_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType1 first, - IteratorType1 last, IteratorType2 s_first, - IteratorType2 s_last) { +IteratorType1 find_first_of_exespace_impl( + const std::string& label, const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, IteratorType2 s_last) { using value_type1 = typename IteratorType1::value_type; using value_type2 = typename IteratorType2::value_type; using predicate_type = StdAlgoEqualBinaryPredicate; - return find_first_of_impl(label, ex, first, last, s_first, s_last, - predicate_type()); + return find_first_of_exespace_impl(label, ex, first, last, s_first, s_last, + predicate_type()); +} + +// +// team impl +// +template +KOKKOS_FUNCTION IteratorType1 +find_first_of_team_impl(const TeamHandleType& teamHandle, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last, const BinaryPredicateType& pred) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first, s_first); + Impl::static_assert_iterators_have_matching_difference_type(first, s_first); + Impl::expect_valid_range(first, last); + Impl::expect_valid_range(s_first, s_last); + + if ((s_first == s_last) || (first == last)) { + return last; + } + + using index_type = typename IteratorType1::difference_type; + using reducer_type = FirstLoc; + using reduction_value_type = typename reducer_type::value_type; + using func_t = StdFindFirstOfFunctor; + + // run + reduction_value_type red_result; + reducer_type reducer(red_result); + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, num_elements), + func_t(first, s_first, s_last, reducer, pred), + reducer); + + teamHandle.team_barrier(); + + // decide and return + if (red_result.min_loc_true == + ::Kokkos::reduction_identity::min()) { + // if here, nothing found + return last; + } else { + // a location has been found + return first + red_result.min_loc_true; + } +} + +template +KOKKOS_FUNCTION IteratorType1 find_first_of_team_impl( + const TeamHandleType& teamHandle, IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last) { + using value_type1 = typename IteratorType1::value_type; + using value_type2 = typename IteratorType2::value_type; + using predicate_type = StdAlgoEqualBinaryPredicate; + return find_first_of_team_impl(teamHandle, first, last, s_first, s_last, + predicate_type()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindIfOrNot.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindIfOrNot.hpp index 9c0b0c0ccd..8fffb59094 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindIfOrNot.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindIfOrNot.hpp @@ -61,11 +61,15 @@ struct StdFindIfOrNotFunctor { m_p(std::move(p)) {} }; +// +// exespace impl +// template -IteratorType find_if_or_not_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType first, - IteratorType last, PredicateType pred) { +IteratorType find_if_or_not_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, IteratorType last, + PredicateType pred) { // checks Impl::static_assert_random_access_and_accessible( ex, first); // only need one It per type @@ -104,14 +108,68 @@ IteratorType find_if_or_not_impl(const std::string& label, } template -InputIterator find_impl(const std::string& label, ExecutionSpace ex, - InputIterator first, InputIterator last, - const T& value) { - return find_if_or_not_impl( +InputIterator find_exespace_impl(const std::string& label, ExecutionSpace ex, + InputIterator first, InputIterator last, + const T& value) { + return find_if_or_not_exespace_impl( label, ex, first, last, ::Kokkos::Experimental::Impl::StdAlgoEqualsValUnaryPredicate(value)); } +// +// team impl +// +template +KOKKOS_FUNCTION IteratorType +find_if_or_not_team_impl(const TeamHandleType& teamHandle, IteratorType first, + IteratorType last, PredicateType pred) { + // checks + Impl::static_assert_random_access_and_accessible( + teamHandle, first); // only need one It per type + Impl::expect_valid_range(first, last); + + if (first == last) { + return last; + } + + // aliases + using index_type = typename IteratorType::difference_type; + using reducer_type = FirstLoc; + using reduction_value_type = typename reducer_type::value_type; + using func_t = StdFindIfOrNotFunctor; + + // run + reduction_value_type red_result; + reducer_type reducer(red_result); + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, num_elements), + func_t(first, reducer, pred), reducer); + + teamHandle.team_barrier(); + + // decide and return + if (red_result.min_loc_true == + ::Kokkos::reduction_identity::min()) { + // here, it means a valid loc has not been found, + return last; + } else { + // a location has been found + return first + red_result.min_loc_true; + } +} + +template +KOKKOS_FUNCTION InputIterator find_team_impl(const TeamHandleType& teamHandle, + InputIterator first, + InputIterator last, + const T& value) { + return find_if_or_not_team_impl( + teamHandle, first, last, + ::Kokkos::Experimental::Impl::StdAlgoEqualsValUnaryPredicate(value)); +} + } // namespace Impl } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ForEachForEachN.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ForEachForEachN.hpp index f9a6ff2e99..d3be3b7f66 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ForEachForEachN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ForEachForEachN.hpp @@ -41,29 +41,31 @@ struct StdForEachFunctor { : m_first(std::move(_first)), m_functor(std::move(_functor)) {} }; -template -UnaryFunctorType for_each_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType first, - IteratorType last, UnaryFunctorType functor) { +template +UnaryFunctorType for_each_exespace_impl(const std::string& label, + const HandleType& handle, + IteratorType first, IteratorType last, + UnaryFunctorType functor) { // checks - Impl::static_assert_random_access_and_accessible(ex, first); + Impl::static_assert_random_access_and_accessible(handle, first); Impl::expect_valid_range(first, last); // run const auto num_elements = Kokkos::Experimental::distance(first, last); ::Kokkos::parallel_for( - label, RangePolicy(ex, 0, num_elements), + label, RangePolicy(handle, 0, num_elements), StdForEachFunctor(first, functor)); - ex.fence("Kokkos::for_each: fence after operation"); + handle.fence("Kokkos::for_each: fence after operation"); return functor; } template -IteratorType for_each_n_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, SizeType n, - UnaryFunctorType functor) { +IteratorType for_each_n_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, SizeType n, + UnaryFunctorType functor) { auto last = first + n; Impl::static_assert_random_access_and_accessible(ex, first, last); Impl::expect_valid_range(first, last); @@ -72,8 +74,46 @@ IteratorType for_each_n_impl(const std::string& label, const ExecutionSpace& ex, return first; } - for_each_impl(label, ex, first, last, std::move(functor)); - // no neeed to fence since for_each_impl fences already + for_each_exespace_impl(label, ex, first, last, std::move(functor)); + // no neeed to fence since for_each_exespace_impl fences already + + return last; +} + +// +// team impl +// +template +KOKKOS_FUNCTION UnaryFunctorType +for_each_team_impl(const TeamHandleType& teamHandle, IteratorType first, + IteratorType last, UnaryFunctorType functor) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + // run + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_for( + TeamThreadRange(teamHandle, 0, num_elements), + StdForEachFunctor(first, functor)); + teamHandle.team_barrier(); + return functor; +} + +template +KOKKOS_FUNCTION IteratorType +for_each_n_team_impl(const TeamHandleType& teamHandle, IteratorType first, + SizeType n, UnaryFunctorType functor) { + auto last = first + n; + Impl::static_assert_random_access_and_accessible(teamHandle, first, last); + Impl::expect_valid_range(first, last); + + if (n == 0) { + return first; + } + + for_each_team_impl(teamHandle, first, last, std::move(functor)); + // no neeed to fence since for_each_team_impl fences already return last; } diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FunctorsForExclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FunctorsForExclusiveScan.hpp new file mode 100644 index 0000000000..8151ee3495 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FunctorsForExclusiveScan.hpp @@ -0,0 +1,220 @@ +//@HEADER +// ************************************************************************ +// +// Kokkos v. 4.0 +// Copyright (2022) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. +// See https://kokkos.org/LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//@HEADER + +#ifndef KOKKOS_STD_ALGORITHMS_FUNCTORS_FOR_EXCLUSIVE_SCAN_IMPL_HPP +#define KOKKOS_STD_ALGORITHMS_FUNCTORS_FOR_EXCLUSIVE_SCAN_IMPL_HPP + +#include +#include "Kokkos_ValueWrapperForNoNeutralElement.hpp" + +namespace Kokkos { +namespace Experimental { +namespace Impl { + +template +using ex_scan_has_reduction_identity_sum_t = + decltype(Kokkos::reduction_identity::sum()); + +template +struct ExclusiveScanDefaultFunctorForKnownNeutralElement { + using execution_space = ExeSpace; + ValueType m_init_value; + FirstFrom m_first_from; + FirstDest m_first_dest; + + KOKKOS_FUNCTION + ExclusiveScanDefaultFunctorForKnownNeutralElement(ValueType init, + FirstFrom first_from, + FirstDest first_dest) + : m_init_value(std::move(init)), + m_first_from(std::move(first_from)), + m_first_dest(std::move(first_dest)) {} + + KOKKOS_FUNCTION + void operator()(const IndexType i, ValueType& update, + const bool final_pass) const { + if (final_pass) m_first_dest[i] = update + m_init_value; + update += m_first_from[i]; + } +}; + +template +struct ExclusiveScanDefaultFunctorWithValueWrapper { + using execution_space = ExeSpace; + using value_type = + ::Kokkos::Experimental::Impl::ValueWrapperForNoNeutralElement; + ValueType m_init_value; + FirstFrom m_first_from; + FirstDest m_first_dest; + + KOKKOS_FUNCTION + ExclusiveScanDefaultFunctorWithValueWrapper(ValueType init, + FirstFrom first_from, + FirstDest first_dest) + : m_init_value(std::move(init)), + m_first_from(std::move(first_from)), + m_first_dest(std::move(first_dest)) {} + + KOKKOS_FUNCTION + void operator()(const IndexType i, value_type& update, + const bool final_pass) const { + if (final_pass) { + if (i == 0) { + m_first_dest[i] = m_init_value; + } else { + m_first_dest[i] = update.val + m_init_value; + } + } + + const auto tmp = value_type{m_first_from[i], false}; + this->join(update, tmp); + } + + KOKKOS_FUNCTION + void init(value_type& update) const { + update.val = {}; + update.is_initial = true; + } + + KOKKOS_FUNCTION + void join(value_type& update, const value_type& input) const { + if (input.is_initial) return; + + if (update.is_initial) { + update.val = input.val; + update.is_initial = false; + } else { + update.val = update.val + input.val; + } + } +}; + +template +struct TransformExclusiveScanFunctorWithValueWrapper { + using execution_space = ExeSpace; + using value_type = + ::Kokkos::Experimental::Impl::ValueWrapperForNoNeutralElement; + + ValueType m_init_value; + FirstFrom m_first_from; + FirstDest m_first_dest; + BinaryOpType m_binary_op; + UnaryOpType m_unary_op; + + KOKKOS_FUNCTION + TransformExclusiveScanFunctorWithValueWrapper(ValueType init, + FirstFrom first_from, + FirstDest first_dest, + BinaryOpType bop, + UnaryOpType uop) + : m_init_value(std::move(init)), + m_first_from(std::move(first_from)), + m_first_dest(std::move(first_dest)), + m_binary_op(std::move(bop)), + m_unary_op(std::move(uop)) {} + + KOKKOS_FUNCTION + void operator()(const IndexType i, value_type& update, + const bool final_pass) const { + if (final_pass) { + if (i == 0) { + // for both ExclusiveScan and TransformExclusiveScan, + // init is unmodified + m_first_dest[i] = m_init_value; + } else { + m_first_dest[i] = m_binary_op(update.val, m_init_value); + } + } + + const auto tmp = value_type{m_unary_op(m_first_from[i]), false}; + this->join(update, tmp); + } + + KOKKOS_FUNCTION void init(value_type& value) const { + value.val = {}; + value.is_initial = true; + } + + KOKKOS_FUNCTION + void join(value_type& update, const value_type& input) const { + if (input.is_initial) return; + + if (update.is_initial) { + update.val = input.val; + } else { + update.val = m_binary_op(update.val, input.val); + } + update.is_initial = false; + } +}; + +template +struct TransformExclusiveScanFunctorWithoutValueWrapper { + using execution_space = ExeSpace; + + ValueType m_init_value; + FirstFrom m_first_from; + FirstDest m_first_dest; + BinaryOpType m_binary_op; + UnaryOpType m_unary_op; + + KOKKOS_FUNCTION + TransformExclusiveScanFunctorWithoutValueWrapper(ValueType init, + FirstFrom first_from, + FirstDest first_dest, + BinaryOpType bop, + UnaryOpType uop) + : m_init_value(std::move(init)), + m_first_from(std::move(first_from)), + m_first_dest(std::move(first_dest)), + m_binary_op(std::move(bop)), + m_unary_op(std::move(uop)) {} + + KOKKOS_FUNCTION + void operator()(const IndexType i, ValueType& update, + const bool final_pass) const { + if (final_pass) { + if (i == 0) { + // for both ExclusiveScan and TransformExclusiveScan, + // init is unmodified + m_first_dest[i] = m_init_value; + } else { + m_first_dest[i] = m_binary_op(update, m_init_value); + } + } + + const auto tmp = ValueType{m_unary_op(m_first_from[i])}; + this->join(update, tmp); + } + + KOKKOS_FUNCTION + void init(ValueType& update) const { update = {}; } + + KOKKOS_FUNCTION + void join(ValueType& update, const ValueType& input) const { + update = m_binary_op(update, input); + } +}; + +} // namespace Impl +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_GenerateGenerateN.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_GenerateGenerateN.hpp index 228390bdff..157de1125e 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_GenerateGenerateN.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_GenerateGenerateN.hpp @@ -41,32 +41,65 @@ struct StdGenerateFunctor { : m_first(std::move(_first)), m_generator(std::move(_g)) {} }; +// +// generate impl +// template -void generate_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last, Generator g) { +void generate_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + Generator g) { // checks Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); - // aliases - using func_t = StdGenerateFunctor; - // run const auto num_elements = Kokkos::Experimental::distance(first, last); ::Kokkos::parallel_for(label, RangePolicy(ex, 0, num_elements), - func_t(first, g)); + StdGenerateFunctor(first, g)); ex.fence("Kokkos::generate: fence after operation"); } +template +KOKKOS_FUNCTION void generate_team_impl(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + Generator g) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + // run + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_for(TeamThreadRange(teamHandle, 0, num_elements), + StdGenerateFunctor(first, g)); + teamHandle.team_barrier(); +} + +// +// generate_n impl +// template -IteratorType generate_n_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, Size count, Generator g) { +IteratorType generate_n_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, Size count, + Generator g) { if (count <= 0) { return first; } - generate_impl(label, ex, first, first + count, g); + generate_exespace_impl(label, ex, first, first + count, g); + return first + count; +} + +template +KOKKOS_FUNCTION IteratorType +generate_n_team_impl(const TeamHandleType& teamHandle, IteratorType first, + Size count, Generator g) { + if (count <= 0) { + return first; + } + + generate_team_impl(teamHandle, first, first + count, g); return first + count; } diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_InclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_InclusiveScan.hpp index ecd6ff39cd..0b4acec0fe 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_InclusiveScan.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_InclusiveScan.hpp @@ -101,9 +101,12 @@ struct InclusiveScanDefaultFunctor { } }; +// +// exespace impl +// template -OutputIteratorType inclusive_scan_default_op_impl( +OutputIteratorType inclusive_scan_default_op_exespace_impl( const std::string& label, const ExecutionSpace& ex, InputIteratorType first_from, InputIteratorType last_from, OutputIteratorType first_dest) { @@ -143,7 +146,7 @@ OutputIteratorType inclusive_scan_default_op_impl( // ------------------------------------------------------------- template -OutputIteratorType inclusive_scan_custom_binary_op_impl( +OutputIteratorType inclusive_scan_custom_binary_op_exespace_impl( const std::string& label, const ExecutionSpace& ex, InputIteratorType first_from, InputIteratorType last_from, OutputIteratorType first_dest, BinaryOpType binary_op) { @@ -158,7 +161,7 @@ OutputIteratorType inclusive_scan_custom_binary_op_impl( using value_type = std::remove_const_t; using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; - using func_type = TransformInclusiveScanNoInitValueFunctor< + using func_type = ExeSpaceTransformInclusiveScanNoInitValueFunctor< ExecutionSpace, index_type, value_type, InputIteratorType, OutputIteratorType, BinaryOpType, unary_op_type>; @@ -179,7 +182,7 @@ OutputIteratorType inclusive_scan_custom_binary_op_impl( // ------------------------------------------------------------- template -OutputIteratorType inclusive_scan_custom_binary_op_impl( +OutputIteratorType inclusive_scan_custom_binary_op_exespace_impl( const std::string& label, const ExecutionSpace& ex, InputIteratorType first_from, InputIteratorType last_from, OutputIteratorType first_dest, BinaryOpType binary_op, @@ -193,7 +196,7 @@ OutputIteratorType inclusive_scan_custom_binary_op_impl( // aliases using index_type = typename InputIteratorType::difference_type; using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; - using func_type = TransformInclusiveScanWithInitValueFunctor< + using func_type = ExeSpaceTransformInclusiveScanWithInitValueFunctor< ExecutionSpace, index_type, ValueType, InputIteratorType, OutputIteratorType, BinaryOpType, unary_op_type>; @@ -203,13 +206,142 @@ OutputIteratorType inclusive_scan_custom_binary_op_impl( ::Kokkos::parallel_scan(label, RangePolicy(ex, 0, num_elements), func_type(first_from, first_dest, binary_op, - unary_op_type(), init_value)); + unary_op_type(), std::move(init_value))); ex.fence("Kokkos::inclusive_scan_custom_binary_op: fence after operation"); // return return first_dest + num_elements; } +// +// team impl +// +template +KOKKOS_FUNCTION OutputIteratorType inclusive_scan_default_op_team_impl( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + using value_type = + std::remove_const_t; + + // #if defined(KOKKOS_ENABLE_CUDA) + + using exe_space = typename TeamHandleType::execution_space; + using index_type = typename InputIteratorType::difference_type; + using func_type = std::conditional_t< + ::Kokkos::is_detected::value, + InclusiveScanDefaultFunctorForKnownIdentityElement< + exe_space, index_type, value_type, InputIteratorType, + OutputIteratorType>, + InclusiveScanDefaultFunctor>; + + // run + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + ::Kokkos::parallel_scan(TeamThreadRange(teamHandle, 0, num_elements), + func_type(first_from, first_dest)); + teamHandle.team_barrier(); + + // return + return first_dest + num_elements; +} + +// ------------------------------------------------------------- +// inclusive_scan_custom_binary_op_impl +// ------------------------------------------------------------- +template +KOKKOS_FUNCTION OutputIteratorType inclusive_scan_custom_binary_op_team_impl( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest, + BinaryOpType binary_op) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + using value_type = + std::remove_const_t; + + static_assert( + ::Kokkos::is_detected_v, + "At the moment inclusive_scan doesn't support types without reduction " + "identity"); + + // #if defined(KOKKOS_ENABLE_CUDA) + + // aliases + using exe_space = typename TeamHandleType::execution_space; + using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; + using func_type = TeamTransformInclusiveScanNoInitValueFunctor< + exe_space, value_type, InputIteratorType, OutputIteratorType, + BinaryOpType, unary_op_type>; + + // run + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + + ::Kokkos::parallel_scan( + TeamThreadRange(teamHandle, 0, num_elements), + func_type(first_from, first_dest, binary_op, unary_op_type())); + teamHandle.team_barrier(); + + return first_dest + num_elements; +} + +// ------------------------------------------------------------- +// inclusive_scan_custom_binary_op_impl with init_value +// ------------------------------------------------------------- +template +KOKKOS_FUNCTION OutputIteratorType inclusive_scan_custom_binary_op_team_impl( + const TeamHandleType& teamHandle, InputIteratorType first_from, + InputIteratorType last_from, OutputIteratorType first_dest, + BinaryOpType binary_op, ValueType init_value) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first_from, + first_dest); + Impl::static_assert_iterators_have_matching_difference_type(first_from, + first_dest); + Impl::expect_valid_range(first_from, last_from); + + static_assert( + ::Kokkos::is_detected_v, + "At the moment inclusive_scan doesn't support types without reduction " + "identity"); + + // #if defined(KOKKOS_ENABLE_CUDA) + + // aliases + using exe_space = typename TeamHandleType::execution_space; + using unary_op_type = StdNumericScanIdentityReferenceUnaryFunctor; + using func_type = TeamTransformInclusiveScanWithInitValueFunctor< + exe_space, ValueType, InputIteratorType, OutputIteratorType, BinaryOpType, + unary_op_type>; + + // run + const auto num_elements = + Kokkos::Experimental::distance(first_from, last_from); + ::Kokkos::parallel_scan(TeamThreadRange(teamHandle, 0, num_elements), + func_type(first_from, first_dest, binary_op, + unary_op_type(), std::move(init_value))); + teamHandle.team_barrier(); + + // return + return first_dest + num_elements; +} + } // namespace Impl } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsPartitioned.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsPartitioned.hpp index 0fe2d246ff..281efca36b 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsPartitioned.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsPartitioned.hpp @@ -62,9 +62,9 @@ struct StdIsPartitionedFunctor { }; template -bool is_partitioned_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last, - PredicateType pred) { +bool is_partitioned_exespace_impl(const std::string& label, + const ExecutionSpace& ex, IteratorType first, + IteratorType last, PredicateType pred) { // true if all elements in the range [first, last) that satisfy // the predicate "pred" appear before all elements that don't. // Also returns true if [first, last) is empty. @@ -97,6 +97,7 @@ bool is_partitioned_impl(const std::string& label, const ExecutionSpace& ex, const auto num_elements = Kokkos::Experimental::distance(first, last); ::Kokkos::parallel_reduce(label, RangePolicy(ex, 0, num_elements), + func_t(first, reducer, pred), reducer); // fence not needed because reducing into scalar @@ -109,8 +110,72 @@ bool is_partitioned_impl(const std::string& label, const ExecutionSpace& ex, if (red_result.max_loc_true != red_id_max && red_result.min_loc_false != red_id_min) { + // this occurs when the reduction yields nontrivial values return red_result.max_loc_true < red_result.min_loc_false; + } else if (red_result.max_loc_true == red_id_max && + red_result.min_loc_false == 0) { + // this occurs when all values do NOT satisfy + // the predicate, and this corner case should also be true + return true; } else if (first + red_result.max_loc_true == --last) { + // this occurs when all values satisfy the predicate, + // this corner case should also be true + return true; + } else { + return false; + } +} + +template +KOKKOS_FUNCTION bool is_partitioned_team_impl(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last, + PredicateType pred) { + /* see exespace impl for the description of the impl */ + + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + // trivial case + if (first == last) { + return true; + } + + // aliases + using index_type = typename IteratorType::difference_type; + using reducer_type = StdIsPartitioned; + using reduction_value_type = typename reducer_type::value_type; + using func_t = + StdIsPartitionedFunctor; + + // run + reduction_value_type red_result; + reducer_type reducer(red_result); + const auto num_elements = Kokkos::Experimental::distance(first, last); + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, num_elements), + func_t(first, reducer, pred), reducer); + + // fence not needed because reducing into scalar + + // decide and return + constexpr index_type red_id_min = + ::Kokkos::reduction_identity::min(); + constexpr index_type red_id_max = + ::Kokkos::reduction_identity::max(); + + if (red_result.max_loc_true != red_id_max && + red_result.min_loc_false != red_id_min) { + // this occurs when the reduction yields nontrivial values + return red_result.max_loc_true < red_result.min_loc_false; + } else if (red_result.max_loc_true == red_id_max && + red_result.min_loc_false == 0) { + // this occurs when all values do NOT satisfy + // the predicate, and this corner case should also be true + return true; + } else if (first + red_result.max_loc_true == --last) { + // this occurs when all values satisfy the predicate, + // this corner case should also be true return true; } else { return false; diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSorted.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSorted.hpp index 4696821586..b2c912848a 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSorted.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSorted.hpp @@ -48,10 +48,13 @@ struct StdIsSortedFunctor { : m_first(std::move(_first1)), m_comparator(std::move(comparator)) {} }; +// +// exespace impl +// template -bool is_sorted_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last, - ComparatorType comp) { +bool is_sorted_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + ComparatorType comp) { // checks Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); @@ -75,11 +78,49 @@ bool is_sorted_impl(const std::string& label, const ExecutionSpace& ex, } template -bool is_sorted_impl(const std::string& label, const ExecutionSpace& ex, - IteratorType first, IteratorType last) { +bool is_sorted_exespace_impl(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { using value_type = typename IteratorType::value_type; using pred_t = Impl::StdAlgoLessThanBinaryPredicate; - return is_sorted_impl(label, ex, first, last, pred_t()); + return is_sorted_exespace_impl(label, ex, first, last, pred_t()); +} + +// +// team impl +// +template +KOKKOS_FUNCTION bool is_sorted_team_impl(const TeamHandleType& teamHandle, + IteratorType first, IteratorType last, + ComparatorType comp) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + const auto num_elements = Kokkos::Experimental::distance(first, last); + if (num_elements <= 1) { + return true; + } + + // use num_elements-1 because each index handles i and i+1 + const auto num_elements_minus_one = num_elements - 1; + + // result is incremented by one if sorting breaks at index i + std::size_t result = 0; + ::Kokkos::parallel_reduce( + TeamThreadRange(teamHandle, 0, num_elements_minus_one), + // use CTAD here + StdIsSortedFunctor(first, std::move(comp)), result); + + return result == 0; +} + +template +KOKKOS_FUNCTION bool is_sorted_team_impl(const TeamHandleType& teamHandle, + IteratorType first, + IteratorType last) { + using value_type = typename IteratorType::value_type; + using pred_t = Impl::StdAlgoLessThanBinaryPredicate; + return is_sorted_team_impl(teamHandle, first, last, pred_t()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSortedUntil.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSortedUntil.hpp index 2a0c112bf5..d33580ca53 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSortedUntil.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSortedUntil.hpp @@ -54,10 +54,15 @@ struct StdIsSortedUntilFunctor { m_reducer(std::move(reducer)) {} }; +// +// overloads accepting exespace +// template -IteratorType is_sorted_until_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType first, - IteratorType last, ComparatorType comp) { +IteratorType is_sorted_until_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + ComparatorType comp) { // checks Impl::static_assert_random_access_and_accessible(ex, first); Impl::expect_valid_range(first, last); @@ -81,7 +86,6 @@ IteratorType is_sorted_until_impl(const std::string& label, label, // use num_elements-1 because each index handles i and i+1 RangePolicy(ex, 0, num_elements - 1), - // use CTAD StdIsSortedUntilFunctor(first, comp, reducer), reducer); /* If the reduction result is equal to the initial value, @@ -98,12 +102,66 @@ IteratorType is_sorted_until_impl(const std::string& label, } template -IteratorType is_sorted_until_impl(const std::string& label, - const ExecutionSpace& ex, IteratorType first, - IteratorType last) { +IteratorType is_sorted_until_exespace_impl(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last) { using value_type = typename IteratorType::value_type; using pred_t = Impl::StdAlgoLessThanBinaryPredicate; - return is_sorted_until_impl(label, ex, first, last, pred_t()); + return is_sorted_until_exespace_impl(label, ex, first, last, pred_t()); +} + +// +// overloads accepting team handle +// +template +KOKKOS_FUNCTION IteratorType +is_sorted_until_team_impl(const ExecutionSpace& teamHandle, IteratorType first, + IteratorType last, ComparatorType comp) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first); + Impl::expect_valid_range(first, last); + + const auto num_elements = Kokkos::Experimental::distance(first, last); + + // trivial case + if (num_elements <= 1) { + return last; + } + + /* + Do a par_reduce computing the *min* index that breaks the sorting. + If one such index is found, then the range is sorted until that element, + if no such index is found, then it means the range is sorted until the end. + */ + using index_type = typename IteratorType::difference_type; + index_type red_result; + index_type red_result_init; + ::Kokkos::Min reducer(red_result); + reducer.init(red_result_init); + ::Kokkos::parallel_reduce( // use num_elements-1 because each index handles i + // and i+1 + TeamThreadRange(teamHandle, 0, num_elements - 1), + StdIsSortedUntilFunctor(first, comp, reducer), reducer); + teamHandle.team_barrier(); + + /* If the reduction result is equal to the initial value, + and it means the range is sorted until the end */ + if (red_result == red_result_init) { + return last; + } else { + /* If such index is found, then the range is sorted until there and + we need to return an iterator past the element found so do +1 */ + return first + (red_result + 1); + } +} + +template +KOKKOS_FUNCTION IteratorType is_sorted_until_team_impl( + const ExecutionSpace& teamHandle, IteratorType first, IteratorType last) { + using value_type = typename IteratorType::value_type; + using pred_t = Impl::StdAlgoLessThanBinaryPredicate; + return is_sorted_until_team_impl(teamHandle, first, last, pred_t()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_LexicographicalCompare.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_LexicographicalCompare.hpp index ad7f59232e..b95a66c3bd 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_LexicographicalCompare.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_LexicographicalCompare.hpp @@ -84,13 +84,15 @@ struct StdLexicographicalCompareFunctor { m_comparator(std::move(_comp)) {} }; +// +// exespace impl +// template -bool lexicographical_compare_impl(const std::string& label, - const ExecutionSpace& ex, - IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2, IteratorType2 last2, - ComparatorType comp) { +bool lexicographical_compare_exespace_impl( + const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, + ComparatorType comp) { // checks Impl::static_assert_random_access_and_accessible(ex, first1, first2); Impl::static_assert_iterators_have_matching_difference_type(first1, first2); @@ -139,16 +141,84 @@ bool lexicographical_compare_impl(const std::string& label, } template -bool lexicographical_compare_impl(const std::string& label, - const ExecutionSpace& ex, - IteratorType1 first1, IteratorType1 last1, - IteratorType2 first2, IteratorType2 last2) { +bool lexicographical_compare_exespace_impl( + const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { using value_type_1 = typename IteratorType1::value_type; using value_type_2 = typename IteratorType2::value_type; using predicate_t = Impl::StdAlgoLessThanBinaryPredicate; - return lexicographical_compare_impl(label, ex, first1, last1, first2, last2, - predicate_t()); + return lexicographical_compare_exespace_impl(label, ex, first1, last1, first2, + last2, predicate_t()); +} + +// +// team impl +// +template +KOKKOS_FUNCTION bool lexicographical_compare_team_impl( + const TeamHandleType& teamHandle, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, ComparatorType comp) { + // checks + Impl::static_assert_random_access_and_accessible(teamHandle, first1, first2); + Impl::static_assert_iterators_have_matching_difference_type(first1, first2); + Impl::expect_valid_range(first1, last1); + Impl::expect_valid_range(first2, last2); + + // aliases + using index_type = typename IteratorType1::difference_type; + using reducer_type = FirstLoc; + using reduction_value_type = typename reducer_type::value_type; + + // run + const auto d1 = Kokkos::Experimental::distance(first1, last1); + const auto d2 = Kokkos::Experimental::distance(first2, last2); + const auto range = Kokkos::min(d1, d2); + reduction_value_type red_result; + reducer_type reducer(red_result); + using func1_t = + StdLexicographicalCompareFunctor; + + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, range), + func1_t(first1, first2, reducer, comp), reducer); + + teamHandle.team_barrier(); + + // no mismatch + if (red_result.min_loc_true == + ::Kokkos::reduction_identity::min()) { + auto new_last1 = first1 + range; + auto new_last2 = first2 + range; + bool is_prefix = (new_last1 == last1) && (new_last2 != last2); + return is_prefix; + } + + // check mismatched + int less = 0; + auto it1 = first1 + red_result.min_loc_true; + auto it2 = first2 + red_result.min_loc_true; + using func2_t = StdCompareFunctor; + ::Kokkos::parallel_reduce(TeamThreadRange(teamHandle, 0, 1), + func2_t(it1, it2, comp), less); + + teamHandle.team_barrier(); + + return static_cast(less); +} + +template +KOKKOS_FUNCTION bool lexicographical_compare_team_impl( + const TeamHandleType& teamHandle, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + using value_type_1 = typename IteratorType1::value_type; + using value_type_2 = typename IteratorType2::value_type; + using predicate_t = + Impl::StdAlgoLessThanBinaryPredicate; + return lexicographical_compare_team_impl(teamHandle, first1, last1, first2, + last2, predicate_t()); } } // namespace Impl diff --git a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MinMaxMinmaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MinMaxMinmaxElement.hpp index 048420f7a8..2f51db03b4 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MinMaxMinmaxElement.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MinMaxMinmaxElement.hpp @@ -63,12 +63,16 @@ struct StdMinMaxElemFunctor { : m_first(std::move(first)), m_reducer(std::move(reducer)) {} }; +// +// exespace impl +// template

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 z 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 literal 76737 zcmbsQb8u`=)c=c5Y@FCRv6B|6kv^8;Z)psxksHyyRF?Mh?x3&4rL`zRgPs8wsf$L^^Bt zj#|zutMQo8bD6TYmzR{3RM$ThP~aZ}FL#@bmQu3$@sWucHc9ZF1d8}{7W1__V@X`x zOu9PF1onn=LS^C=#2XF$hozXt!2`%gl?hqn+X;~fOHg}y8m}qwv z{t|_6gh2#|Kclqk_}h(_oc_&ILvDTOQbkG(qEtuHaGV!IIp$JRJ*!x2^G%%tM_O7f zE7QJr=+Z|^4Iy`+e{NS#%1pHNl&%fUkhi!DCnt5*xM95J6=Ki`dJnCA0A!%+}Rfa8~MYa3463sl1{ZhM`v zgrn)sl7PY4g|AACw90g%vBRtI*QQ7)$Rav3?ctqG9Dwp05gIlM)>!5WaUI31ARG!3 z!7Dzk>d5^>j9d^TEG)l$rlaghp-$_rzGayoN}L^D-@Fr=hc)e_{@^WxAm2OWy{VM z-)fy`qV?!y$BBx^>gy->-HF6I7w9jBw~YR6VRG7^WcjHX(0Js@|=%7h^X}tGDBWkRqkI(5@z=;tW7r7sh z8*yo1?ypIG(|u~XS;$-Uj-rJwmJXd)SY;05q;n#%=Ii5HBcoP6(dYL&BTPIrkKHwA-fa;V_-JFvV$np5T^c0012cA7W;T_PHXIKez>J75BRh_elv$gRZlkL;KUZi(F0O-$WZYK>?OJ44vDeg} z0aW?I8Iyfy4uF;boAAZSII0o9I3NM0#s{o{kLVpp4+YwnY&;&F2?&3~jUog7W5oA8 zx1Y2_8da%6iE?Uh>xr#NGcL9Hp1EC`Nagf&t(wJtOw62;ipZ=|wk}k4jE=peZNtHz z`cBPbkPx(A+c40$YF_TIX&b zOzxj@{E{<+QN5;)c+v$Ay$2*wFikZdQK;f04#4e z1MM6U+p4Kc`0wSGm+WN}Ifo$oe(USOBgg^AkWN~zpBz;Ba-<4-rb8v@?$BdfA3}F} zvy;)tFR%1XXk8x$ET^)Y%`_(SiBS<=1$ID6OB|9zACU?apXoH{D+6|cmh=1bn9PT? zxs&*MOMS4zy0p?iM2+N`!drv3#v%AqS36Q`dm8=eD$DIJD=6Q5P9j*tD5%E;bVby1i$)6{AwScP_aAj0jNLeL8Zm+vJKyj6QcO0<{!+m zO#-6|l#Rkq+$jC4R%~OlB%P&7Op?y+9;at4+-Q?(f3;^`JCJT1kFttT&<6MO%totC z{Wvz&!Z*thTjCLvbOI6z3!``oNNIECqRoUoR8Gy+w=M5HCv_HzoEf2IX81$PwX(2A zOV0HxGCHwRS;@}+Sk*`TV7degN{PXrLE7JnWxAk448QDPVJC-rlL^-mM#F|we}beh zZaC;H#p<3!1bZL@u_0%1nLliKAJZoMUVq($0-BcBPDEVnfx6}4V{NkI8;Zs zKkw#kXI`DBl-hi~Y-I!ToB8Fc6}x(#-7n5RiHL%mQ$=|jh|hfVuIz#l9dGF94pB|s zz?+8?8}nBBQhCZqJCW~Y>E_i%Pezt6%=Gp08JSpPqd(ORxGzgo(Yg|X=z?|1lRMO_ zr?7KihcC*Lkf`~H(_Zli6VX%h5J^JuEzc+*+w5L^K8-G};5_wYva#cuk``s)8YSsG z{;maPyJ-y)my277#F_NSNes&x5~W1?>u8{3QN`FM;xPrsGspurhBn@uklDO8R!Bgg zNYhkyc%nkVD$0LbR{k8o=zg;5zIb0+WMIF)@S5^)5`vJmXmh5gS|6+MZ2oZ`0-$8Q z7J~sr%G|g=ZW#NC6JYXjj&Ac7G#!`HAhz3M(vTj%5>?`r|ElV?q9;uGC#9)AJu=dx z5Es|}t&jr9nI^|sNm!Uz(IVu?7Y94wnkS`&hbuxA{12tXsB7@H`AH$%`jZK;*W4&2< z3~CbZUkgq~Q%4>Bn%5jCkBB0I5k8q%)&J~USei-#J-N8p>(fbQxH{L;cahOUM@dhO zxxvZVRMD2k`jZr?`-}=6gSh_=fq?K!YWFZdB9)(BX9=*#yrcZ5JV5NoKFa=4o{X6V zrF!0QnG~Oe=JD>t4=wY!PTtDpN|Jkz$LWq+-17We{oX3L6?1;6Rf;j;b3#N$!=cuT zmT--yK#nb6e^r zavGkCo6R;#gk)Fq?DOx)HK1P^t7?o1S3^Ouv)W+*ZoXT}V?9f&hnM&5@~IVkCRawK z-@oe)n8xW+NgTk*Ap-@7@+GdGve4Z3Rk^Wn%hQG2nZl(G^77;7|Ki=W(#s+zD#ypw zx%W<{^c{*Yk_0NG9;wBq7O*3xbDX)S8H2ypx1NF_SmoUSA<%y7CwBBoyJvll$mOYZ zAzk+Utnl6$ITLD70JPZnsHT1A7x5Q3`2qLHs8MOIN-1cb0jI$j)%P!Tj8pLe6o6O? z*YK!=7rz#EfPnOggPDQR@5RRQWYpUe3paS&tlvdQRwVq5*s94IZWgTAKap61f+gSm z>+BJ&M>LugC@C)xh2)?`3dk@cp6Zb8;NUlNVzD`H);M4x2eg6%Du;ZAt9lOB*sZGJ zm7EiTY_i0DzUeaUpMC(i58toG`0ioUWjvud;jAb+_pQaj)608+pR=9IuS5<2RdIoC z^BYq?BoI5C`7DeTSAWVH6a}YbT0Ilgzjp2}ynYZ0Xqn|6zN^(DzJIf^=i*=u1EJ&6 z(P7cYj)oLrLFKIrgIXR;692S}l9b4o7IDby6$;)=(mHb_iD!@9eg(u26 zJVJ6@N_srZ=Z%9b$Qxtsfpd=(D$q9aCqX%?elQQyq`#O&Pix=Wt`=Cys{c(-NS9JL z7$Oz-$q0XEl z9{k9PZ$iUR-W{X@NB54%yH{Nh^5~e5VBD7wuUI4$l>Rela<5K6GS$9@5pGP&v#Q>j zsD&#rU6K*U!juw+_5wVm<68F%b7fWD1DvURF3Ph?UYa}+`xLruiQ3CW4tc#R&h=z} z++2cZXYLTonQ9iC6r~(EU6Dx|M9~tI2MqD{qDhm+RVOzT(gO_8u+Yf5=NKp|7QgJfmR8ZmY{xUmwSB1?rr} z!L6!yq2W>2K`Bai?@R=vIVF)Dbg_0>Gt-k0Xm#h{`%_-$m&7zU+F7iEf@L|Z=F&(vP)(1`aawp=1V4@O=U6OPoqXn z;{Md8&Wns#RhB$?TxS+s?&G99_-YeePukG5Y%KKjrF#Vn6D>;*mDa|wtXyLwD!M!< z@H(Gg9aL~mHb&J)xtdEFI#N^m9_{5mp5^;=j_Ms*~d`2fmRwWT}T1uA|O|$em z;V;86`-!%)Jj@0;d;hYYb9}ezJ))nE5b)Sb82fCxWT0TWs&;-&1LaI=S&oq$dNkE} zMPK*-iDNLaaoz)|-iC=(CBaJ^J(-}U%H3VUwtQ8B>2NH|K;hEI%QZJa_w;NG=jO6<;?7 z=T>T^V^Biyt7A11CTClt+bWW!r{I83lEf-l&h8 z7a&ZvaDMG*k;9Lm5>90pc-OxsAysqRm#+`Sg?AXH%Nf6R9Z zIdR!>uJo!Gj|3S=H~DVqb@(i_@S|+_W^**|a1k-iw@=k-30sKVi4aA!rj~kwKX)@) zsx0l15Nc|6iMlTC^v;zkI?_(w32dh)@kEC6uaAJ= zKax6Y-#r!HIA3sd{7%c_w?s1Qqb>f}6=af#?^*p_=$ zoz$R2@x;k24hmNR3iTFq3s$Hc0Y#=MyN;?v>Zu&5)0Ye;-l*0slVt2qeHku1x)VDB z~jBMl&iHbDup0t0+u%@EGCN3vYCoXIurz){}mZTldHUH|2}zzDh@fgIu@0#+21Z*LnC#;t++nZ^;ZawXR2k7EDvZv_+0B#7 z##muLMfimHum2R7Zb2wbx3o7g8!bF|SO|dAID$>0?+n4Wp43-woh#V?N?9>C?0ASj z?f%&F0{tt2UJERDb#;NX{nvC3>Q4sxzq=_6L@-YrO=q=bU|@)g zi=))S763D_vZ78N&&Y5tBy|mem(dSbPAZ z_~T<_R1g(4nXFRW_ma{mo^?#6h0u50zqXc^M;^WZ)8TC{CTUGg&2FDhjr)B`sW)eV zvQwBmdLJ{hlVp_wLIO_h@ArSY;o*Px*~0Tspuzrs9SR+K`K}GK*(3e=6tfsw$WY2) zt{O){TKC^~)@s=Q8AtqjmRJ27aXD`AY-kB^e&v~^9@UxU9mX6k7=6Q;A`Ra*y#y{|R(`-BYH{@vG{~MW6Ksci?Rp&QP zN8C$(3||?qNzzVo3vAbTj8j@=XX^zo%q$#6n>_*THeleIluCq-`6op@aV(7AMmTQ? ziDkgyFo?~QoQk{vW5}UjJtJehFL1b9pU<|v(q+1TVS;m5%56Fg6*PK+N=x zwU6lYT~@!`yxvIUZ3EGD)8@|X_tzRoE*M;8H?)xQ@T~dN&d;aAnc{`d`f6+U-RGwX zCZH;KU_#dA#k!;~+j*$Y?bcm$mv_u~8}8h=_Niifa6J`FVvUg?{561T?tEEYBex&<7K=z&0xyAiu$ZlDmvhWOK z-@NhcyuCWO9p2ON`?2`^iMht+qHWhEKUg(Q;llPZMf)1&xWE*_71!nZKpUX?{D$EA z$#V^i4zk!UyCj_G;(k}f14p{_=AJOzr)wFrwb|@5RJnTi)~Lh_hW*vWa7`}$qQ(G}Rh8ne_h{Qq=F&_Js&CY7$L(BTm zq^tQtll*koU;;%M@oxUBR(zEv>j$oc=H{oPpQR5xik|fTHCU$Zrg%&bGGP>rC(oE$>|B%i7!!`WLB)+Jmv*Ljr@-qQ`z=E<~kM0Jo6c(s@3 zh1X_0&UuvOmY=FoSTe8*1Sn(M#r?ZNe10iX?WP~^+6F}QL!E5@C_{TbdBfMHSWdj0 z4ID0WZ82|tXpW5jZ~X!8LNllwz#wW(&?0pSE+z4pB^J5U_NIx%6nMLB+}K`wEpN2L zJ3(iXXdG`U-JVoEb#dN7`!iN3(y8zMih&0&JP)&&pSVP%F{(ivT4F?g2?yC0oD7oyu%=r-f4- zLD&ZrLHF=KB6d3)zB^zY|O;%Xbp5 z8b-n*pbP*&YUQ?pl~D#Z3D>K)KYKKlKPU2j!ZHg#pm16KDe^{tOln8l=Y}bes0+Ru z`0^9=wp?XV!1~KTStbQjyud}0+giNQlOpJh;06EF-G~k#znG9SdUA?D=bkPwbRd03 zK=wP!E9r}t&E3J{@Z#BGm5q`Y+a5LlF86TJ$5QEb+k=XrimO;Q(TTFdRGu0xaPeP;qA9ru?HM=N_pATk=CF14QBX|_a(xFV0bDNHBtn=zN7 zkMt29m>znb_3g)2hf4d=xX+wol%Kctw%NIW=;J<#C>uVC!|=Q9&6jsamVLShjI}>I z!fTWI+6YGXndDeKxr34rc>kU^Jr>vbKRAe+_fvcM)qMm;(i zf}lNex>K@~j%vt~6$Vw0UB}QQbi9o|$|liuB;<|ZUDbBJ7XZP&DX6^ zdjIZ^jy8OXrzqp*XyA0CA;;3$t@;l`n9l-RWto+>FdbZrHvce2wLs&^tJ%Mh*r0= znA)#q=ehc*$tc41$A(*sc8CT7zlV0oW?5ZKj3W!{TpW(lt0`+bX&g!fjT10G$rdO5 zrXAtmU8G-W~1Y@bbAVAt_=l_Zwn;0u{na=44M9PkDm{-0 zLG)soFQde7qOwUWB5qeMS=lZ6{iDl5`RFYh;Y27;2km@fzc8L|Z`O)<8>^n({UUYD z+D0y&C(T-My+srNw&U&0!FBaE^TI6s#d@;)xckP(@mhx^tAEC{ce)p{R~0xqQoO=q z6@~zp*8gDvMtE>(17x>!ZbC9b06IGCjUPH=AI$a1tVvQ%hO`rwDF;hdlV{o^*YsnY za9T@3OWF|S8d&MAtywMjzIG%MZi7yfp)jYJ`UKTL^<h+2`&q;rFw?K4I?pJJZ@Q)Y|ulR=<^|nN&@wS4k{Z9{VOZx?32^(b_BwA?G-6Q3(ro9*XvX6u#5UxLNG#%8n>gw@X{^-ksY8snYGj_8{wo_z+-*WC$7 zRgrD0W^?fA8q^W*?S{Q3 z3ng*t9iMl(nO)beZcUBuVAAQFw=A$;(|r?>ivumIW7<@W-|-!RR^ToyIC3IZ7D{Ft zKbJb!O+$3f)=UpQ$_L>?rdIH|>ZiPPV!Fmr7I5>#F8y1d;Mkmx%O(e{HD{#2xj-jL#daO zXCtGi2^goXW~Vk0yYJj+c9u7pnrHplXuN!Um5UnQ=fRB%K+9vquXmgUGs>02AxYcA zzDMKjpxl(sZE}X)ddlxwl-umLmS^ML?Y`*wwGFSE>e{^_s-`rcr;zAV@0OPZlW(Jw zD3esXW7Z^j_|%usr;|)C~owY4%nY+T5m5 zaktH;$zVgtg27F|vifkBZDAWDZtHO`8Hg4t&_S9m+~rb<@2f2s!m>EgdFHmdRBE0j zPO_TE{gC(hW%6=+N9oz9uL*d2wRXws-yWK`*XA%fi*ws9i^k)D7+dgbo|W zn|Ry5)68iTN6y5rymbJBzPJ$2$uZ8|JkL*#+U>|Q^y|(eus$H?EdE;@KcJbiu9t^K zi0CiDFCVYz z%#K`XJeVo_m$nLx92FlvNozk!=(#kWId;o>&0}e+-RjzG zx$oz^x;|Vj(=_znRuQCZe8*A5AAY(vyufZKHH6DijcL+OmWJwdpR1Lp1H8N7xf8gw zGIu8yBKk>jIL=yp|KstZ*oC-uR5@0Gb6Cy?FlqC22u7g>$l_HmSK6@xrDNW|H>K0~ zs5RwAP=H0+)to%L^=xz};p4C&=wYOJl{9hu66KWtM(@D{g~yMNzdoUkk23 zfdr;y^K`Oso3hS;%~X}{Vv-d*#%wKJ`fJ5jOx6a#9oTX^(}IM5ZQoywzl=BQG}l*) z0$C*4a(d|TdSdxq%RZLbHmtfn+?h?g3kPhU&c`UZJh7}fpBMy( ztshc6Mq&2Es;4nM%w_Hm5^G{9lnd7+CTv2QL%a5u){}X*k4vgO;?EZ!RR;QYZPzTl z4fuP!X<{uPzBN@C&YFW3Zo}qC)Qa#jp0Vb1@hmP!0?R3-=E?D;2+mW1-~<6OQif^D zvb!98sQ)43cl7c)9PG6!o<#sPeAipXb68qGH~?vRe6HI5cZnU6N?%Y8gY#0dp=zwQ zXLuE|Z_Q43wqXGb<`yE;-g|FjfNMotz5Ygf_m)b@sm-JG+;RD>I5}VR|MPdLho&_) zJquEyz-dhzy-UK3!^5>*@eHwgsnu`SOi!O<8pK=RR?B*x#ZtsD7L2*DjhpYj%-m?A zdXmausB3#HgWL4cj?LStrtRdqsqW|{83yS)%e~!mz!tG=MPgKa#%;38kmlcme!dwe7(=*ObrrQE^MWGs#;Ub-pq7!x~T79Ql0jnk3rbYwR>ut%-wVuuG_7qTRI55t`WfclHB?ZNzi`q{Vwi2yFF{j z*xM@O@>rH_u2Ae2QN#!@?(7!P(t&o)O&%Yl;C|BMvA!|a-_wxWMVHtoKR1BGtt8~} zf628ijw^q)VTc2WP0PobRM~g^gR9(OrqLL3tF*SqiL3e5#)M?=7q3#9_D3>WySZG& zrknQp$xKKFHA{iGV8fBdV6oZHj>FusJ}u&!<6JN0A?XkwO1_ZB_y7($>ejb|=`q8; zp&p0)X6FYjZ7)qaVdVh6p7Ie3<%`JsOpWz4nTRooN~dxSj?cY(2<>2y#;)loha1V z;(er-55o7D^_}!h>xNNfQKk$vW+Jw|yumt-Ul{1P_dVr_k`D+HmKux`s115GddV($ z=-8STMS|w(Vscw0mm=aGc*|M$z8lj8r#r8J9!5t?R1^lF&LAtfvY8_kj$=d#6Csp> z55kPne_HQdqC8WUOZ<%DmpqbTy?p-$xD;*ZEyRwsI*{XX!-C(W1T~v72|AB&o~*th zb^zG+V|U!__sQUbKk{1_2D|=I?QnLMIZ*G{@Rew}<1!fRCdR*Fzi{rGz1KjnUkTCH zR&8Swbu|XiS4`Hs_NP`K^EddN=;&Hwqj5p)o%bo)T5VW8P5PeE^zLwkNkJMrn29A0 z^gsaQ&Ay@6<$-Oqjr!|$kLK*;XrV~oB-+UBuFFq_0n?I7t8Mc+69!VAcp5h5*~$6Z z)by_eLs1r+JKfp~t3-3ob$4n!repNXGu{OKB7{KjvrxI>EII9IZkvwx(a_%Up(!jj z~1!?dE6{iopwm+OfK=y9{(h4J<3fc-Yl z0u1d}<70J;y&#RUR_@QErtHon7Tbzn@yBqw_bTdaS)%L{$}&!O?cONAy_;c5Mj^uk zcfE@tR^aj5OeKgoMSl03U*R${h^JZzYV-Re3G|Hpsh-D7t}gP2&fe_6=w}f=PnO|6E4MEQ z!L$(%q9`x=+e41~R;x+`W$bWKi!7)RAP3U0|A{`>&`k$C9C*QcGuw-ms&c$Gr#Q{dvU=mg2u#$s%%sovr}Sm3 zV@6M7{?Mqn^_l#o%y@`%XZ+z4b@F*an8H^nJ9|Bx#vqsjv^oui;#W_YDmEY)kLw9w zsKX?HakE=(s^%qdD!5;l;nt-F`DCd|w)d*#M#gK@U2rl&oKB(|bnb>g;@4FE-dQA@ z_IqE*Kq(;vuM#S}_S!{O-RhudSt3l5E>6u(&n8|&L!U|g>j6kdpB&=}I$()OWM#fB zAM1<3&D+eaOspuMW^eXBCLiq1lkt;U81N5QwWH?8YiyVCmwn#A8nPc=P@&JA`K0H@ z$c6oz#u@^nNcWfV&_JfD#B7a}qcVzrj7~<3!dGLHX7O0sm~yp*7l@)FAVFyAr~p{& zOEyp<6Dz(ti-gEH13sI2W$auj+Qw<@0tEKk7PZxeEJRIckM+rYWc}!I%0QNsoT0!820YrdWZSF z9L%r;{|Ehf;OvWUj`SF-=IoSH7g(asf ztI+anztd|@-8xLwMwPDM?cmEBtvf|k*8Npos{;rQ&i6&Ci&?zkB5PGhRF z+rfBzX9VT>wkERTRpVJ@v-y8z=~kf=RQG3eVt4BrE%r;RKdXrKzK8!QkG5M}2xdiI zX_jxzwi*{0a^mE&oe(OCNYW_8cEA7z@oyER_?4g7298u%C|3XY_mQ^-EdjBE2TWE-wOAik{2lh+2DAjGVu42=x4c zB?Y~LhEX!^Y_5z~ zq1D;1%j3^sn?`oCG#huwQ}zpugjQ#!aCR=roFvliG}|=``{Uquccb>X3C3BPEp){JdIAv1 z=$f{yAC8`fV6t;Tc_&!ivbRd+^z`D zMlT<{@I@&x8eRD<9)tweN2_1Ay-`+*^x286HdkQE`?`+svhtlTiYFXGzw0L@BqloP zh0WG;#{G04nyxu-HLtIIPT&$Pp5wX|AH6spsr9Rm8X}geT_U$wo`WjN$g&fEwZG!~ z3oC+fwm*~bVny8EFU4G0u6G+RZ*>_^VH=rtw%8v}!_jAbCaqzI5!E$_G*r%VIKO7= zdv-TlZjhgSyjI4XjZb9GW#R5BY60Y!8r?Sw!8~FkOIKT+-}g|GCOKR|ZZ0^y$=~VHn>;FX9OmC>uoWDLSlDm-X3ImWCEk9fNTIU#4--wJSXZa^B_>VD zouIt&nBs>7%UjXn`-OVz+Aw=W5;m@m2es7pa0bF)x5IyzlL#vXXpt)VcSrrbq4F^? zJO@e{q@Hv)qo1|04Dag3lYgBx76LZ7&fktl8b;1}Z*kAg2&w&PZq9bSIU5DIOdqmf zZg~X7`x0V5s(9AK*#g&n?@jE8yAUF96dT&RPWs_wkTXbqDgE~bQdUxCd*q(*p{{~X zWl0TEGvZ=k6J>-99d0Q&v_JW~6x3eFQ79{m^OQB~2YSpxC>??1D{@N<{0^VH8D?mU zfdD%*5yS7%C}R{@VYP3AOk_ooR;NV*Q_t7!cXt^qx^jZRvsnVUhS*9@zow;!`%G=T z(zb%TKY8+kFJW{BbW>lxC{K^R4-Moz(U#j~Q(T)>re9$vOl3fiD>@1WZr)V01)rY2S-vA(@7yAjUG`S@cK`6ePScmz4bQ!f>?5LDbYK%90y{)w=1!t0t2jJ>^eltC-rt0jrwO8`0(HsZZl0l z)MZ23xpsM%=ASjty{DWgNinS*aQkuraen5|N1zrAC{CJHR^!Hx#pD z4X#h#;s_deI+w%?|5ljXgQTTYQw>c{&+DcEs%-PWhuZeP$;CTB7&5n{rn_u?6J`rNCn-Lc5a zfy!gj$Jx$eCwFoz&;D|yFG(|;XN&rHQ_G#h!ALBrbXtv-`8xwGrM_6MhKGAsc8JL9U#l+KUgm^)A4GtwS&OXt%G2qMPbIX;2aE^6r`m^+qU&4G$cp4D~cx zOQ|nhHmjD04 zwL{Nofcqm%?#sNXN}w`M*EqyuY};;K=H)sp)ct0eI|#V}08 zyFh?+M$8kF?RU5!VuTjn8ww?io>XUjM(HG$IhRd&j%02YB6*$^rD};$t>;-G)+|n1 z1i(+06R#=`?2MH;M^3Q>Z@b$WL-TRvD)FUcUC8j`hpS4Wd21v@LsgmkLF#zN&Ei^m zVtUGRGr!K#Csi&=8qS21gvh$C=DM36UWD+~W!~1*6C9XXSkM4qE3-A8)kLKWass*f0^O*iYf>?wL<}WLq*^oTYgf%$IJorZhgym~45rWqBW(gTwFG?y z3gs2m8M%jLMRYTjg9SeUs$T#t2!Na)Hc0dHT5tyCE?J9OuQ|$evykI1cR8A#6nc>y zwY@5Mm9PwVL_rV0IpTzLf=C;=Mb5q zKJ6#8QsnWif7GE{j{@hctY1kql)0*dCC+Y(?wC&Z%5*R60X3;X@` ze?6Fu0i9hhnm!**(G-1s*X=-}w=>?d>6-RP_oDLpx|T*73jt;08rfCvKK<7J=7j22!OiIJCTZ zcRZ72?40)Ton$(84-INQu5i!iWcM~N>>~UR_6dyf1LneXJ9_>KO@$gXn=8L9x-z~< z{WwaI)2u$u&Gomq;UfXMIH}%kzx>vHQJ-U7YV@tJ$)4;F7E$gsePNkthQ*ZrdfsLG z0oiUKc)l6sP=e@86*QrnfIpro=do&N)k2PLPCxtUG^Mu*-~43#Z4Y=(1A4IbzmtF4 z+;t<2*Bx%y3Xqcx6l{YQq(P$oz=hx5YDpyNWt3_*ni;`bqlxhp=n4%Y9it=*Ii_;JIl3WyJJ~U(6o>uB!p|10TLlFUD596WFjbL*{l{A7L`~nRo3v_u z+5fVouwR{MJa5~>Q!-Im`*TYZ641IbCir6C3S5!uI5x*>fu0{Dox}9eeCh6RznUVw zzTMs6^TO0zq@4zjq42f9z=kt1NDi+|DI@qZ9ly=?>sv-;dli!3#$}b#K+(Y$8RZm0 z&w%Ut?81T3VHX)^f)STM!ioEW1Rr4mfp|HWTe5R1yzdWw*aB&Hy#D zdKtfOK*<4eo519dmVC|-TF{`0y)8%D3OE5d3>eKFD2oWaB>V>uiQlK|rgk-J*d z)lupky#=RE07;1IgG8uGtWZ{4MAG6Cu8gV}Ef(qSDLOzf2g2!}ujS}{-$mjU_r9SV zPgk@J*p&7AgDpl`Gl{wPhhTT~GIkI2w%V>H?5qM(o0r41?~IYk-OL`-uFWmm;j?pF z!txV|c#W3==alZ~S{vOo_6AY?e3@%J&YLl5!P2VR83HNDV{hy4AXM4^fpG&7_RrT( z#|nuqulIbd2>mvilQo;u+n1a}9!Eo3EwfzNtQws+$fb$XihR<%_E)Q8GN!lNSG)ux zbZHBNw!r?OdKC$`2aQ`Vab$L1I$b?6jH6brPmjZOt5C~MN||s$01)`E+uhwCDx+l}p{|>#*M?RM#eY~QNpAG}Qk)_os zg+Ydu+wA}bbg)dJdnhwou2-DKGcvd?=cT@Z<4hmQyDv@ixW)jx)!OQO&a%=z-#)k5 z3pc&b-Xvd=IblLqHB8E_<=Ziae7=0fzrDTVt!Lffe^@*;WpdKi=;~@C|FE#C)2gg# zkzTmlgI6&I{xEbNElUimt>)K?;)TiOYnm`XC*tUp+D;T^e-Hp%!|vY?=hHOC0FJ4b zswb7Nqkx%foOA2VmhaM;+tW2283n*eQ;}|CzT(pr7nfOCH47N|j(G5DJ;^4Mywc~{ z*NUyaia|$J7%EuD6g@{nO?x^XSdW`WHr}HNSBFQV$oc<8+gk=j*0c+@g}b}cjk~)y z&@}Gu?(SYd)6jV1?(WjKySux)yTh&b`{tZEH}2e-m>-8fo2aU&*p<0co|Ws#6kJiV zHkV<*?iL9{Q&Xvt7G)?Q0qFB^^aX-58}|zucTN-ys-r*@7o7mA542S>* zTAAh1KD3|HTq&YmEGj)nhVhzrpCW91RVQ+3K%N;!cw8PX%BXa5_!HBe~ zFzPtrfz)nJXoF-t(goJw069B3d=j|qnpPrtMX;(|E1wq~%CfdQZlk_S)xKx2b1S~+ z1Da2XFB6f1++loWY2()w*4)-T83h)5$^viK74i%J_~IXzPbX{nDVX7>No}Sayt0;t zdy7zgw|!HRNxz^`NHz^HZp!;GQ<1BY~Bp z_9}f6KoEb4D*fHUpg<~|5kFTd8he;QNDD^QOQySqmko@cX^ss_Sn*OLR^8N3p%$Eo zNQ#=Nw3L?&nqNPxv_LGU;1^)2yzg7R@;9L$B>(CYpAy&dt;fxnNCZU|tjCY*AP_!m zHgpPT1*F2eB%=Qi6!PrPWOjJs?P!f&=DEW9VT}|B%o2tO3JwOhVri5GVl_^VFce;|cS@NS za#KNNA0)aa|BRLX2W4q4`*lX~<{_OVj8^qEgHr*ki*~Clxw2VV-g}gNpPZ)pZI?4} zJv02imuL{~6`PJngPa+Z$iJlOT^|xn-pvGHTwX2iXZBSa-kFWI;*qzOkd)P>&sRAt z_rSVp)Ixy%4Gv_bQ_utQT<6W18pGYB_RLgs&OiKowB8NyjaP$N8GM9DdZ+$Ix#oWI z*1P}gGB(O`WLreCco;o-m^fc4$?Z-0Xjxu6Y&@u!_86%H*eZ%)j#;CuG&ndaH_8l5 zc}%7UeYr79d`pXF&60}m*&Zt$5^!vZES6W!@p8O=7lWIPOje(yy7XA? z++GfPY=G?ZFUQcdpk+iO(qrfqVqjK~%gFD#PvgsuyxgG~LBMAz2B`>UUnqEBST-=w zM5T)*IyWK^OoebaS%R>eB{JC=c^980*GLQsB4=0=6+((RAUifkdHzv?OC+16+;8_{ z7MkLhsuRC`-1QmsGLz5` zPgHYE?yy=%EYR!SEPusuKk8cfMbqWit=PFP@zyK&v#&O($xXH_^zW);`D^Nvk7+&a zq4I|{3}>0Y_nAZvr=sa?O$D17{yjeSs*-Z?!)gr+gWK&T*F&{VASrCFWPJ4GjA=&) z$0)dA92HAIOiaulG6_yaQVNQK;^Lz?qO!8GwB+PDZ9Ik^I-Vqa2|54(VsGjPhRE+g z3i$`bOhUMweh0Ss3rIC@M>k3~w;gvCC7*wRKKa{1h>6>?s z$tqYWD09?NxCEOZMNmHpz#$+qGK3u0Wdqdt60~*?AJ5I>km5EE>t5!RHED!HpooH_ z)!d90&BOrZC+S++z+gF&suGEW(h8#wN5l$ElKKJWEkNW(SlM8pp6jrkjY}EwZ-^o9 zmrUN^ZC8AAFahqP={=Sb0xJyF0~wjEj-^h&5SXHjhwxVSpg`wBBEcDzR?wY@8T(bo zRSI!uQg~!#Qh&n!I(tkzS${1Z%veY$NwFQ5K`YZdM%= zBI-NDo5@UYo8eI0)0)U8BM{&*@NYpEL4{N#0evcaQvFkDQ7DIk;?aZ&^x}2OM_dP& zBvs@;ux2x#(7j^!2bO?O zZjV~QiFVBZibR<8!)Su9IGd0S>R(2%I~YGE$>pFjU^e783pu(us`-M9VI{Hqek$20nHBys~R5DH++>eGD62Utc4sL)-BCTkdLo=9X5SdL8~H68H2R4Z84AtPpx( zV5zRYTd8?G<*m5py&cch%N(_b#9L_u2W;Cq*ox5j=caPQsUTFl0?yJK8mXD=J*V6y z;|6`BDPcBOQjPja9=)W6-1}XBk<+qh(iro*6*mQtOC47T# zBjDf#P`Nk5-+_tQ1J2{?I0N4mbqjHOP_JHstZ1~!+K|);9K58sL~mess0ZDJ21QI>FLU0U^IE0VeWlQ z&n;M5#C^&RTuiANv}`fGA`y%lCoq0sVhMU~Fz57IgH*uZZ}g8DR#~SYUa?-(T0Ml4 zgTV#t)}s^(((yleFPQ|90o-I)uNOmAYZ>))T8<3)%SO{BGdL@2&XSzhu&7}i4o!|! z-X%@1S2_8{ucq#^?2i&VPR)UK#wte-y~d@K>}cLGTH1_q5JC#Ny^%CqK82kuKKWfar@2B&;y1Lw@FTFj%S>++Ad zMtpz9;Iq*&<0LmuV@sCTFQ5b!@t^l5OIEn@x<8L*-y@Hl_@-FSMNBMOgX^EU5oAnVH&D_@gVtdL6PU;raexWK^eo%)pfI z*_p-vewc!al{f=i+@p;@J|59RtO3(?^3v&bp((B&k4)n2UiZ?%sg8~$N>+u^v0~p- zQ(F!TK!#H<~<*#PM94Qcz(QW3SNvtKpsJPM_q<b!D08fKW<}iInP`wyTO- zvsTqrxkdt3S_?UIMpD-4IzLx4cd*N;Lypl-JoH2+wV2Q_|2TH6ANsYakAeb(nq{q8@Umv}Bzb%X2 zUIip8oUKA}S3AiBX%*dX_I&J25O5U?)=Bjn}>S!~x3hHm&+~HZ-14Ths3Zd^qR~&Q587y zY?H?X5>1nHas@}%!lZ~MIq`g0kvI%$N_%B`~(gg=~P zvh%sbbaW7X&drsZ$_JmK0)X|ry!aMt5ps1TpNa_X7@11&w4xEFn=cOMB|L8tW$0IX zjv{#iv~?7AG_&uGI%^s8W#6Wxys(%%b4yx(T~P7|2i{OSYZ`zY5t^A-!j5t;MN zS5pna6g1R2>+c46OxbVaN-AAypn^NFUr=)O!J05W|NK<*&`7veD=4YvL)Lb68`XK;$!v$=rPV@u8NHzbu8MgEl7^CO zqGV92a@RZ4AJf70!j|=2mf{8FAw9T{M7iy$urE_SSyN(xz zvCf}eFr3z3wP+MCMCi_f6Id*mL|-aZu0#suuyQz*ev($G(PLAp17&NUF*h)iR`LQtSca<`F5@N^8d7I87zUb6%dWCP9 z^3SBFAM~RL`qdP&F|}aB^%g3PHUdi^%aq6A!%F?f6VMWdOX;jb>7=?~g=qi)3z2Jr zW6DY|Z>%yiXg>S7Iaa`(YKfPuAiLEVif+#27ACBg5p6y@W_D`xWuUD@uR@MuoPrjMT3 z=Fs+T%;QoMAH}E?vXw>vCMa5l1V|#x{7uIAHGyU*Oq>W@05!I-WVr8IuyQkO6*{AO z6}3O1?`qfD^Q}aQD2}m0nC5V!$!Kg_$XoTvx(m8msF`zMse9bLMBQ#@V{|c2v~Z6f zl@hyR5)!g9q5r2>6aCo$GX+z)TyyPDCKt`*l|=Z=ywzU4OB0{t!$BF)j0xgpQaTPW zFrn#ptfzR=0=Bc4&>Zq>aw9I$=0dko7$yT*XMDqvN-b|Gi-z0Dr^eoN)NV#rF6gC3 zOXEzNTQ~iwh-gu;q_*dy9%yk-z2?s`r4-4@fPQX-KW_`na;BHP*H+uPU2*uz2oqomhbl*qND zDc$-C5ycz4gLMYZw0^6F4rZTD?rV8i>rOtFx#{BO;XB#egK+f3Y0cHRMdX%*E_|-d z!`qOd>UJrZS3H0F4Q0neuIr$Au0s_0LeuE)_-9iE&ChKd%7t)wZO4bJ@RL!_HTq4T zF|fkx9+=6soMw5u@9vVBwpc~wYy5T%4qahkvFO`D9H{NqOS=e?1nW@GNoGi>gRfGV zHnh#mHROyP36Y2YQJmc~K3W2_k;KFob`^O4)csLf3FSi zvYJd1|CAy;z!iP>DMB_6&MdN?Mh3HuOJf>iP}U%#z|!bYLXH>UXeF@y=xiP-n9Un$ zjO9HcgY7sy<(i4z6ue7B+fa4tzQi6|8_CCRk*oJ&WavWTxt(EkK3p*h;)gB}$O1O3axGQlZILx(5w zO@Z+9!iy!erG9%^L8v7r?i2TV^Gnd)Ch@h_JBwR8m(r`?caLe&ev6xw%g-xU(;sik z6GULZdAP93>{9tyB^&CN1%Yk)e((k&Jp$vVy1^!=GPLK>w99m6OWtue@a&0!Yw6Po zcRnNDj@&HO++qCoK%VX1Lmmjw6MWf`Q6%pCs!63Oo0#vdx72PG_QO2qeJcGdi5)W} zV3r8L?WN!XHB|#;-d#YT>~xqGIo8-HdtOr;H}X~;Jp1aG*NF(~di|mIck5hI?9XMR zz_+O~SFzF2SwTyml<=UTZ7+)PB-JBlBwph_UENWsm>DgF*XRti-$v3b*;=NtGkq zZ0-(7l_15t+FlaJ)Y+B#QQ3|L0t5-}t7O!?2T4UB(Sr2&{}uqU{=3d}(o-3Xc2=z5T6Nq5AMkjoceRkogB{POJzHa*K*Y zESX3fE+c#`3OBohB)}P&m*ZhPJc&J4+~Rw8SO^X}KaO#AAjp}Cp%!BaLbgeEu(JPA zL4ZOq6tndkmuQ)J9|+YKs?e8Bg3=A{V%8fIL=T7Fk6S@Xu$06;(_d^gMK6Nd7fs5{ zJhl9cfm4m?QE#tn{r1-3`>!B1lw?*tf0*PfpAHnnioE^!?+RJ}Pv6VE+13xLO3w; z9;&{tB>T4O^*Ad!AMVaNG&h?WQQ=8Ua#%Dp3up}9aIxre_vtePnjPxjoX?s_O8#zc zex?fV9~|Ur(9&@6-VP@ExJH?irkk6KN1*poiF(K^Jg7!C2+l-a7n(iwFr-lzxlRkw zHU6Iwa3|x5SH`oMBGcqPS0LhfCn*onqd+R5kF~YY3s>aceXgF}sQpjemB)8Vq=C)Q z)t!q5rrThzQ%+gTvJvEEPPe|^v4#t}M8uTWQ+1cS=`R>m0ajoQ6Y9aB&RlWRJtdJN ziHwRWq|oyC^gG?bud_xco`%YHq1Pqj_ASWn4H^3Y`%S~uO{y%g7*Vopc=QABpE`8k zLlw3k&vO}ns~w_fv-Q6u>Z{Oc{?rb%CzPa#1k$z@bZQ1wk;4{$n=gu5tci116R=yp zG198jZ|kVcYY92)s`B5s?R<4T2R#w&cOYncZM9{?CoQ|5^58Ljv#v4m_ zJPsLgIvW5mOONm9q2xcHC;sYEayH8*NUj@6s z7q!%cG2sj0+X8CE9pR6@U8Sdnr9A@_zb3;wxO89W9R@)`fMQ&dpmkzGw$P{S)PUL7 zyp}*=2QT2drkb7uoDGqK*Kh+o2yV=%%_7}wDeJ&wV~N!OAS!wK;9}aKwNcWEYcVDO z$^RJ}QY>XZB3Gn7f~q! zK>;;IHew-q55d+0v~*EJ1T$njev>c03S$s6eguF&96IeMDn-BqOe+z0VQr^?;nHki zNXANyyM`{zAnXzJRE&x68{!sl6{8%vb|sfu7`#%~HHL{aEVyS9&^Q6q=O@nCGF>m} z%%;Hn&RJ^>nqTW5eO_W`-X2bxo0vq92AUfmm*8LB(OLsXzh`<@9z*PEKn>1*u0*Pycn`sY2DVR zFpqX&$t1X3UmkbRt;=zu)$R2cgcA?cwTz|AS?=PG`hjBn0H@=^ogbZ%ZU>n}>P&1| zZwEJLoqi8I%$Ex7C!MJkoo#llclFs@*G*~{-u&3A_LxjZEC*|qeg7G_gD-IyZ*op@ zEK^Z2)L*479beHRy!Lqe4}bOaJ$<5%qshP?=hPuSo+Y_!U9l@A9(=mfT8e^_@`fT5;zn{n3DJvy>Bt-Q{u zp*tDYo-TAVUY%BMN*nv{M%6@9{Mf1B$z><{i8}WFhQ0xdvVUyS#=z`_Z_1;hE2k+{ zMT4#p>q^}&wtgL2v^z57EpeCCV%Z`}5f(p_lfD1d%!8P4jPKa|^^ZYo5*c4LkE_S(VQ2~b3w%&VtNzqs8Ea@_ zzDABdd@^4KLUhlGb9Z% zBHOswti+O51EMU|<*X*JlN*pwA;$D)4<`JkBm_vssi(L$ZZ zd5dp)w+b#F+i!SgY1+EZ1!yetoOWt!%I)dmOdVbEVlj zWNu$&k;johS$U>>+k)OVQ`x>6=9AL{SEgZz!}9diXPlj|wP|nZUR6gCP`UOKO?P~1 zM-aU@({wK|Q_h~O0;O5he#$V1w>%EmgJhE~Q zySaUgZ;R+&d~fU|?v$JM4m-V^@goa{t#W4NR}Tcz!U_rIoyIuShlw<*-kuvn{DXKI ze5%+}va&9Bc4|#Wv5#|IXnCv`$`>lMxfHFZO{C+n9tFM;Mr6FV-|0k0pS_(-DHL+U z#YI@7{Xg`tfu$W@bz*yYO8#?Q-0a1sHq9z zH7x5~*>$;IW;(>?(zwPB!JGtd*{Fl@^k@h>&rD9&i#uLd^=Rv;uSzb?aCKYnq{?`5}96kz#tyFVwC63fhhXAa}dcZ^ND<0HZ8~;N!{48#q0glm5o~8Kj ze4}<^_{OEnGSaPv2vJd-RkR*FB`h-=MCUeqO(MPkBlEJ#2VF7+=sqO#4 zW~BVnmA|tIsmgz7DI8hnF!^RAKCoZsMa2Dw3!vW>(ZCX42nCO8m6N3{XD&4E=Hj$B zm>?F7)n)eLXt@V?jq)qUsvax=Y4Kv4#HDgU{QrFj?wx6T*K*xg6nKH zs&_CTO{d3mLu-+FJNf7j$Qt=g-n0{`vN|AIVl64#Ojbv+3FT6I9^@iv(*U~8Ykwg- ze_7Lx?faW~c8t)G(Wh-?)vH|0m2Qoh&UKU6pQYLw>$V ze;8I4PeQyB;Csm~D3v6l!fm={v?#bQ12x5)X+up}I750KN!QDiwMuO5V|Q4QKvhn! zBpK??*=0xKJ2)&7LLKO@rap2@0wVV6%E4NKisHF0stw)I*))o^%r6Z9FD1^P%FXfa z7=X+`@EjH9NI+3xr}j4VW4pD81+Tw>v)#tVmh1@)fI-}C&#qYFUe z)$L;QNYC9u(R*J*Izd^35-c0glo>g3#wRN@b&VLIN*SssG9RG?Uz;z##R_;~%LrI*1tt3EEGKmK?6EaJM|N8C@$ia&?+*!Hud8o_F)%iazkz=QN2WbZ zd0bGm_A0V+IWj_&VxfCZw9$-xj3J>!m{|%{vU#K~J&3|Oa8w~}Z4Sr`Kn6%i6b%(0 zRaZOkSzdCw`S_`bdHf8DV{7!IVoh;WFROwKcUHP|KVxi#U1_H%n*0%sa3}|Dz=P3lY_F(kPVy2l#1eA?1;58qsN0F20dZBiSn%LdXcBuZ&}7Mysw_M zlCd2R`m?$lWjs;$4p7;Pfn~O4jlP?jeBR#2mNEp|s{*ZZrEc}CmQ`zFX`)1tscABs z?DiehhIkqE0-opD+HmELx4wWof<3XaJN}nf^5Nac+@C^8O#FpYmDcAtgr`TBQ*^rw zj|cnK4-XH36`H!0$GZxqGu?gzn`w_KYtOQ82KVF7y>XVy&QZJ^ zhf6XWP3~p>!;$*O>FdE@7%0R|97l}|3?6{3qdi(Q>iM?`fuqb^OTLW#8?BGRdl_Rw>p6 z^GgChN-5ozj&}Ig%R2^bH4;YnbQyD7oVBdRy~CQ$39G#ULZVT9;x&Y_h>sw@j`NG2 z?mxEeA~iyNcH+wry0_aXal{FOFWDzbibHG4jTA^_b<6Z>bq~SYul>LMzdapOQKCbN z_{_Nbw{?Ned=RQ5N8oO?e3IGiQ=|e{1t%$1ZKqXJ#z`%AL?NtsDFQ`TCy?Um3iHpw zMxxVL<#K>@*La`G_0)#9y#+tVubgzFHp>HPcGwlB%9Mj(nS%|qwvM=zx_|3PxP9dV zPw%n_J|nv7Agf@3&^Z43E1auEo9)xxCxJ=FExi)2-V<(iNZAr}7v*tWiS+BLc&KWol#*PX2oP~J<7Zw~$w2Zb%88%vGtL{A|0<^8r5ycy}s?;rk1yBG&1nR$K z6=QY~pt~HQH(1@S*KrX)Im5#A9z zhg%i@zQoH2{HbomU~#A{@eVyy>L_cS`OND-oc~3B$@lx(yh0gj)TXmlUh{ZaE{(sK zomyowtLxIRhrf3c!Mf+7(+e_QdyDo6r1zZosHIqIsTBozZPY|Px6$VO zFLb5aX?+M%RRUzYe}*@>7P_UN=Z6{&id$m?+Ke6aVabqNI3Cw?$lae1;yz(asX(PQ1hc_x9LA3mJ~ zBMT3Z!dt`c2?$rC|2O4xU3_N$Duz2I$_5Y6oB4sAg9k-NtoH-7%-=n~Tmb(AGY9yc zk5h)nl|(v-4!l^Y-u73xg0QiQF^UJZk%L4i7=JwL4@{AiKrEE;6HE_Bd+Ej;?W#f{ zw>eeId_h1qWGLFVp{_s}P6vGrf=<*Q=-Wt<*z|Wh-|AbWN^w2e{Ys;*I3gj@R5Yu1 zzM*+gc8juBj&8UsSE%@%5mGl*skM1{)*QvdC|=C@|@caGGu8iq+d-KMj?s4sBv2AOX6sm_K*pPw^? za0b&iZ=;QncT>uXoJdqWv7jjy4Y{mef$4%3Mv!??co*Qi&QUdfYrtV=|Ic3M42tT5 zoPGamIZ)GQ|CK*nB?iVzf8=xW`0JDJ?jWWUGm!K{;{Ege8|=U6;ouj`SW=MrviJ4B z>H6}}`5F@+ucD-MGi+pKWd$7a#XGX$KyEbnyv{;K&=P1|hi?ZB4GqgDqLWfd_0dCmZ*R-w+^6feSFAcj zN@6@a4fF>XVF*|OqLa#FN_5yx&#^4yPy5#o!oOz(?Bs1og>Q5x?Grw`mB%UF{&(W_ zJNA9e)-723{!d}VY0SMA-@68GH%sfocAVU08;isLWKmPmUy)c}Ec*>4{`U9RmH09k zxX!U|f^a7ty34z7PjrkBgIq*wpnoUc@Y;p(ZS8GGVd4Lzgr^CRV5-G03qfub@F@M8-Y;F0U`iAG*&g;vy{mGy58M@u9Y$`K#) zm*@@TP6V{5BD5hpE|>?>q|8iAzGylWs9Vv?)&c-YQPYVH+@S%?s5;=1^aQo~KJ9#vz zA9Nyq(*ckb5XzRhzgdKLhKpIXUWr=`WATF(^rl1CIh-1drmZApA4>L?lD7ruajb_f z)6D=wK?&=4mJ*)C)&Wc^aw3BWA<~;h;}t)XeWirZyurp?Ig28g&`$Jn-HU2fHe|H? znFIb&PP>y|W6p7_e`01dlmdRU&!(_4(>j)(7u^FAD?_9fl)heOlhuao;7tG^QVW0^d-MzT7=V{ zSN~xv*ji&B`oudzftubIOlSZ&q3WvW_bTulfZ+|_Enyw*_B zm1xTzOm=QXC*aZAS$xD^nmF4zpSLXhWCCqy?hBCCWwLwr1Xtkm7GUl8Y#KW?nq|xw&)- zBz;XT%Ss3`AM9*%@kK^D*Sx=~{_8gtKtOy>wZN_(|Je<4qdo>C4%OcW^n{#Q6Z~0b z+uys(<9oh8M3KURcSR>swxVRA*B+6-mAfD$ zbRRt40&ZSnoA-lL`@1=JRU@tPoy{XeEwmD~SDZ(Q^e(FH|C)A-^3Ej@c_Id8UtMPo z8u|aW`ye~!E8J7CP$|%TFWH-wPO~xZ7nAutjT9xFiD7*DPP)GbeN5RsO8ywP-Uk!A zsw=;~IyP&3q9%;EHL#H;_o~&YkzqwRaY!VehPu4lg|2Uzu*!Zo)j2^}gLvj4P!U|= zx(IO!(9r!on!fd$&jS=}}dV;xm=SXPTO6isG3Qv~8#9B9w7& zubsv68Hy}`44{yn(I!+T)1R~blK_osl5zXO)|Us{zeqN6W|Q3=3{dZ=XMHJH<$=b) z(5uq6=E9K3wNR(G&ZTJnGKmcD+H8aGDdcV1Gp1_Ek(Q~uY$I^|vj3&gOYG;4!pYF8 z*{iu6xW#%3Mx;9q^$4#=n?xp2T>B;-2 zp@}MFB-5}UD>EuY*|dpUL3Rz(V7SA+ux==HN>&zxu0Nun#9P;(hn8pj8sEqz^+%ad z9Lo$I$LZl|#?IJRdK!FT9S@DwOkWw$kpgIF04XOWCFjxfj8iJ$f4WVF36$w&b$7fB z+;y$OZavHe!mg*=&jjU71oX{iNQ(4a{khq^qTC!XF@A~(oMO$(o*f8+onP2 z8rbEM4T1pp)SF?GW`%{!@)>(5_tU1M6^YMBF z_kZ<$nD~$qJZ($L@K;Gpo72V;Dp3YdS}69i7fTtJK}otZc{}^uS5;j2dG4xg2anYT zrsK%Ixz2OQ1X=Y41)vw!=V>_#)qxD)&v3tT_T{i(Z^6QkXt||KZ|oCd{@woE3uot| zwB~s7;fW#^U|N0DohuHKIN)+b9B@I-&%ttDSVV4JR0dzLDa*wE>^b=`g0K5>MfMEn z>FFu2u%)lC$v>vz{Tf&{zg{V^8Z8+rL7$$X`Ep0$>3;Z64D;PfZ}% zNgq6Vc!-5Tv|3JV$baxX!~y|RS%>jd3zY=3Gj@3oi}hDcm$J~>AX ziFrfT_#n@+P`|TL7qgv#2E5HaP~!ok2IS2-nlw2LsI?v~?azMOkqaGb$FVP?$(~4P z=aLpp(n}emLu<7EnD%!3Kl8qVXi8U9wcnfSELyHJf#?cs%N7$A3=HSGJRRNG~kP8ntD^=h|t)+e`End(h z);C8~us}-~_D!#3sVOp6jf>9DB>!rCHaWsbJ57(Xp#kj;76=!;1v(&s3*R{eyI#L< zPH7)NO&ep;iov$sn|WX424F<-h*s7r>^Yn)pA2! zr_Btm_Eq)80|@Gpbx_NBE=i4GYD?;hm{>GG@Gj;D}?Z1Ak3JLmiTkuUPm7QSuMci>DZzzY|WxO^v zsH|vt=dL<@MwTC&HxxeAgRj&}lE1II z@k2M}>BdygVZ&5W??Sk3wcBO&@r(E;E)bY>WxZV2RAXxdy*IDe6i+zP1{gFvY4+A< z*L#o8bOVR_wc9^!Y(GQd#3calL|&$C`x|XO;~N{q!hEJ`ubFCm?wMz&duvOsk^q?> z4RR}m+b$1LVbxHBkHlQA&+U=502`~}&BSY#fjV_^k+bc7t zdaWozCCluF-SD5%_L(*$3`qO*bn_6E^(4ThsBBv-Xy_1_R!{iW@p*AwmLYN zXxl5Cq10$AJ_t9u`=jNh`gritGJ)(gUWe*yiE{^4*Nvi|p%|Yg@UeoNytQYT~NGf zcC*%cAPn)tTL{Wzs?cb-KA;F+s0|N{g5W2+fm!7nveT%qBk{N#&;Ahd9w=)_$) z4?pu>7=9}{Y;VLreZEfeOa%iBg2PAE?=RVAAHhrE0snW#mq$?dxuWv$l8nCb)`lXT ziUgD0-XHI*(6|D4arNrIsl;Ik8)P1t>RzuF%e(@v$oJ`Oeh`?tmT)*-=!=zZuVm*@ zOT3!>X|m-l_MRi3Yd0XN>!`SfPis7Ugv7?4%6lZ*b`$P#1JQ|?Id?ipybdNZt#N3# zU#aK=&&*hwSo_m@wc(jVo3E^v{?)BeMuOYj`px`Ux@0f!-@9~EK~27BEN=`c7MNH?ddGzN*$ZZ0ce1mH;5!EK{A7AoX;wR@Ao|( zpldoPw~QS+ z~J$HDin&GQMMv>|Getb$P=U+YAu9{Dvo-2Wfb?boR#Y0`i(3oRadkwKq0 zos^p=lSH5giw>rh{YEo6kOwBCG)^2jk{xXcQ>Mv6`!Lp^5R%4d$#FUr3UGaa_$fk1HZ7X`2TmRnN@}F8PWx9N8cf9!h_Ur`rNdP4_LE=cjw2FD*fw`M8D$NG z;G%*#e#M+Rng{?RNP;|4B@#m7Pb5`FB!J{iD*5Bi(KGBfq+$>40cE22FvmWhWA+N4Tsya zWX$C%+%>nL75pKFP!hGzKY-*I;Y**tpm!CRRVIX&Q;xJC5DoHLKOkRnM|;LlRAK^4 z|DVN8u{}1Sf4JF@_zd}f>-GNJ{|h+{O-X+KUR?j&+}zmM82)Mxa5#vXNCuBu)ge;2 z9-0~uvnNc50+r-X*&1%ttrBnuD8%ep-Qoq#ml}S7tpu*Z(4YG^@)d&jkUE@qS-oF! z-rJ+=K(w-P|I$}FT#f9Ns8Aybw4Yl$gqH05MNM4Zu%+cAD-=r~ijl+oVtoQ4l=80+ z&xQHyWT)!-Zk7@*sTC_M z5n`XPQ@{`Tmas2jFc~Ovk0%`UU?QNTH*&NQFR~|@yp%n1wwm*a_u|Nr|O_^x}4)9L1K?k!)Ir> z&*5a&5Xyr?bFI3G{8DS>$i{Cp7=D%=s!WC<+fBqmWr)l=Fn!RwUWY z_qsbDdf?2^{ws8<*Ks8%$*smd#?o?*7O?8qTI;tIk-FexOF72s07dp{^ZDqqnP5kC z+D|$He??-ge z^gh8X_wjY>;k9lBrL~Q5qO1<9at8LqQt5iI`u^ErtL ztE&6&kcXA}g$K`o*@AayqNeR>KO($AI~!x=%l7u-aISFh_k#aXLf=uL-OauU ztEJT}+I>N}nEmFw$FG4}t3M^K3c{0md)OEVn_VdfvNS)mu!zIJwkY~}KRaw*UexC{ zyG1k8y^lOyx^`MAG;3s|dwc7wE6i^$BN4c^H`RF(-mC|%#PiyOlYIJfz^=9>&yq*o z=KjPls1w`#OnObmD)!3boUlG$Kg43nEig?EOG>NkzZvjaD0{_%k#;{2+szmSTiOsZ z1@SOlMP8q?_3@L_6&*=-#K<$N&y5i1vU29_bPbj!;T|zcGcazaqcw<1yD2>`eX@os zwAYhNxa+SKY*dWAJS+R^PFWP<5TOVt)~o*yac>E^+-+RwJ&-qDhbV)F@05PPX zq@0wcZAz`<>;2aCVfQ*-_}qPro2#Mz-Bc!ex`O#zc$**c^E&k;b6Z2dA((A}>5^Kl z>Aba8^DgPUi_-;MxaiYK#%qGtoI3;0doe9Xi5`3-a}Xr--c}RwIeqzU;>z?uV#6AW zR&D(i1#noIhn~e0c5KFKv3Yp*q0nWnJkAoH?^?o#6tLM!Q7u0t?&%>SA_4#$TvSn- zneDge`dYaErzEcI&_SbmyZmRZ^u)KG;EYAw3io3U@Lu-KrshrtkdqZafX2S;>9!_D zb0%hWmKX_I^`Vl0L%g-GE>}7C*{!pF!t#CoQQ1_#pA7N-)^$`7mNi2KK&>k_#8D{- zD3v}qy?)M^!&=uW#l&hlxMhKGHARu5oT?*2? zubYoh`CXjCdYlj589DRPNb$b8d3sbwDi%o^p7DPVot^hhqM+zhoVoBV&4uS|SE-sc z>g>L+)l$2Wm)%_HCmKCB{1B%iCm9&gXhhd;I4~+<@a&VYrT89QQ=}3M)}_I8)mN)6 zlCh#Oyhqh57N7uq=x?cE&BLw62MJx65(%9dOwn813!4tK$##4y=&T3mbkAMt0_ zI&R5@F$Kc_PksT6&q?iGzhjk;PEIr$j~VC~@ZX8}Oi1RcxsU}7Q;JI*e!mcU?&D+h zUG`s|>lFls8DJiYQo)6>`uBvkqmblkREboRDjN5GF^+EUt^CF2A}XrbB_<9bB#H*F z@%ba1(yr~ft*`Hj|Hl+C?*jU?jhO7O0T8(G!F%=Nzrmi^MjBvw%)TH>2 zm@}duQel4--7d*iM*|E(anJy8sWdzKJcvYG4(c1gY%IN+kaMWU{nq(@{G8Ug;rsWY zc-+8NSS*_h8`mF&lNNwx6DQe>zul$6%E6M(&bJ9P>KN$guMgYNw|G)R8&Ew?7t4aT zb%^v1jhOOCAji;#cb~KVAp~xn(o&~IQd7B@riwd?#y+*w^mHR8c>8-ak%3-76FSP~ z*4Ea}2_8B=tOPL$iKhpg3YE%sX9E+R`s%5tS!#*=9_MuRC4Bl>n$BUSILiX!i|-lbN4k2?X?Z2 z#wMq#YZ?GZc_A4c=452B$moZIgTs;K3!{DoBMTQjbL@P7OOfa;EFW$vp&yJmz2sfA zN(tc*e`vUQVX2lkB9ds1gDzCIZf!LDGTkf}T5u!T7r-_}L`$MtYMc{xcY1A-(ZJL5 zJni#i#x4DBK=^u&ux_+dfp*I-q(lVSVAxZKjn{IZfhbx>x}+A;*&!L?&Bj z9zvk$$L{3rOz$0=`WTdn^K#2%sfQSMH?LFz<8f;-1X^yGDF>~r3>O-1!;VbK8b2rP zsAj^!?`m5wQ1eO^1i!@t;x0562Trt3}3Zop?dKg%X#I+_F?x zrJ)~#>0zz30!V~83J@ftA`uO8(=$Cf4ZW!*8g+1+nz6d8#I$(mw40AHbFt*RgW~olnMJFrgy9?4l*>G6x zu^Ch!p>hguy;;smgLB(!Z@%_9SbIk~9-kove=Z>FX=`*2Ex2Kt^%mu7@{Zw*>WQk` zkqKvFFn_(*y#6H%&Ha;3*`i^X9_W2Fgv?|1SMaZjk}B+smL?nmIm(}qODT(HyiM@c zUbW_yy`L5#a2e~)Z8DvS{z!fK-iK6U1d9zy9nf8Gceh}Jzsb;-GEy(|N4cmT`*nW| zcdy+X8==0d5E0v-+OSby>(Y$vs7b=cQ#52FG*OaN%=O#TE>B(Klwes$5Q zXq+~Cmp#4jI%kz5=BR4O(^2k9I*$y5?Sm$P=~T0!FA$B8=Tii4X5OAesbPR&&aNxt))^=R`%JT{>ty+cY=JLc{pm;egC!1Dmhgy0arRVZ@ zxikhR1O%LU4FCb;_-boZ8ICi{ygJ0j$%z-uiRCwsn552TH7mr?bp?TlCzrv+3s-p` zY|7CU>WGxq&1cc4N`a4f+}ZxRPyhqCx^kqkWK#D!t=JZ$@qlv`9wd9$L)un$pCC^i zz3ZN$^T+4;j@_ecp5g50>=&=WYpA!Wc^>9_gvA*1lEtMR?<=Og)daa!UUM-P_jNQc zP7+D|Rx8(2;L@fg&Q4KKcpL_k`z(he%EusIa@n_)9k3jCdTQ#ZmU<8}3W&e3o0M;e zZ04N$=V(e`*#76zPVR0;musSr2@Ie-O5qYhwHh|iNVpHSJPOc;pc444Qf4fDb1!pl z`uXvtCfJHT%XuQ{Joxg2kDa;^SeEu;=!iMb&r#FP*YUA<@d0U+b3L=2b#s@)Mfitq z#<{cRl;U<;=y~A{BtQ@O!UF;zjY`dLa0r2QIyvdxGfK3-;@KilqisyK;N_=;OJuSH zc(DB)^9-yW69?J5cFfx-+}+%Vi=_+XRrFP=ZM&``kKv-4);DF8UANl?I{H#R7~Vd{ z(LDePkkARM%Gxab&Ob#7uSTNZL=T-FpYRJ|xaoK-_3z)#H)NU=0F}y?kH>(_06gj4 zH}$O$cYafP9%CIJM+{E#g-9yU;`TiW1xA@_InNvje0QPpiNG{mnZA{rKQuVPRoLCJBT&a7G?>pyvba0&^5g6_gA5aoR{b{*D*N5aiM{*=R0^Rf(ZlVs?A*I1jMiMWD+Pn z!SLSy$mWzk&>)SJ4bTD%{N|PN!xYD|@p0Ml{+yXLTEw&1Z|5X;siLejnGZq&aGHck z7q&pLY_1?$!=GmVc;dJ43fKJnwf2KS-*~w8Mn-@&4@YA;Zhk{AZ!R@L`nOZqvQ*^ z(rYRFG5bsxfDKz{9S>DajK*}(9ZUpY6nroy>WRTjD)GgblMv9`DT`vBO>w_H-3fl| zU?Ab-)R>$Lk$Py0ZXDjFQG0nbj1_zcH@q?;WBA5SyYlWR2b$sW)QWMy@fTDOBe zfCGMrflG7D;1tizYa)HnKh5b1A3yzD*iIP~^lxE1+PCh13)tbnU;3wjJ@_}{zXj~y zB$EHBtQR68mHD@T{qvW93)ugs4)gK|`uyYmY&ADGm%G-&!eVi8QB}TR`|D`wk1uNUL~CJTUi}x!?t-wtcqT9!HK76%_@G zm7PtcB_xVdnk>5e9~?0S4+rHmX-o93A-#&jNH!YDFJ0c5zl5XxMwinh(Eo|8&F)zm8$ zHMCq)%NGR5!7rCDZR|5Mkx%tHD~MWR9H1%C+Mfy@4x=7w_(3+(9JooqcQU~)f5^6+ z=@fi|+frd9wwLK-fB){E=nl(`5`o3bqfk*6PaQ;wB16TwXMj6z+5j_^luZZ#G_q*m zmwG@tLFPAaxImPl2AOr9!l(^U<6IH7KxAT4+5il$zJ>wjbGknwZo1oN_}F_x7vkAN zDI-j(UU)zeew70BK{WCd4*}5-z!ESy*j7Z&)gufl$&d$>2lUFse4&@mFK>Qu0Eu}MI$y5(2K88oOQ;LjZ?Q-YI2xm!&L7-nhvz1PmOR=}xXH$ed_Hz?h@kv7|JH|= zYk$Ej$d+XGSr@ttopa9l7~D1g&hg@`?IxGWo06Egx4&ORDmE7c9Z@@8@Yfppss&VaQ216kZeXp>tMTWoUvtMpX83$ONJ!*+ zRp_3NpobfGlZ#LcYo>QLSUOtrD$k!(U9>Jff%#VzaU2Y|FQ|Se5se)!B>F24 zx324ks4__M>`!-7Xr7@v(rv*^W#HYqdpnSq&pc57g+DPDYnK>^=gnOiiLCq(4+FsUcYxm3KsC;*dH-VHe z(0H~J9hD%o!gZgcBkTX*)yOzXgG@`$2-{5}|loUe) zgu?G3z$d?1Ml79|jLHi<@cX{R3n>eMg7XdD6y7H<+udN5%87}iT7z${7S-*~^S^Wz zjMLu}TwE8rEF<=8AprZqUdlz!jiIX~6hKXGR12(LJJU{^^G!uQwgUuebS9xVKTbtkOk)K}?JMRyGuTcS;5kN~1^Zq=yf>p;{(y~F1N zN<00Xi@?XpfhfRl3;{xZqsKdp>rva@OXU7&ZWHB~ra)T_y^b~pUsvRwycI?g)rq^H+8b_`Y6OHmBPq>qdD_Ry1(1no=xNk&jXX9_rD7d zT1*!n9v{;%d@RH&7}(9)S`T)(W*_@B#dz)LTn}k)ejcMC`FsuXZZC%S{Drvxkcmy9 ze@QZ)2_Xn^NSJ#5^f+8iR}ApBeBDws)a-6;v{kKt^#^j@%+1E}Ko9fir`TcP@jj2T z5IM4Kq4v=ReSDC*VK$Wig5gj{&3%h^q60gqnuAB(tPoOu z*w5Zvyu|8lj;lN1!;>|n&w@t&xQ(mQPgUlbvIsvXA7BA;T@M?lr9+}`qr<`=0TLu6 zM(u5FN9%fU4_{;N9&MMbjqfB7tus!NDGZIyOlOW7wbHVS2XJ%ZMsuZxEusfeeJ^*A zIlj{z3Xyq$Q-I%bWzosmSXsBWx0C3!6O)qWvvYQi2Ye&UpW{wg+HA5jHX0o()a($~ zW@F(2>Zq9uOKgpM`az5zx_@VKt8*vUHR0V0s?ANzOsFV#SS}2gLJ2GWiWb0@Ev+RZ zQ7&A;TH)(7543BIV~Lc5`a_oop(F40?UL=u*_LYf(757xFF86#=-TR&JQk8`M31*- zBzNv_e!j;Xbhf#n`d$k5hP|JqSIR7iLklYxYG50tD?xi*Ba>wpBmfR;zR0QqgBLn; z^78&G9eTSo=(X5QtaIbWC?mj3(vOvzxzH2s6_+e%NcN zk*>6PXgOV?!W@KI`H(ruGzmBp5j)Vj#adcs<9=fQO7HG1uq#@flw|h04DSc=q-uVg zJqq=8T5X)1^5|0R;KNswiS@OrxuxTh5b)d!npDwto0*+euhil4d3hl8eVH5`rK6*> zxjR{OMka&M6DP?d`Bk%B<{8~4z`?eupibibSQvfs&B69Zzgu8I!sD z1I=_=i2~Y1gNoAZLu))dy-x@$IgC8-R>gd5UoL48tNbAO&vmr0x|xNSunI0~!HQh5 z1`Y0MbIpR7*4+{9`cmy5rE$unw)2;$0}WFRuIP&BWxnoxb%{73`X->5Oqf== z7)bf9z0P_A{*@Nz;l94UlCsMlulnwh9iD23HugC_I;}ZS`)u9dn_^w1wiRmpjhnEu znwy`tl?UHHcVv!K`=T-s=pAg*c0F0BHXew20!kf~7$pSi%&PYrr_;aUV4#`TF<@*! zZXDIk+N-cE{wQGveKOEt3dj$yp_%R@b2q@M+@rW3Ld8VYcTDBeoCe|(0;FmQ)%3Q^ z>roQWgp?o~PE=vONMr`irj|`7=JhjuiY~uN_|&P)Z9Fh*A&l8klKKs^eez)EgI~dt zjMCGcv4_yQa#O(POpQYRyEWqX}&~68=A| zJb%LQ|1yr)5#tKnNi72FOun(-7(+$EEJ~Hk+1wg;#g-TK3VF??Rrnx0z}IFUH$F;w zEG9slErAKE-df`MD3upZ!`LW03D@+D&{yg_C@$~?R^y|-e$xmMYo*sb}O9PWQ(PYO7Kg$NREwz!>$)b9b3BJY1bJ!na>-V|2qH+o$*PpME634LGlQ0 za660e?d0&JiGp6T1KfLPQ|3!y3vv z&%^6TyXa_~qo>s|zM;etFN)~V&&%nVlk#Bx5!-S#PbGX^&kMS`huAno{T)9@T7mO* zbVbSDa4V6ehHFzRv-<|ktzSf>uVAma1UxSlH)1K|CT+3Jd~&UR#4354uiTzphpm<_riX7G0mTzY<_JimlFEEnSm zbkSM0bw#2R-9#ZjZwz$A^fI@7D>5esKaG;5zBCVl7X(EG1+%V{gU6rVC>RQ?#=2`F zrN>Nfkr&aBIxG0zizdQRYxlYD+|QXdep_3xG>JQZ@6^M?q}qQKhY1a zBv2q94i>Jt@pT?UZw&ij6t3$y>1R(5P*vOQG(j)#waBcraVVAjd@7 zOM}sBP=cNiimNc=;Jb_V(aVfN?}+7qi|1DH>a@MBW?VKj5v#H5T zsMuA!_}!BNcy$d?n&dxsjW!oH$#Z&atU&^;bb&{>g0j>#cB?t>u#=V5~2Q)^q0b)f9S;w_bE1U5DG2^ zdRaR|zMEj6Y}ZfizIe{tSvu;D6-fc@SM4xVmfn_WdrwvC-OHGHzOr* z+?5c@G#tyURj>mUP;{CmfDdDi!XISe?sUM2B;*S(dLAO~Draa;4&)#?%Nzm$js2%mG9z;R`Si+B2Kx3ti^3Qj8PA^Ul>h7r7*#o$xwW(MsnWRj5 z(i548JV?3bU_!DzQ}K7!mHvc;ROu)eHU9jd@BJ8t?(38M(t2@yJv=zr>{4N|Zugeb zD-J@qI%~f3gi2$8l?sRRO>guy^8rQVdoMW)^ofHPw?X3tD27)+&myb1o?{5T)w~4| zChk6x7Dxo1osf0;sY*nY4LI<03X1y5^iN`c^^0rwPWdX!a7s(7{^|_s4W`9H8+*O+1f^NeuoFY!{aF4!q6h>7nr& zVsAuAa29qXC63R=Q-@}46b1*a41rFS0N2UT&-@v&8Hv9D0y}lb47t9(-bxnadaehK zO-N(2Dl9fA|HyG0A%2n|uJG%FByx>QB~r4x-OYGRbeEcj0@o$+PAHE0jr>=Y53)EN zS!Sd^-X}eokRk60%tbVFri%j*UvaglQ~J>jNi0eJt{2gKSAkH{q_N-tcnmbO@1~|# zk6xmSS|!TbtL_O!NP@V{}%tT5Dm|L>n3bt8lp*j3!xO5Xsh|UxZ5h z_ceNKptIvTUSxfstlN09RZn*nT!2rO~ZXdz1ZAV{^kw15IgVG*p!A#T5&=6T~q zS7FZjQaPbjl~qNW@Z{+&8zRO)<-(y2OZ7DG`yGw?ozv*2Oi0EW>DY4kqJ9l|CO8Df zhr10%D~EnX%@)>sDG5L4?8TW&n6mlXqZr>?TtTgHwaw|K?6Y;vrzjhcd8F0-iCW{{qS|&q;hJ7VNTiH+il+czlJb zaEU%{GBpEtmX?)W?SYzq*e8z$Mb$#lVGMk57ksL$!5A#7HGAQaXUSly+)mx)ThYh6 zfsoQ~H+XEoyJjVpNu=OWMJ@uj?0dpzm~M6##ypKZ!B$Uqec!SkXq|d zJS>5xW9(?f3T^RKz)m>UoViTPpfSrg*v|&6n=5-8LkQ2N=Z{_9dKrILeZGE$h;azY zDE_3e1=2}iE&}ejYs?Yj=WRw%Xk%vw1Tom%-s{!rI0tv_J~Uw3F=X#Y9t+@`qyWBP z&An+WvP=yuiDf!VBQ2KjjJx)J*%O{c6#AWrj{I`;#GRp9F-D=e64tzMAMkttMTV^i z_)4G5LTm6;#$*X9Vi$Pbcz(H5hLMGS#fS}f6n+&SxZlE;s16I|Jj0k8Hq-BFk7IMr zd@&rt6xZ4VdQMzQZ4spj2N;6T1Y$yZW>_dp(Sb93j%l8Zw`rbY$BEWz^kRQD)2Ro# z>(vS0f3LXgbEWZ>HL)jpyz=p#>CRO#muOj3#_j+5gSB{h`X^M{LypIeEC2O4!B#hEtb!e$!cY?g9z0x(>^;gT|E9&vBH2d(A<>F3?|9$Imx)jsLb~a?( zFJmeq(28p#U8odA$kUvu*7)AnOMkTG;_P@ot<5Y6Qpl{IdDOMt{Z2#4d6F|D&NV4w zQjFPG;jV8yz4;Z5mJE53YLqd;kW#}PzJxo+@Y>r`{p>m3t{3mnT9}2-E+q8t^##SL z9yPEPjs3+UNOeSl#)S$zsW42a7&3EkxE@U89M2CAIM(Fs)LBg5+}+P;#% zJnwFD$KC&6k^I=)q6NWOcP~+%|N6Mzp*IuU-uu(hYdj(j_z+_@4#@VqK^}E|ec4^W zQ1Roh_qi;tqTO88ZY*7T>zv2)I6fN82-wX4j&L9#WxnpE{BFj%{Meb7ma}}`v3@yx z5?R?+FSjzP4HB@azt_Y#o*b1>Y!; zC$}n~;aP&ezqKcX{fd<3O`QfW`or-)+-fCp!T#=M_JHHhsm`~bKbUCY02*UGQ9cDc z1Booz(6eE%sH!ry!u2~oO2AI#&yGCkTi*aEC@6v6Fua&Y?cT8;zmhY@u6ECiHh9mz zpk0g{gp?c78Vw|H*7WpIO56Wm~7(BNl8D3 zDy0gU*dpt^aFpFNdZu%3Fv|T4`JS!VsK94YS%n$p$O+BScQ&>e@xRo|4*bh02@8|( z^ZP8;n7F&UBjQMP_`D2+HV6#z_bkIKee&U%x4fO((5<f5d^RfSGOTYP&?F4=?>FJDH@kQ>8UA5>^)=!KKR z*~%&vIW?T1%6Ao4SAUpR4-|jr;~{hq(o$O^8LQvS0E1Ni2qt=9sVSNV7uIkTkb)mV z-#gixXR!os!^F;u=8+2^?{DVx!Y3gudOl?*K%I%g$l0z@w4wRsYh+l&<<(WGTKyMg z09JOE^Rbj6;QNxL(qFQmBJ4a=9Q~f~&zyspY6&0R((*KvKr;|c_`V%2(9+yoP*5t!&x*s zl*uzm5Iaj`v76;qiF++n_#g0g`(35({)CS$+}xf&EQh)m3~m5gmR>KO6Y~b^uz(%3 zU-h$GN2(nP_5XsMkGvi}>La64?HP|JDN&-X%ZWPhutmuSl&-4vt=N46p6)7TTE9vx zm%hKxG(eVDeUkDh&EYng8F-hv`TNKNBil4RyT0ywJXgWv@|Vbnzp9hns#FgNRUXl7 zGsz|SAi~43E@8skL)benS#p-9SU0Prtbbsv#1fhkT}(LKisfZQP_H#n-KL-?@7QDY ztSQvz;RnQ<3Y53?PFj*sQw8LIuwE=fApOk?TgIkdL?<3;{DnaCkOtLH-8i&=(h^GW z=8esOPCnK&KnZrX#$(PSG)6Hi2LZYXp4T`Rh+Ss~G}$v)N#8#?soU)AM&?3}%|r*H z-js$Q0u0I;{YEU%Kf>z|BQ zhI3Y`H82gM8mLKjI$k@5bBK?bAC*JaEU_v(j*uOhh&OIzEuP{c~+#E8S8V**CcCpfP^07hzq zn|7tvjS{`s8T8lz0fCpr=|u;5o!C-Z$C!q`x5GFxi!!i&#f2fcY{|i|b(jJe%5uO@ zDWHG#;s?69jT+$-b|KZWY+!fK@``YG?OX0qDjUv6pEiTH8_71_xBY~mp|+7{y4Va% zD`|Kw-$f-4Hv%Q`uRq*96z5c~pROo-UzW6E6zw<7YO|-id9J8?xnABb2Baw3z7GKE)Kg>?gl{PEzU6~Wmc=wX^jX`cC^LSyu zSsKWibS+GKFYbCgDVDg{rE?#!456Oo8bxr}O6sVd$(v8%DH1mi)uspNI59JP8Wp{V z=Jrni@+=mmU1d`_+&h{UD6398ZqwD3xiPvw>Z0`&&W$|0p4;+cIk^4F>!8Zv;-oZg z548A{(9A==NXs#jhQej9Mt48QXXPyr0kUk*c5Y-~4(X44dYZX~z|aD89>d!vML#y_ zb{?1MAW%9NKlrVd*8Kht5)P%?u4sRZ*1+xZg_VvP0HCvZ{s4DzO|Knx*wG##XG?i= zbE&V&FY;NfU)%bSxpc;^6o=0|&?ckB535)~o!gjn4e7M9(xaE+`HHKs;cQSi=8Ir!M>V z_*bnDEJ!kofQu+0V#HJ-bpkDQ%{1x{u_Bb;C!!E>k_+p$b^#<99`Q3WR!p&C|4V-+tzy9cHCEvR z{+E9d&Vw;(ey1kU3D<#!u}FE_-^u2UdpP;%4faAO?3uNW@@9ufIUwnaS67+#--jY` z6g)hgeY`JO_m^YUUVUK#0y1y9508(#J3Bh9clT}U>3UoHe%)%;|FUJ zd)m~7L;(~@m|n>ZWIGM2OFjw5&gWbU)>nOEIM_01PPR9mztjcrzd~Jh|08ud0*8~Z zw3Ex+e0rJ>8oYp-zaLF?u4^(hyxItO9W+#DCoN!)DSa3AvClHwnjkT_z5{80^cO4+ zCI`!RY-~>Z(Ie0|3o|c6+pj)S$9z2$nj4#iU^$O`n3y9 zO|+EN8_f!tuu$px`G!cBAhR7-MYZ$t{^cK02}m0TeBcD%m2u|A|8FHE7$9HwG$ULH zjK2ZkfES3*>mfT_oMPZ8q5SM~!BqH4L=BkR&pm>%NSDS{%K^r)+&J+#U~x#9I2M8& zW>w@)VUSrDJD{lSrIZqnw*8Gf^_80pq6b0{3o?pqq2g;8v@%R3n+ASa6B%x!~rRz$%Yf;@)raD!H@$OH@)mSh`;7ONFCTJ?mthTy0165{byTjl?8)Y{u_nK zVo)l9Rghfa$6Uq>58*3>ZtLRvICs<=T?xl7Td1hhfp_Jh8^+(f0i5_J?5a;H)hdA4 z{m%j))^T$`O0eb}DTKp<`+ZR_u44S+pBk?3U zyVAC_@?2j$oS*vMomUxp67opifi0$J{pA|lMgk2zQ^9xJwd2tAxM+1&bD2-aDc>8P zR!U`Sj1AYe73sViAIB@3DBl`}Ls7Nkx{-q-r|_vT*G={kPFr*L?~&`4_`o0~!`r40 zSUI$MwKvpd$d1ZAhE%74hq?oC*gB*|3LMM4Jm(#C>Tim&O1!uCb(nyq^u7()UH&mL z9m=Sg`JW12ECa0AR1ZgDgCdVV=s&x1Uq$x)nW+f0ya#QO&m2{Y9gO@p@Q59d&2mof zoN315WgT)0e*z=0HU%r=li>kptXAQ2cDC;G_)@74dhn(dWlB(`JX)!O;vi3p^mR9M z$X@K_3#Xs6=JyvgCw@CL{L&dhkpvMo-w)$=v0L%B7M@sE$=HOqez$cBebeUfT9ikN zDhS!Le<5bO-zrL=1QEln$BWbuc6Xvs?J)w6t zDG3~)7uxYBw2UvC*y;VuUJ;>JmVnPtc1ia7Hzh{j;`f6Gy*4N+H58PA)o&h;Cp1m2 zHHBlpfAFF~b^a>^+0(N)W+AF{Ww1l>Wipvb2im#2bodlno!q(~7V^xWfys>4gH!Q% zn7$S*V>1TBVg{oV-|I2CKh2)ermOPOj zS#VgOGP>eMX?(rSaE|OxPu+8Z^DoZV&lGdVN!H*fuwn9Xgtm3veU&hwg9`VB-}dAh zdSdY$ju*Xyhdr!Ou8G0UY)06Q8CVTM6iZd^@Hh#U0Zrq2`MgGAcV< z338`4Jl@3W{v}doa+(>Ur-;W%K3kg$ukHJK3`0%2)9-L;*`3Cb6I46)atX$pOJ&i% z61J_^czzq%lI`rDSTM6Ed>dk&v64 z+h|SCPsG|fb9s;e?fVWP<*%2q@o%y{);DR)sfCC5*8{cn+~ggogID5h^m$F(^Y`yE z(>I|gBpRi3%GbL|a{YWceh=`l-;=<$Rr6FIeL0}?yFJf6k?t3nBs|aSGfKa0&&Fw1 zZ-E;?c&;32dknfjdU6H-%RwGR^F714nexou1x3vbFG_{ks_Wo`4_n{y@iBu|U1;GU zIJ;P}vs%MFM$!>Of!0Syt>mOG>wJN~k}p2|lfV_cXf-{b2MtZlyBxb{HHB=d$g~sR zZ8?v9a|TS>+eKpGA(_8^WNLeA(JB+qEr#s$zOQc2JR1#VQKQW=j9?-NEDb1x1Wko) zk&uu7sA4X(Xt|h$Ld0P6Ja*80A|%$D@9qKjf)pP1UVCb0`$UfY)}<~yl&jQ_x;p@m zLFcDyaqmgl#IwnQ`uCbVwTfAbmWaZ`MdN24q)ZjriZ9B{W@oLp8ZL)j$F2Z+JOPdA z_psFLUSq`B$DKh`fc}^!!!rrZ__#Sx>XCMdh6jDhDXVjq;O7#nZl%ch?RukP_Souh zVu8M|;huFB!>ZoH>Y_4H2hfyy(K}b!%=S(kMD+RR%}n!DSAO4a6KqY*&%&RDsaL8kdTRJs zVNzZ%gXT&Zbl54(yZswy5MsDq%NgkwPB?mC z9dE=APmb8aQR!iQ68^k$bWxGA8uoc#yW3ydmPtRB(F#^bh(d&hMI4>cPZ+4r(^lE) zHgC-frQJ6K!Tf%D5d9VZm}{gk8}W?+)_Cy}OrbW)kZbKIcvKkuOWpJqwHuU}e;jc(Is8Z9vxBI< z)~p2cdWvY309LZ5M)|H_5d5cNoK^Bxh4i#^rZoc#led~LqcX#LHQQ=hD?>M?)M(Ic zbO|bKZ~s_{h$4S=p+>tM*MG039HbgmMt}m?!HH^FTKn{=VXh5tV@LaHg0*XO6?V9XlRnh333-}Yrs9#!@4?-uG|S=|5%tSr zwOZLrYm>dGa*%3FaS{_&HW?Qi{glsBUbYKoR^(gd2SMq`XkUsaoRepOUpjGh1Gjkl z5N5@{ZZ5$8v$V%jm4-=GHti%!ON|_zL+IB4PO0+G%%5PlajOD?!Mr*sW2<;bX)Tm! zZ=qu-Z}bN3Xpp9`eumSlv{cBYKxj8ZTl24TYWQIwSdve*{KxOIry;k9=>q+p0LaL@ zK1dyaPDTSxlqI<~z3LtZL>yHDXg*_f zR4PpUq^Am~L!))pgwwtGS+t7dCo1hzHYUe3IVnFqt*fI0;N;>F71dK$Ra8ARm|tyr z3gnZL@#dG}om0qQE~ZX|7&3UiQ%jUfNc4nQ5*vEsUpS)cH4!xk%6;mlyXTA37L`Ryx8lPwb%PE2s8OdWp0Hg>9blIwtK+xUO%AZj^uN5tiHVDbV!0pE(lT~nOSXf$T z*`A+7bIG_!^8lE4v{=)yBx*hLLz_KoH~;yDbv?i)QA3IDOI83jdL_k6uk*vr*B>Bf z?>r``YX;xONP+juG2R@k;$}6N3u%C!ohOGh7er8<#eS3bQl|k$9+FDx5(Mur7iRKi z1AGpWS5!b^oAB3Z3h5~|X(ja&Jx2BVZGdaim}&*K6JdN7gS$_s{*#CJUM3OG7dkfW zv^IJE{T z6z0!e&Pu#(%7rLVw$JE(TWXwVvB+JyA!an0U%J9R*o=JV*m^p?v_DS0gT23M{;aO9 z4zQWgw5h;vwB}lo-cWt-s`|g-Nk;$sJZZ%kaY{3?0p~Jxtj9;S;+1c3{i5^oN-z`B=}MXXEI4Y?8z~>HFDG zT*%G$X)W+t{TA}VL;!x;j=qIq;&3~Df#b(YfQ_Rrx$PRBb&HX^Ej-fQ2RnYdhUqE& z8F!60jM;=``jgpx;gHBcGxZGC_t81v$STvIX|v&4#2^1!%hr%m1i-)-z<=R3SPrz= z%p1n+wj3AGLw!ybgBdOlQ*8r2^p(hXX2tB4(t)zpT37t$X#5eaf zBYOsnom|R>f>vpMqRBU#)Mh7$M~jsG8lhTVf4x@|afS96Nv$>`1YKM&m*_sXRb}-0 zFr5YI?lTm`%i=4QJ^r1BZm2N9CzAE?G4&#ha50(=V_Ltwy!>!zkMei7ax<1%$xd|My-K=%sYbHB z0g<=y)R@!E%Bl4J!@NGSp9YRyeio%9dLAZn3mV|N#Bb7mdwxI=++=3t7`o#Ha<3bi z&^p{Gut1_PN31I*L>=75=i8>z`85V?=PJZYt`X4Wif~Y42=k z7?LmCo=C@!OYg7(VZa|I&(%30i#d{tnLm$w8(IJAf-u3W%*W`p?rBD_g09RH?HMSj z9lpB#5PXh7u(ZMugS_`kvom7am{%eK>|P22rN7H1r`LO$aw)qu_`<_`T1I|?mnrB1 zsOex;{pkVx6%}z@tbdAIeb+|TQ}%;^hY3@^`isLZFa_B^`~_kD+5bzvr~e81B{AJr z9u*bHS~k>7-GpI)ot<+|hW;~Pl^}i0dEfej6JD~>g$KeUhxRTr=1J6s6HMuwMm$=q z*=GR=5rg^<^EiaQH6`Q-$#@eb22z3+0anmb`e$B+2)PROx}8(%a~A?AikupBoz-QT zm4Du4m_*dOoT19dNU=Xt_zS!M6`wxM@)SVIsaNp`{p-~7E&2u?q@)Sbyg{&Z>8Sy4 zyNpBo?$f~rsBiko=FfLQ6<5PaRmOsv9PGpYnK-SEDe$SFM(RRZfW{FPpNC*rcuekWS<`Wzxi1C_3Wf25l< zayi^+unmVq5%Tm*wdyH8voOge2yYv-jTo==FvxwR=YipCZsS!*+&l`yz7uHUWMiy+ zOo7D*u6TD)o|Z{8e)1;IW6di(N!sMW4fQ91RNVw{MhAZD-^S_uDz_$nFz&QI_iK#q$FM zrOp@iGrsF{Rj~N%4JY*o^V>fnFd83Zg0>NV)RR^`o%Yw4yR~%)K>lyAe+=9$XoaZ8 z129-i=-{m0HyJFyqRF=Da)tziK@JgtDIw%PlyIKZJs!*TAhrsxdwN3yEE5CB{GYI} z#$g=>iGbJqkZA#|@SUi%P)=-z)h;@k9UIFOkH$Y{cQQ4RG93xdzi;U;Y?-aW=kdO3 z1@HH<#uYG{0Oj;TS&q3s=aybiY3z>7&L()4*8!!o?orL`w2#|0K4SQ;t>KPsn`J(B zeVfykX-xDiXZJ-l!1+z<;8;oT+2fCEVtVK5dTT|Lw%M?qf0MesN4AEtYU*zzN*)Gz zjgh+y4wAY9s4mtmJwexC{|VXf6h?#iMXrJm00e^@8mXWM@T|9~S&sgL!|w1@YRM`g z_(@z@ha=krF|eZRkUT5Aa2vwU7)kL%G5rQM03jdvRSud2a^QotqdQ0)ong;E1KyUS z3V~mZ3J$ga+V(!xXs*foB);_JZPzBu=7Yve6LIhkO7D2*6y!WX@xw2LOJRwrKP$BU z7j`=gOWnqu!Qu6`-QiyVevH?C<8b1Q)%c0fPH;=p>n$&v{D5e?{fMe()sYR{ePgQ^ zhGDpx|6U1Js>$C37ztZ3}r059AlL5Qdh9 z&wBCUx7{h8)Q`mTqDaf|*_NqC_&*qXtGLLSHhi;zK?ZjQr*UU+cXxLk26uON8QcbU zAKcvscXtMN_eQqgZ}-0kd$je-Q97wgI;l!3&-L7Q7sw+QUOpL9ph}M0@y%m-E10cJ zQNpT=pCIv$ooJg&H{A&|S8l^DE4ltCW2Ffj=Dz5AYoMp5g}mcg-ki-93-z)S4f)sI z8aK1HD7?XOvVK~&38`37=Q}Y~h%Fl`;e+T7+tV0k#r}t-|NpWGktD(uPGAyj+*%&} zAW+?Q{+cx0Ffq|1vt_oL&x!-)Ha_dzmwu?5*b{tCAu(=BMHZ1zkVfSNtwaz~2O0mU zsdL*|+tlv>a~y66kk|!~QScn!sDt3m+1%j)tn=gEPD6CZ5ciqlYyv|eU zylK-h7JOS)=iigCtk)Vx+F7(&$`MGYyk4R-ramNO%{U3~4zE$8UYlzI{5)RzG}n(t ztH{gCFhR2SV^~!kugiwt$Gd&UAc%z!jrPi_@WX35>uQf?VCL=gJs?T09_I*ikReJ~ z-(yl4oLxa4R%}AFa6PUH&m;}K(R8V)i&RtDCi6$rLyp_z`&#SF`IREH&^W$aJQi)% zXZe5WsB~b(6l_FpcPY>$(_mSh8xRpcRX&=ttD%FIpZ4!BAd0rSwyk_#i!X5)$cz!E zhZ)mynLD@H;z`*hbt}Q5Nv&Di^B!j+(#?Yy!;}XM^8$`(-XxBU$&cmt4w6#BUFsakmMuG4|s64{b|MYWvZu_}%Io5i?L%+-6YT?ads@ z9FAv%m@auDL5xJmxbR3dxdOEOIHrWWxLYmT0A~4dN>y2l=U*;u?2v3vby}8PsjUsN{Q%NZi^7^+EF63 z3cK~LrRyb#xNbDbK3uDvjhOx=i^nU9N#^Z_ab)As(dh(0hrN%2Qf3FH;u zo=+$6mh+Dkz4e=WJdrwxAKQ0Zf1WFiZVs?EbRY4Yzm(8^`}WNb{q($Hf*b`}1xLhx zRAB|*g*D%3EYK1Vb*|^vL(IHEt(?RI8-WK4_vUrv?{%jzJy>6f-GqBxE}3pE1N#7* zL3C5Ou}IS^%v~7{I{6*lFt)r`hA3&uXZ#}>0($4)5Q4wJ80cVGvhZN@@N*_ zBYua47H!!=qgv{&4Ef#Ur(vd2a9-h$B!bsk?S-o4h3rgG{K^Ih%m{Ta!;anR)ZH={ zTx#UsGKi@Obj!Jq%&wIrogRZmpZo}_S2b9nU*m*Mr88vdo^jDsC>AKP^_7a`E2tlMwEs>P zfMH)q^jEu1VcoYHCtNVI;6(=$VxOyXvQk?jrqr-^0`$5&IO zr8%*AY#D0QlHs8v-11X#ydIAdeN7`E$pX?=j5uViE$_)2hKg8-M7DQ*dGdKUr+~VW zw_7fSXO3Uq&s#$jHFA+t7!y& zyP>VSB-`9!Cf}0bH5fCC%hz;gV&}9y(0{&3uVUlZct&LmL#FxxW#qHW#u;#4w-T-h zKNGeU6LyaL^>R-EDQh3%{OJbE@Bpp;M@3Ft8!0f_Jcejtkztx{P?CKg8qzvmzHFMMi3WRrIVR+F{<+)DuAXXEFyVA^ z=u6Jks+}t>8AtSR$|+M^QEoRsLk;a}3(!M;T{3rHE@3nEsm2bSeb6q1vBp8V^eSyV zJKV8!9_GTeSv}yj*F7lk5F&QHKdB}^-+GNKd+6hxZ+><$mN)Dn(>tZCTsYOdP*F^$ z-H1* z#ze=}B^7n-_IrE}dY8(Cgd1zO0Rh7EO1imW^BwqYS6M?tZmbud;oXWBUKk#y#-_@- z-^azzrqms?SAaN3%)sVb2Yjmyi|Ex*N$qYdbnrNGAuLnKUu=aGfWUTW9#S+iEW@Z`9N#2u9t_K#DhCO0gA03Ymds8i6dhbllFXL*o8`8hr_zF@yuzp?bC^=Ssb5S7C@=Z|4vUPQss|I z!sD`gGv>J~zlX)WO=9Zt&b^brsQU77yM=oK{M^hun#Nyg zEK~82hxYT$*(a266r0ge+Mo@EH7Xo+ygcxKTj`s@zzIjZ`TQJA>W7)gaJ9MrI497p zQ)9rsGILtyv6gYuMhJK#RzU;z?(GS|9ZGo}55cHT15DOv1p{K{V%f$IM5XidjT+^;xEgB*2@*Nq5kZBW0(>Je-QbOdd$WNfOr!nf~ zWU;(%ZaWg31Lae(k)s0@)80nTJ9Yb{duP&CN#YcA{dj*quqDgK+lkq7$?7H-I@tay z^A@15sAIpI-}avPBV>Au5;ZS9+b*2IR4ZUz?Il%4-UCbkg=#DaSv^X`(;83g~HaAVyT^fSI6=r7e3Z|m?6=Zq-m^elEm-E&ojP~_JWw} zUhWoZ4LVlSdD}vb;=^@h}|9>iR%E{XD5S3~crsrA>1o}~?KhgVXP zWoW(hbh&E&{aad`mG=Lzs>t?(b@^cuzcIMQ}KXmz;8=nFDOZ6&rnDi>h`@?1)>+q>qVaHHcfqc z>2S`aGuD)4+#Oc3-Pt7Xs#g{k!w2S`)>0PZT4sy?=(lLM;V8YSIHD()=Z`-7Gp{Bt zKLcyg`YbLg)p5D}huQ~!*GoI?Ss(hHKqA+D1 zpDP8!z)IfzeH311^DWF$t;I>FP?=;K2|UQ{{1)!cCAX15xhvvt(XHYI8_x~sF+PdT zd-`YL=9P@Wpx(||y&Tv>%62aQvK+5hF3 z92N^~3pwvWAp%PL8-|cKoH*u_iqer-03RUhbH6WbFGm!0oi3rv4Uod#>xSF(Ec?+A z4(CDp*BWh5h#&jBO{rRd8L6}QMlOUDk{!NT?^sEN0ux;iGmjmoo#GBI0kTZV;xBYX zi!3lk3(f0pOkQ9ga09uIx?nyK7(9o?2T2}zqw)ocBa15nTZCxt*0fyZQ-Q#u&OsdD z&gi1$LGu>_t^MX&>=zCNw2Vmv7HOOm7B!H#l>&go<(w}LjNVBFXb@a0g~)5Pf6GJl(Z!HeiXkb}BvZ%KFkz2_#A9T7Zrwd)>` zUs|0;0PmYD_fGbHZz{0)aNV}JiAy{Re$iF`#yNVuZ9HR$!5i_97FPbRG|Ttz3y^>1 zS>9S4cE4-#gNIzs-cHa2_^r6NSBc>lxUv6A88@BbAwggr`J@C@qPw~A25Byf}9 zvZzAk{Xrz?_jWLz1{SGrr_Krlmwd>zwY7|l3~;)#`d>;)N;7lw&$XXUlX%bm&o_3r zH+#cu@|<=X&*5qRYfXs|Y|97eDG__s_Ur+kkhXw}ylL1X~?f5kE=J7gG}A zK0%Z|&-h>dI>}doY5`Ngp<&aHDYRKtkwL7a_sTM|#djpTM8VmLr>2IhmY8*(mc6X@ znrbUI#N2k0X<1hOr1C5;8E=^D+N`>~w)iGrc zOwbYN@u8N;ip%Qvzmb7=o5AwZPs_;em@%S*&7>A6S09+uSo|_x)4a=Mw7&zIZS1mJ ztKd8+{~m8p;6mu*>4v-+`PSNF?3}Z68{MF~pZ>B2Qjx=1ibb=oeD3ZZoYgZVf-^Y;9lG z%wLXZX78S~n~g>e-@Zyx44X$KP*;$~1dtScvma7VtMz@}hzQo~Y1>7wzT$55yr*1^ zFH9S#*Kv(c3E#F-dJJ1;M|dIJ+}F$_8QQi!PiDgK2sd;LP8{yW=WAP5iV*mmH-0zV zpW!n2wLydLs=z{j04I*6o0A4phmL%{z=cpVPq-%4M}OI8L}Au7A?p-FPUT+FP^UQ zmmkVMD6ooJX3!i1(nq`l>j`TOv+XbM|HA?VOF9Dp5bwwZ!z7RnctN)M4_%O>VLP;3 z^1aRRIq-Wz@O{kC>&<%DQIPNG{li9<0cSc2IrestNH-V}27$%!cFsay0U>oHxbb(1 zmWQx#g}`OpWSN%|h<#S@TGA1A=wica?vw)@D$)CIotLQmAzZlNl;sNuy#9{7`94>` zI3{2O2d*EujJA&u@-+_=cto2pDb;j6Hj|0jf|RE!9n6h77=#%x4|g8M5+I~!|Pa38Cg5i#yk7+1M%3#0WZ*2o090|%Rk?E$l91*OO-WYnFj*5`+PMW@Ui9u zSD`4d1|R`;aZvdoYZS}>^$8-_$<`tswhBVgz|i)zQU+ZU9lJQ#1bC$w%gXX}3sQ3A z6-)DWV|#Q#03hM^giC{M0kMU0l9YK#KsiV_t|cQ~0A|QC)1aOlLkZQjC~%o58D`M) zUxItdl|GrSH0O9@wb_kOPa*(*B$xyy1f|U^@4h1OR~XmV0!;ucnBzT_4Gwh&KvrXf z%;xn3tYgxXObIgG(@%j4hJ~7hZ=?t!p}Pgnj-@4dEtnm z0L#eqWB^pb@MBz$&EkWoT%r3fd`v<_fMYf|``~3LqhN)=>#st+mS39NCVrCyTtghY z)IN-79-8M*Mx9 zEDm{T1^1#MnGqh_lKIrtu$@|YXa$#C9^&Z%JZGa@TpJ1P*ftgYN70W`i4|kN&w~3e4>6A0J@gWmHt&Ng+t|>%tt%PfRJ7&9L2o zSb^OfWHH0YRf3j=iulU6Kcrtz_fZ5<**8oamL4eX^vz%KZ1j&8_&EI}$AmvEW5?eS zmuyaEw6d_FcjV{7KTfx%73tS67tL!OXSD8SIZN2XkD&rkn6^;Ltl(o6dR*MfCc*1J z9@46;HtEl92U(gToce2qQVr0H)y&g$;I+N^Yi_n{*UYC1UHK_jtBBP6L1P;7&R2g@ z#l9wq2EB6NnX=4k+7D&@%}!csh90f*`KpWw8m~GS*W-V`|M>l5FQIc99~G*#_PsN= z+TJp{yU6@W^QqhYgE1fm{E+x#?4^Be?0#j*k^P3KQDr&LFX-o7{6)p*-krR2VuSl2 zqvymBKq41uxWlqpy-X6k*nscu-JTC6l}c{@}D(ym%I&D1Z-{feDEoj`{Glr>hwPv;F9p>(!ZiIkD4~FHs*&F2EDG#og}2} z@Aho1dxNbtf)TNi*)y8v=S#R8TgZ*UF#&5>2CsVCoiFP#;NRX>Cv!erZvM*E%%*mP z;mY%K*3*dP0*Wa7Piro-oh-*=?Sf%&FESTu*TnJ&mHFVbqjb<+q=3 zpf;E-F_}#vfG$)MHpY|sNHtJU*|4lAg>;uxT*{;7=Q}m5XG%AEQZlQ{8KdR;Q~Bx# zC99pj9BIhD#Ps%7v1PzZPy#kWvp4%>S62k86ZiAM_rebsaiN{}TteO-4?aSF;?o~>fZsJJXq9g%@Wfpv~ls=+`YaS(!3u5H~d z=HDiVEP@pLEXB1cUQ=pGtWrT>2xd>D%e)cp<3>G+FxyqP(zf*jz!_R4o;1POp_CHB znFC#95W21EVN?FqCfirBm0Wp&^tuE(Zp_;?2KDwo$TlG%A!LRo|0fcr9A%cLB!;XHwVnj$&QB8HjB4K5%FjNT^}1bv~3?>tUQkX0J0;aYTPeWiH&+YRnD1q9>6_I-~}_m5AF?Y8b$VYh@~ zpG}-e1|Su3`<+J1Ie>`NToM&v<4=ZSSAu_IJfa{dlByKH$2Ei&p1FZlCL}qzRJgtPd@+x28Z*h3~@M(|DDheWf^6WXWLq9Tu^6$)qC& zc`Hf!>Q##KxV^Oj7{@3_5h8b8JL8Hk$S=|QR$ew<-BJP15m_3iHggA-tLC;z)jWe3 zm_C~BU~0reGakujxe7-Y0fS%Ddp9zZ$*HL@JNu(a2g#xl)zz18FLz&o#C8|+KO3^l z#H##&c>Ybbvexzh$ykE&jk}gEEWo!$v*k;+3{)p$8C__s%@XMjvXOXC)I(?hT36GU|)Pbh))oPr4%kzxC~TTu2eP7wc8>=+rK{ z5i;*tu)cXStBNJh!)qs~A878x^`Ju!{;t!vdu3d3cB9ie6{meK#m1>%vEXazFKa4- zgD&zGj_Am;c+eR$>F*EkM8FUyDjgrZthr*X+r`|V{g^){r zv8+AlbnDXoP-A;<7HSzN_@OYBf~A#hYW>aAx(xsBvAM9j! zzCTt|#Y#=T>h`SjyfeO&^L69YG&SY#@Y%EE5g#22Cr;V7`dL}Jkhj=}6qqU!)pxZ&zqztpUdFgps*9$m;M+et4%3K44A2i1$SaTs@MeMLztcOc8X?K+>1fJ1?_@@(o zV3GSB%#ywYX4?LmCwrv$zoCb{5Y(SP_x>7)iiMzx%)yK0m0j-PNF{E1f4~UI4N{1V zOtq1%RQyG8vXEY=ii3=*^t;%x5`m+U;Z!n#mLx|PxfM6rr2DaPWM1@4PlG%> zGL1|+|JiW$$5CnivSTkl9#v!{_|97^?{T;@DOpb}BHjD5@8bL`(EI7KIG`yFokIDh zd=)SiPC$AfnWe+=!-&oq1LafC5@Do%&s|+xZ7b884ai}zC+XUp8ge&JY~@g1b%a63 z#&9Bo8eI@eC3STY%lBNgaJ3S>KW&&IxNjFlZgv056EoVKDVvG=;*@t{ezRDOwL4Ik z{2v=oz8(4G&_=kzF-iId>?&pxH;Z_baLm{ZlKxaFIYF|{%|8-OvqoHyw=||1b zkV4~DyF=>R3p=NOD-cnyZn&hDui|~nmCi{b`KZ0%#KEt?f(>^G_~fTI{zRCFuQyq> z71?cgz=EP-CWupw1r8Chka$EOE-}y}O%X#xr^)Kz=txs1Pf>TB+25v$L=l>^{Ah)t zW8aFP*&_`*4gIh?t?9V|vi?^4=BPkR#U~LnoPd`%R~$(8LIX4bLxWCulvl+Xq#9Fp z?QTTS;43Z`Qil7x`uQg|keq@7y7yV#n_@IpuT=)ZS_CXWS?PYEX{6d%rbQZOdFEFv zIykuK&EA$wLgl)i+JlMJ*53~sG7}PSO+3_40R8{=rn+VuF27y!)%XvA?kc^C>)}tX z?NiFk@v|p2s}z81Vslr6Xo_ zTDEx7X%2|$`v4zCOo&#WtG1u246s|=*V94%&Bd?9FsW-e_JWY{-+bA#=d73KU;@x} z&ojTX6lBgT?XkZ<#Kv+WLtNJ>Y0=hRPtx=VG^k53tqQIgun7CHKSF!R_-4xD=?@q_2OxiDs5Aw%7mBizyoFN(zrLJRik2lRR2lVLieCLbkmXxHf=OapXwKI9U%iqa6;Q1U3%7&f8zslWyf* z@l9=NfZw|5y5&+e(kLA;AqC`<%$IfK9uMi6sy5LzzswG@bxuj0md({?8pLuS?B;&5 zLTl-yZ~4A9^Vlv3$<1Y!JeKg-oLCa4g;6kvn7q-vgM5las*8rFx3SRtTc$BT>7UKD z-x}U^5A+qMXeK;#Yx3I)9*&Vdl5*+Y(KfS-MYlKRQuPhXcWJ-VyrDXRq)qA6@|>;l z9}@rQ6HE#qj8dbJAZKuh#rsKFf z>1k}tP(+Ga@WRagx>eARI*M(K|3ywMxt;4wmHFPn(vcHCK{{AfC3$~gAu`g1&)H~` z@no@0%k#Yl4AaeJ}MvE3yR>Lq&^x3=3Vf ziACBa1#Ghu=Q($oKS(n!KAI)-F&hE^$1Ht2bI%R^g)PVWeNr&-8UFK*f2>+Ny9Vss z1+!KQfKnv032`^XHN%Gr27&Ov`Y5C~->0siu(P=qnm%GBz%{dGQOTfkVq5l%>c8YM z7@@8rf2)Ppa^|C^d%N0x+c{sP-P zoO`D{o9adaw1A8EM}j?SDG`APl3lLuNmP!C@IvKvGdn~JJePitSuCdDhomES+Z}&Q zYR){W4Y<#Vs_o`b)5%?R3$lO-pSn~Z?VwEFRL?2J#}(}L4s$4VEZURT#j+{o;-#`F z?6NH@HT6<;9eLFRXp#n@jUi>*)k$l7&QK;@pTB;$)!p*gzt*`7M?K9#o7F5=MFQO> z$rNd#@Vr8~4-Bvv-V*bR%H#Y|QuHJCT>@}B(o{!7kF3}XtuNyN)5D@a+3=fS@(L#y zCR1{#SlD()unQ_D6s9rIMAp0-H(4AB^ATzcd$#ILWz#4R73;B_Rfq<+y68&nuWX8k zpjQ1Y-#cwZb%?lsHojSzzccKad*i)aDvqN;u3U6{dW;TbQ3gfqT{DVWl)q!V+b9vX zOV6fhF7K*H*u9R)(@82P>{fhr7DzUokc9#|S-~{bL|59C?N(T{9XMG=P|PT$K%!z3 zZRPj4%zPEV0mT+3)R$QM5&uu2v{2_sfhgzdRo6ga*x}NY-MFAK3wu|%T(k4y!jCO5}Y4rbv zs^90(!GUUkl3H6EF6l(2Hez#PDs_*|^?^T)r^e5QD#osOf{HuZ!`%ve$mEkLLNAUg za$srzY@S^o%uE&0LE8e&kNo)*oajfpZZ8v$G*HacG51pn1CXA6W45Zxte9{W3-zct zjYxKXzv5VmgHC$IgJo%O^Ia{VZgApA@Y7cVTohd z6!>pcR4eM>u|vaBJ8qkE*=e7-+3NN({d|dNcKs+W<37Uxw(5=Q2gJKg%F=x69bc&| znUI?|Pp|TP8ao8whe1Yt9UTDW$xPLW3wL_geye@a`VbC@`!{d<;6}Ia(bPq%?Ya!( zKSmz4;g{IBLmmTPEDr~7wUL#r*;JfXt5kq#r)QEK8IE*1b^v~!+26m@VuT9qThZ`L zYIP3wYk7wzPW0b6FYfOjxrKPDZrEPA^0`tc*O$5(>5delMwtUOECb!ng?QcavOPGg z7Xj}keMjb;mpxZA`Ca7Nw1(QMfrhzMo;UJ754~1Odhzv{!$?r_oDUpL-|GBETC4gO z#sT!1uGFZzzUSqMMPH+4k0M>f~N_^fWa2m9g}_bpJq&pX*<&-sld^ z0MgN$vyksmnl*vqZJJtS0#_+?Cx}oIwfP zTwu6s)&3)sJ$?$Kf}idez&-4YC7`0=d|4ugbY@hDIY1-3>*{YQW=|KnbSf@!@-xr& zWF_$jzZ$2Ywt!HUtKc`xG;<3>?xp^^&4!ThqT?nu%c(+5MOFH&HFObrw$`x6s%m{M zA5NOe;%E%u;Ls2S56|mT)$eB8b#xK28ZxJ;7&8oE432cG(I~C6*U;gPXOiWO5}<6I z-|(M#)<5OAOMk%2$=Y&>H9XpDL)et0m1q4 zI8P;d9kQo9IyT%?V0&M@XKSQ~-F33Dt^LxOhs%GcCzb9;k-v!Wd{W_h6fqOFpngtk zXN>G!cFP{-PtyL742>#6M2b;4o%@L~^q#dd$x=Jtt_IMOmM)g>I1@^2{PY}hFN8<$ z2m8m@jIOj;I6(GlRadr7QXL(Y9O~bx{G{bg!?_z3`f+=iotCpbI>emz>zzoH=_Oap z9zC)s6hxxgr7BSqg&Y^gg5cr|g)=`@4Sgaumol+Jtc<1N>?*6h+34Z-skm=UzjE4t zoX>==Zpk!13d(%Em)18ZJkQ&6bbVA#4_VuH!6;TT7Hi_uH68Xa;qi!|^2hi!aj<#_ z#ib^-Twp?iBd%g8Q1_Y_w?9YK8&+94gt8jt-aKxmR#h?O+FM*3{Hc~$Gk*IS%kj>3 zt?ruBIg9!_Uu{(`TWLY_L;XigRP!*k@@Fd;xchlMJq?BF!yv;LE&a)kFWcBA3@F$G z@8W*msvC?5;CcBaC!-nhdsREDmHcX>R^DHrl93{F(wGL%%wU@_D$|-;bBEb&;1s%} zC+og6Y59hXO73dSe(=~GAfiJ52W05e-JJb=gYLMS7+1*~8OrmZ;{w&I&O9muhcPtC z;DzpWH#>Z5&?6(I6*XFzV&F3N+HaloXuo>2Vjh;G(l%wYJNKzP*i^92daP+(qj2dm zZiG$k_L$8+;{V*#-xEHW+e?Xbx(ETO{XsvGkVWaurkL99GJFz( zAb1L|qy!Kf`-G6r^-ah%RXm1ldVOX6Y@#iG)aK2vZq z+oRAmqY^dzHfB`m7v|hf|I~~);nx`t)OQ(9{lYA@VeIB`wc8fnqm+5V|9igP-qw(` z|E&L(J(-=YLM+uX6{>*iX#6_TGb~x4K&3xmXXXBlGw(d>3^C`&Dvd76?N(kgVB*p4 zzHF!ZEUc?J`m&g=9Ltplud`oO`L=iZ48D2-C+7eZ_>+;pWFL5i)C>{8A<;Rc$%vHc zJ@QACO_JQpYPRF44>+mkfDXXm*z@YuA9nk%6DK=JuRJ=$mG5S?4!E zq{H3y`TRHj38s<=z>8&dvSrK4t9ahHXFTp0{FJlGWoEV>VW7G2az&K+aE!xeBO<8} zFv=9#!dDwz5w8310KNhoCV+;w@H!V6->XW+cR#!ttsk|SWJeChy4+uX_PqpJRm}Bk z2l&T@$zI|j;ga~GB6b*5Tj~&;b9Z>&H*#pc^|uuSO*7KDWf2#RLj|mjP1gnbpx}CQ z2bLOmEqQL)Ec@C&42w~Y;^N99Q!jcmQ*qwq z=5{PJ?MGLSp~Qk)3U;hLq8;_LGW82aX)u#k3?>)%h`p;iAi2!!4$wKKS&^VEoAc03 z-Gc`pj`d;U0O(J^c1l#)?|&z;J!mmjW%-k^`SU|cW15XwW9Gh!xOK{LP9sLs5ygcM z_MC8eQiD(kRPs87FyQ@XW7+E_l5PF)efeElJnHLgiY-`e>IpE69pKNq_Y>dFWxKXx zc8e<4mVnBh$hnU{fKq)TTr~i+5FE|5N*BSu9vT?Gc<|xI`c;@Wz006~bJnd^`DW$a6!1sr&y4RQ;z|&r7j=AD$#_hw>&g!!7 zDjM38;#Mwuu~O18M199`{#OX3=aAa)YULEj>IPtR=gf(md4R+=Q?^!L=D6>fQ_9L- zZ9dO;@frX`@y}joHgn1hhN_vP=injaYV2+~?Ky2gOX-5kR|9TapTc~xd;TIcakzil zj`zyI&9$kmT<`Haxy&q%h1O}^@t0Y`M&n!FmZlM-nFPQg@`D7_`G#_ zu_lSUGP>b?MKR~$eBzI*M@W42r3CPdbi z!Lff}ehQ0=ZrE*CLtl`a8YndA-St}Y0Raa4mXn@42l1trLT~}uOnTfl8Z|P0b+LRD z?B-MFy=|r)HqSw{99CoKL_}Manl*Un|3NT@J$?X%yMKe??}^bTIjEjrE@U*s<}5c* z`(=?6qZ46>qT@-!XhY4Ms4rA-p1&IpbPr|{9}OfxjSjLCbB#;VG2Y8ocqozye?b!_ zL&mEYhL{zhR&q#g!ySROgBOBgXq_pD7k5wv&>S! zBS*}(gh>;A9o^<(03XT-ED@<4a#-K=^QMH)$Zt&I#|HJ^u)&siF^^6julMCm zO|EKcCZe2iTtG~k)-mZP*nm#nXgoZQf_aNhvPo8$`&L$pfXh3JXU7vBe;Ket!@h&TX$ObE23-%7C?U z+mxR^98r<}*IrYIdu@veVPGFL#766ksdUYj6a>$>a6QrsVGOUx{b3-|@ySUHA+Ook z8+6O~I2rS$FL2HRd~tVD^&b-;Ye^P8Q&JfgwNl6wVPeku>r)}6s9LE2nIZ^`Y;^At z3yLBZ78VCLFAL?WIXO9O`j=^nw{WB;ZddgHer!Bv<#s$GCNY6P?-%xScQ*7;u-_w- zpwI!T*jJ;zFk5Lw?tyS@gen~#y+!HBT{>Nw_4LI&VNDhZv*oSo5QpUoA^8a^l)>bvZWrd;6Yg8kXRbK5Xt(SNYB z)odwN}SKvfuWkem*yQ4{?+bZzI}*(x4Si$3>B%7VVZuQguDkyLO<6vKC8dI`$t{& z%wRpo_43Jo2)=o6mRD814~+j0Fngv|NA3Z$Vr=rNm=D%WiuGFb871uO?EXHZf}LXW z@{_Htt;7cOU|CQQi=mlsH;PGM+6)YlDJv_d zr>6^cI{c668ndvrwzjfbTUk+y1+y5xpJ3+gS-TA3=w|z$;e#yt|INAiGyVVO;du4I2wOu#LpqMgw{P7tNTBCF7Ydj# z9aU$|*Z=T07G`E;a`Yz4`NRM4w`*B+V&dH7WVJSLR{hApf0<>~bnm&~zbO5GRNIH) z^ScmC7;#Wx;oig9GF|xpXQTA=Q5PGSF#CcrOZ5^u=I=gqu5}{HRMtsy+h#`3!0-Q6 zNgTd*jRIoze_AnI9K4vKjDBOlwU%||J{1rg5};18qnk8 zP$|J=jta~&b~2-oZ?S+Qyx3FU+1;LQzaT7J(Qq=~3bs)uRMUqWLpID0dM&RVj?bJm z>s3Z=;P_79@`E?+yLf(CMs-1MGo5dWVSY`52ppq21{JJ93$aE57j6NpdWbVYAIJNT zrnl3Djg;=p_6(PIOOTuJk8VCiVbULtjyGvpOgcI`061Xcl-xX<{5&-D3oR`z%gYzT z{u07%59*Hu9lL~#j9n@!P(k;+WJNnuKWKH7gSX z4&r25abe}|-nr!MrjD40-=@i4>oquZ&n_NH4Rp#D8{ME}vdM1IYNw0WsCe-_6ZWsJ zgxR*!UEPH$G(q1Tbc0l0KhQt;-zM}=D&HV|FXlV`NXJm6WZek+L&!>!hDC+_o!YnW zTHgyMhA>DQL(}}|Y_xyfpX-;!t#i``{iEF0lKol$%46&O*g8j~SXi9jS45DX2b*L8 zz&9j#7WsGY1|1!}*>1Cg%iC zeHNmI^#mK{)zrBlvWpnXjQ3#UwK-{h3J$0vO#rAJdtO+kd=hH&hFcjFRcIx<(Dyu; zVW5Y{DpNsv1z8VID6_nh?>`P^*9ZKc-P3wW{s}&@NyDMRf#XO-VEL%hw2TZLH8q!` zsqDc)v5XSQ7(9xEteHj|jHQb>`dX)`?Za}K6FhlL^o^3n3;GQ|S^rp3X_i+gFj1zp z!xL1YnLn2(3K4=LRQewWmUR2d6!sn21)D3?NEZ?_gp+Br?Y{drk**JcldZ6&8g)Yx zL{ncj0$}IXyY(E`&&f-Y=^(%nfr%WFFH#OwFq9gXUfm%ZKmkDI_e>!Y$FRBnRaKKK zDrFrIpb$!pCI*OwUWqAcY1~ai<%g-!l+O0K2HRo4r}}AkbW;|2`&xW@Q#x>X4uUxEyywgh+mK*sfKmS4KreU2gXoxtnHDU;R*&bewg!A*x}v`%_Tr)Qz(yj>ir$Ik>)?K`kcAE0-Ml|oE=!u7@q*Ur0@B-q$AH= zSc(w5PG?pPt{jlzf!dITdg(h#yj&A7@`29@-2aA8rtzxWEBC6{qJuet)dWR4Z zaP4mQak$oT)2r-z8v{o=Ix;O`pGzx`Ee+F`e!sU|Ya)!IK(kAPf(pF*x08pTEjO(0 z#WlCl5A0v-vCCBwIm>CCbr}c+_x_yOdjsOLhUc@rzdddkm*h4Z&mPza=i3KwcKd&E zAv9Oc*IF>T+%+OVj93v?clt6XO!>)j-ZD8R;Awn$%lO>I(g_U9HVEx<&t|9`#$s6gHUQM&u z(|)#uW{u%B-|E()erkmUH!+j{fq#Y`m5OoMhy zr<+5{E?0f;YHBa#?@GU?z)kEy5$>F&xyqn~ZIUjaw+9p{{% zH|(;Xna`ST;A>lX-=tz9UZs!-^WeFmtxL(s4SaUUM&e4F60yFSH1tKoU(Ujpx3T&0m7)wP{Bc`1lRU(Miy*4t{Nf^xfLo=Vl@{#3 zys&T&Hcutwbpr$Pw_xv&$p;YX5&p@)f#yG)Jf5vhYq3j{2W#%Gi%%ahDi>dr!XLj3 z&pZ@<5}4M=KpeL^`+&meB(nupy>|BJz=4LV(u?jb)3L{3s8i)$d$ZTBJ;}Ga9|xfU z54)Xl4Uby{?aw=Fmlc4pnzN<*@ekF}l3;ul>jR@d0f6_l>L4x4ap!%kL_t4@T90?M zw$v^r7!K8Z00ML{#rz?t4aDF%vru;8jdZHmTSHV_DUAir05<5_Dan}=V@9MVVoqn% z67IL>J2PEt=V14;^pltRa8C49;t1INCRF_X!4Hh%F1g7BWzqnIa^=CsyO41(*?27L zF_2MTTuMg^VYO=^xPG~~>B$(Q8@RLB&Wb0k!QU_EPq3ew$l?#6>@QzhgSEx1)S?fm zBrbmQnvN_)26hlB{9mnI^;c9~xIQpQiG(5`AYGEu-5>(eF*HgeF(5H?NQjgu(kVy{ zFo=M3NJC_q)$N^St?pdrqh)U@jC!ca@|f=%%`G zRSktgwNDT3hpz3<5$4dSgPghBVNnrtg7 zhR6#bZO4VmL1~nNx=9<)?s)EMm7#LDNxk3fefm=c!MLZQq9PEhf?(dZ+yG<|hs`(j z|M@dGG$eabB*%phwGnC(vDvFlyEjoLiQ7chaU>x74^PhuFerv8Av_&+y^coM%zmt7_z*V8?mkE##PB8CPKmF&;HD_)1H&*~9nZSfZ zDfax9IyBGt@XTKQ0wDRcN-pc2``C>;QzL!`P75#GV>ABApgMcE zSi?xA?xg0*`PV`97dnuW^y|2)m9q!ETbnUGLX4j09@^J`JHau+a%TJ}wkj&ZcWUzY zu&!AuN*ixg-)7>`mm6kgNT#RH7ZJwC+@R<3jT7Rk;~ZLjoV4wbXa6=%Au3ES4Z>Py z{xTxV0A;)L^)&qFOQ?R^o$(r_x&AGnWPad|OzJ+)*Zv8ybdXW@bj%*#X@5$5l zn05{YU0fgev{yPG<68T!H=kWzc%P$cl~eOYsRzLSwBzIB7qQfaAl%p*=i*LsfWgX2 zOP^9utS>GO6=-BNG&JC=#X)=!IR!~MgT*U4TD@&&EHK*97(s`T)u=Y9)yUyT+L)Bw zTxuo;+1GWS^S3)v6B)67%)swlW8X8WrQ$Ngw$&3XexQ~DoS60PVrLf7 z@kp4$I!|U5pvMY&_<=np2XMWhx!h|E2%x!ji$@C3I|_*l2pog@Dm9^!q9RBO#SN?u zWEgJ(cBunkjrv~scN_2zY%#ySsxSg3Etw%J$jGeAUo|ev`!+$j`DNQBugiDc?FsL< z$mPwN;6VF<>}X-wu+y@3YUcw@e#?TDLk!$^bC6SJ?Iw&o-CsJ$afQ%b%)HI*q1gXY zYRB(Wyj>J-6!4^3$cDNKiXH#G(T(-_%cmg^`f>gIv?&!6n#-A6{rtp{J|$zN?9Ou# z(2+>Kn%^Ccdo=ttCh(@e`0i=IPLqBG6Rd4qGP--h{;sR2WvY~?8lqG!WIX_1)t}qA z)HbCJdM;e5yLwjzUpwG6-GQ`Z)%Sf-WQb>@m%}aB#bsyuW%S6Qq)b0*B9k~WaXKK8 zoXe?0U#0lI;*LFnQbkWtZRp{9gGX{$Q^d+PwPzB|(kv;j67inM{W-enqfPNeiJsNM zSNr(a=J!{3bTEm_8kTym8amc7kL6~)EHWr@MKrOr>ZFk4$3n`WO?k=Uif z=4^B=W3=6YtBal0eC<4B*;KSecg6vSRM3dQqLD14qPj16H-#V)1bNv>JV-LcseFm$ zv>p1ziI;ITazh$hz|m5o{NpnvnWp}t@J*_*wNa$2mapHmJ7gg!&uM$Uvv|JYS6dfm z7sks^k|bCF5WelUmB>B6IA$AAJbfyWqjWT2rhHW(oQ|1|1q?Fxe5?=cSt8zf`5=F;q*%}k_$83rcm2xPi3F1P5g z&GH|w^Kej7Qqm&5C%fRCx#n%zyy88lo2Q~jg^oZKe7HH9@ok!h{JvbOs5twC7Dx2Q z&L7L_kTd>WSd_P@NL75bNuP0NPZ)rN6u!{xh2!vEPj3xJaUUT$Q~nB(4DL==(@ELX$;D1 zC!He!JjGSu?ugxW-JReCoueDo8KeBuHX)vVq^^IfYC6|8wFY}WuFvKPC}0w0zFw(ud04&_(G<$E^IJuKBy)o z!LB!HkD%kn@NQWnAASNF(c`*NtG!XWjl*{v*TXPYf`P)(H!U-=VU#?_x|MK9tcK|G zE*Iy=47;gfZ&5gw(Z$Z0Voi0vU{&!uimcQ!_BFF%hiU!gxEN*&(Z$xp zP>TP_dH?+&xUbUE(w5|0Mx8Z-mG`MzRy%^@DPIs>(6@5`eIFvUA)D9Zvv)_;(0G+4bTX0SJXJDz(1G~>1x;fYyg=)UdUrs_(!C_|DvyqRGi z!*(=w|CN7bxHt>He%@d}0yR_QTu0LrvASaE$)~)FfiwCZcN28D6KMkm$4l9(dI|~( zb5BQQacjxrh`ls%==WkHVj8yW>PjdMn=QGFHsPU5mmE$C!9;RcK^!Rq6&5}M{iC`{ zSiq6qiV0pu-hao|<1+R00`?}|vZLGlDH%iU8LGLW37+xGyWG`hx&iL*SB)~|lYF~~ zoC~|cGtI zpQJyR31UCfmox;1d|m@wkFyu)AoNB=CklnEL1YV|G&BqX`aw8E(wo_Nm~Z#*ofa?C zp|SRVU0ZLngdAZLi`eA^z4i8h^|+|KpF_;LJtbIReJViyEg!6I8X{YQF^gr#(#k98 z0yrfAz%zndzMy7I6EA@62O@pRTZ)hGr(HGsn(0QlSxS@5*Y*Wkh`ZkV(y8g3&rE+@ z^n3P90GAi<)A){cF>t^Ete&K@wKOiku`Nqw9vk?yy~VH~i0f(517IYt$e$B!W`_eY zM|G3lcwem6^DzOhAmTh6U&8CJac^qj?aD5O1Jcesf~uz7CSXPTByLj`XQjNpX1NBt zgTMH~sU=2L2vv?>h$$GP1S!?SZB$UcL<}z}4}$xESL) zvg9EkwpwMl9)V4^qj8T)pmVz;1Zt+NbAL=^J-3esc7Jfnkt5-VQVHv^jCh5f|6yX< z-h^cc=VIeRXRz_-{aG&;{`;Rou6Hnl#Bp}LHD=fklj>dWMW+0Fc#RD$bBs(xBgp+i z3?sh_5mhDJ`?by$R2^5}t_0A2OI9N-)r-Jysjfk97(M^~0#o4OyDYI}Ddr#F=Z0j0 zuv>eFbZCmB#Z<#oUNUlW+h=OpU((EFKgY_EG#UBM@F)|mqHsX1Sn%(aFCa{YINuDy;rJX?~{{QpBkNTq^@j>9KD>xGUie}M>Rk40)4+A0i z?K?HQN2#GQzj~7CXVigjQV801+?f_Mmr8peanIok)4zQSX0R**nG?{y@Lxx;twpWZZ|&sd zu90YQ>|j*-S2k`}dyTx5#)I9MUkhcE*Z>8(_ z%pbwAB^T?jjjpCl>mF`wbuo3uK(XXzKGh`V>`C$dIxo0J#vp>dJiXZ)l9;JGt3G+tKf z@7FptWSJ@|HXW67kV{MAbnhEYSH@Gp>8suc0i`#dyK}q&juAzlN9K8`Do$)BRs#Ka zkwxJUAPzzqAnamnceU$5ek*v?>kKlo$;3jQ(a2zh3GWNOG*a>rkuq4Nrw zY^t-eupib93^=&b^P!I>D&ypcFNokQ!Ni!^ltEImCN8a@5( z_w@2-MRQY)9^pw3r0zs(|2?uEXLzUfb$1`^7e3n9TFV`p#DD+$wM^puCl!m{L>arI zKNd00cCUTTp+~xvR{cUBY=X^WPdxwhYD%;OZn5*7(mEQb$|wNn7_~h|)2pr(1tP6D zzciMnifv1e+|R%d7ORZ(46@NSS9ycg(wV-B%knsld=Yp$1OTQ!rhN#k-!y0~O+|7G zD@DWfrLDwWVgb=^@h(TBfPHNXd8I2~e_xpoVaBy8Qi^AVl}g!_?qa5P>+4AWX_{z> zh-h>@Tv$>v2Ktx+Md_|>cD22Ps)nBIRr}car!_!2Fx=t6L}VzF=PqYOe+JE=bS zM?_qkmXrqBR38J_`S*svbthOkA#iy9Q5CFI9$vK0U(*FNK~DV zf~nCA{0NavWHL-l;VcGTK{?c_j*0ee$$Sd}HSSat)y>rp$S|ofNMIQvXy;)xq%i<- zwv{EwkduVSkD=j%7z#0T(ls+)p5YDoOPuX(dfA}HDIdMSDpL@k`@6D_nhvA+M0s1F zv}|rGmotrumaJHLq|k6VVtdON_!0N|;$)s^iTsZ6ylUeTFPGSQgqt*Qd{7*W3Ww@mk?;AhdaNH5=OXQaHp{g*_X2H(Qec@KWBm zQTRH(q>@zJc0!S(8cMW&HWFHg4}`!oJgciqRJD+hbMr}|Jo9Gr)yk4~46kWj^W)ow zZ#y5jBg@OCW+OAIoCS&|wz^`UjF*Z=H}Y!%=zz*H!W9|c>}UeeW6W^bCgIps|zDCI%qqgI`d;H(vD1TCEm5BN+%&1s&E!0 z@^IcsCBzSpyL|~O{!G}#6rH(2&%h9byFc^(lmXz|n9!M+&zSBsJF9T@g&5nf@kUFz zBBRni$*$p5hTF8Iv7G7y^8Ehx+qUZ3qyg&Vim-EZ0*~f{DOP28d;b1n3p*1BRsA(?pS0BWwD^Ni(P5(J zO|l|{$cv|V__j@3(SV>hJl@?2#6^cix|^Y)=c{Q=s>B^iVi~`^ytT`c2(T?Cdx$U?B3o=N4wDOww~z7A05|p zVKWx$rX#>82JKshR~U(Gg$e0KN7L&hna$LKQkzON8B`}qBf*OAQ1NdJHgR11qR5=M zJ6P=8+&iRhW15KhJYUQZX7oGMzI9BeYI;%yBezTmql~_CI)X^9jWn^g&DIJvns{Tp zIT?-pIgj&uNooi!_F6GLtc_a|#B_0y1Abpro11QOb8>$+Yzp4^SmqdISf|&vQ7}-t zS&ftlOCgp>PN2G)S+}c?KVWIx-5}hp4(i!h!F*zQi$AqB0lMp#i@sZQ7GDOMzAeeq zpK04(?n#5JT~^ov{hOS86X7@|W0jV(=F*Hdj0`!{qH8;)I<`jW4jZCt=rvA4&tSg?ab{^A{fjsvCxWi*-yjt!>}*|=_9$S%&g3jLsCZoc%6NVMVEv#lrkY## z5yu?OzhlKDtzjoH(CB*_6B*lsfL2ez=b0k^DgsN4TBK@RaQ` zni|_j7}oGJ{V?9kCF0WyLrA{~{~@*&P5pSd+-Z+$!ud(^?q zW9p?kR|{$xi7QHC$?WqvK+ykf5U23P(rmF(mcO*p`PBu^EQiZOL3(;Ab}lT;_Q zeG}rLjF$mwBY-R4>GI$v#Wn#u18MWgXX(A?2Z6VGc*L%)qwq`9#Tg*kyIvcr4&Q> z>3+o3-iwHB3A35NIV#9`QqI&yf*t>+al|cS?lpQ9kAB(OeSPp-P!P~*@NLE3zKGj}5YpbFl{hZ1sjS@5JiUxJ(mgKBs}ooS;$ zdOV$0I6~r_?U2d}NV1MdlIfOxbWgWGt>Yq!Py)+N(~7wL$j{2k3e>Rixz0>~oc-Aj z_-S&EE0JjRe0h1<%G!G4q^{ps==Shv?(rKcCr2mmOeh;^PN62^D;Qh#>z60H-r`j= ze~=Y+lJy{??#j2%b^)K-3bJipnsNHB6mW z*z+f6FLf7QPB!u5969>P96DU;t`y3$owo;6;oT?8qp1?3%NWFcI&kYC;2vNg`UnT` z`VSB2|F}dXD8G2oX(@alup|A5xj?y?krYdo7%NZP-oX~?h;fwo$hm;jxKsPWHtIhO zv%FJh?(*7NR=Aikl-NPy#_ljr^F?lV67IjnejiOwPp7b??s}Zjam2ppoyohpysYb< zput7{kvDVcJMnGtJZ#maeX@ zv9Ym=P(kE3yeNq)GdN6kp`?CmLp4Y~<;`R;|D0e{t*CGJKgFC~Ktlt?0Y#=u`Cpcg zxR||FS62tG1*01kp<$j*4TlT0Q{tbxW?%Z>21^R}zpWK0EyCNFt*Lzczq+K)$!6m^ zvDuGqv{~Q~{a17M3bFqeO+E~!U!cuy_L3Sj2)qNc4PC2jg4*FwvCN#+qP}nwr$<~-?#3U`}tO#sxxP*r+TJO z_e}S%dqQNS{vyC)!2$pP1W^$|IRF4u4*&r9fCl~U0iFl9e!swt`6T%OfSM?{cU_3@ z@81qWDh~42Mh?!pc7^~IB?2cyJ9|@WD*`4OdK!9a208{tI%WozAV!r%0Du4>D#)kc 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